Jump to content

  • Log In with Google      Sign In   
  • Create Account

eduardo_costa

Member Since 18 Jun 2013
Offline Last Active Sep 21 2014 02:16 PM

#5164803 I want to be a game developer.....so what should I so ?

Posted by eduardo_costa on 04 July 2014 - 04:59 PM

There are different paths.

- Work in a game company
 - Good to learn the workflow
 - Get experience and make mistakes
 - Choose one of the 3 majors:
  - Programming
   - Computer Science courses helps a lot
   - C# + Unity3D (good starting point w/ lots of tutorials and examples)
   - Javascript + Canvas2D (also lots of examples in the web)
   - Actionscript3 (Flash editor also offers a good ambient)
  - Game Design
   - Books
   - Self Experience = Play Games a lot
   - Tutorials and Post-mortem docs from AAA games
  - Art
   - Also another major that needs extensive training and education
   - 2D (Photoshop, Vector based editors,...)
   - 3D (Maya, 3D Studio Max, Blender)


- Make your own game
 - Programming
  - Unity3D (fastest way to see code to result)
 - Game Design
  - Self Study and Learn by example
 - Art
  - 2D (faster do create and less complex than 3D)
    - Photoshop / Vector Art

 - Best Practice = Work in a team
  - Really hard to handle all stuff alone





#5124303 GameEngine from start to finish(DevLog)

Posted by eduardo_costa on 16 January 2014 - 11:07 PM

As a fellow EngineEngineer (I'm doing one but WebGL in HaXe language) here are some cents.

 

If you're focusing in the end-user you should try C#, as you said the perfomance will not be an issue (look at Unity3d), simple and frequent operations like sorting, delegates, get/set methods and other hi-level stuff done in 1 C# line will help a lot.

 

Just wrap OGL stuff in a static class and you are free to create a higher-level class library that make the calls organized and the GC is a good friend too.

In terms of class modelling I found Unity's way really awesome (Entity-Component based), you have a container (Entity) and Components are attached to it, after that, only destroying it will remove it (it is nice to avoid lost references).

 

I have a 'Object' like class (Resource) which contains useful stuff like unique-id, name string, ... which I register in a global Resource list, useful to simply destroy everything after a scene changes or globally search any stuff based on type or name (Reflection is another awesome feature of C#).

 

I organize stuff in scenes wich is basically a XML [dependecies + hierarchy] that create stuff in RAM/GPU memory and also creates the entities in 3d space with its components + reference to the loaded dependencies. When a new scene is called, destroy everything and restart the process.

 

About OpenGL, I suggest also following Unity's footsteps. Working with the concept of Renderer + Material, I reached a way to sort the rendering stuff based on properties of both elements and then optimizing stuff and fitting RenderTarget operations (E.g. ImageEffects) more easily in the pipeline.

 

Lastly, I will reveal the feature that took most of my time in the 6 months of development. The Collada Loader adapted to correctly load Bones and Animations. It was a real pain. Also the Skinning technique was hard to make it work efficiently in the GPU mode.

 

Nice post! Keep in touch!

 

**Edit**

 

Also create a static class to draw any kind of gizmo on top of everything (lines, wirespheres,wirecube,...) it will help a lot to debug hard stuff (skinning)




#5120956 Best Place to learn 3D Computer Graphics?

Posted by eduardo_costa on 03 January 2014 - 12:43 PM

http://http.developer.nvidia.com/CgTutorial/cg_tutorial_chapter01.html

 

Ignore the assembler-like shader stuff. The rest of this online book shows in detail the main parts of a graphics pipeline.

This is core Computer Graphics stuff.




#5119940 Advice to lock frame rate

Posted by eduardo_costa on 29 December 2013 - 08:07 PM

On any platform you could control the rate of update and render with this simple algorithm

 

float dt; //delta time in seconds

float clock; //last time sample in seconds

float render_timer; //time control for rendering

 

dt = 0.0;

render_timer = 0.0; //init the render timer

clock = getTime(); //API callback to get the current time in seconds

 

while(true) //game loop

{

   dt = getTime() - clock; //get the current delta time for this frame

   clock = getTime(); //updates the clock to check the next delta time

 

   update(); //update stuff;

 

   if(render_timer >= (1.0f/60.0f)) //checks if the frame is ready to render

   {

      render(); //render your stuff

      render_timer -= (1.0f/60.0f); //do not set to zero, remove the accumulated frame time to avoid skipping

   }

 

   render_time += dt; //updates the render timer

 

}




#5115767 Recreate GPU Pipeline at CPU Level

Posted by eduardo_costa on 09 December 2013 - 06:10 PM

You can try this simple pipeline

 

unsigned char[] buffer; //screen buffer

 

float[] vertex; //3d space vertexes

 

float view_matrix[16]; //search for 'LookAt' matrix to learn how to create one

 

float projection_matrix[16]; //search for frustum matrix and then perspective matrix (they are related)

 

int width;

 

int height;

 

buffer = new unsigned char[width * height * 3] //RGB 8bit per channel buffer;

 

vertex = new float[4 * 3]; //3 XYZW Points to draw a simple triangle; w == homogeneous coord slot (check the projection matrixes part)

 

view_matrix = LookAt(eye, at, up);

 

projection_matrix = Perspective(fov,aspect,near,far); //Inside it, normally you can found a Frustum(left,right,top,bottom,near,far) call

 

foreach(point in vertex)

{

    point.w = 1.0f;

    if(!has_vertex_shader)

    {

      point = Multiply(view_matrix,point);

      point = Multiply(projection_matrix,point); 

    }

    else point = VertexShader(point);

  point /= point.w; //'w' will be different than 1.0 depending on the point position between 'near' and 'far'

  point.x = ((point.x + 1.0f) * 0.5f) * width; //2d screen space point

  point.y = ((point.y + 1.0f) * 0.5f) * height; //2d screen space point

}

 

foreach(triangle in vertex) //iterate the topology you defined

{

    Bresenhan(buffer,triangle); //Use Bresenhan Triangle raster algorithm to fill the buffer

    //Foreach pixel do be painted call 'pixel = PixelShader(pixel)';

}

 

Flush(buffer); //Sends the buffer to the API graphics buffer (you could use a glTexImage2D for instance)

 

Starting from this you gonna check optimizations and where to fit your pseudo-shader calls also there is the DepthBuffer theory and so on.

Have fun!




#5091074 Game engine as a portfolio project

Posted by eduardo_costa on 02 September 2013 - 10:59 AM

I think a good engine is something that allow someone not that skilled in  programming to make a good game/software really easily.

And also that make it easy to a non-programmer (artist) to integrate their content into the software.

 

I am now also striving to do my own engine, but in HTML5 / WebGL / JS. Why? Because C/C++ is pratically taken by Unity, Unreal and CryEngine. Also you forcefully need to use the best algorithms and patterns to speedup stuff, so it is a good challenge. For what I experienced now, I think what is obligatory to offer a good starting point is:

 

- Wrap Graphics calls so the user do not need to manage them (he do not  need to manage buffer ids, pointers, shader compilation,...)

  - So create "Mesh" "Texture2D" "Shader" "Material" and classes that handle this stuff for him.

  - The ideal pattern would be the user creating a Camera and the object and it would be already in the screen.

- Offer Initialization, Update, PhysicsUpdate (constant delta time), Destroy callbacks with a set of usefull data at the user hand;

- Handle creation and destruction of stuff so the user can avoid pointer handling.

  - Useful data == Time.deltaTime, Input.GetKey(...), Time.elapsed, Time.physicsDeltaTime, ...

- Mesh loading from popular formats (Collada == XML wich is more easy) or FBX wich is more complex but can embed mesh and texture data.

- Animations (Skining / Bones) curve based interpolation of data.

- Physics, you can plug PhysX using C/C++ or C#. I will not even tell you to do one because it is an engine on its own.

  - But at least should have rigidbodies, collisions with/without real interaction, raycasting, ...

- Sound (we tend to forget that)

- Post Processing effects (put your render in a buffer and render again in a plane to apply Image Effects like blur)

 

So never forget that an engine isn't just about rendering. It can cover from low-level to hi-level stuff.

You should cover the Core (initialization, update, render, destroy), Rendering, Sound, Physics, Resouces (Mesh, Texture, ...) sections very well to make it easy to use.




#5070977 Next Logical Step in Study

Posted by eduardo_costa on 18 June 2013 - 05:26 PM

In my opinion would be.

 

1) Learn the basics of the desired language.

a) logic

b) if/else

c) loops

d) data types

e) basic algorithms

 

2) Begin a basic contact with some Graphic Library (OpenGL or DirectX)

- Not too deep.

- Enough to have a simple flow:

Initialize();

Loop()

{

  Update();

  Draw();

}

Destroy();

 

3) Eat, Breath, See, Hear Math

- Algebra.

- Physics.

- Matrices.

- Linear Algebra.

- Combinatorics.

- All stuff from 2D to 3D.

- This is forever.

 

4) Now you know some Math and have the basic game loop.

- Start with 2D rendering stuff.

- Re-create basic games. (Turn-based ones are easy to control each step).

- Re-create medium level games (Little physics like that game where two cannons need to hit each other).

 

5) For learning sake try to re-invent the wheel some times. Learn by failing to make something good.

 

6) Pile up experience and try new things. Return to the starting point and refine with harder things.

1) Programming - Go to Threads, Network, AI, Templates<T>, Good OO ...

2) Graphics - Shaders, More complex Game Engine (you can split the callbacks in lots of categories for Input, Multi-Thread-Render, different layers of render, input detection, and so on.

3) Math - THIS IS FOREVER

4) Re-Create more difficult stuff with the new knowledge the steps 1-2-3 gave to you.

 

7) When more confident. Get a job in this area or start a real-life project.

 

8) Repeat forever.

 

 

  

  

 

 

 




PARTNERS