Saturday, November 17, 2007

Terrain rendering

This is an early preview of the terrain rendering engine. It's using a heightmap generated from Terragen which is then imported as a grey scale bitmap. The program is rendering the mesh without any material textures but does use a precalculated ambient map.

The ambient light map is calculated by using a ray-casting algorithm to estimate the angle of the horizon at various angles for each vertex on the height field. Using these angle values, an approximation of the sky lighting contribution can be made.

The next step for lighting is to calculate the sun contribution. Using the same ray-casting algorithm the angle of the horizon will be stored in a horizon map. This can then be compared with the angle of the sun to determine if a point is in shadow or in direct sun light. The added benefit of using a horizon map is that the angle of the sun can be changed with light and shadow being generated dynamically, so different times of day can be simulated.

Pixel shaders are going to be used to incorporate the lighting and materials. I hope to also support bump mapping to give the terrain a more rough 'feel' to it.

Change of project direction

After some careful consideration and weighing up the advantages and disadvantages, I have decided to change the project so it will no longer be a Java applet embedded in a webpage, and will instead be an offline application that can be downloaded and played single player or multiplayer, internet or LAN. The game will now be written in C++ and use OpenGL for the graphics rendering.

The main reason for this change is that I was finding Java to be quite a limitation and although this was pushing me to write well optimised code, I was unhappy with the quality of the graphics. Graphics is certainly the strongest aspect of my programming skills and it would seem a shame to limit myself so much in this area of the game. The game will now feature a fully 3-D environment making use of available graphics hardware. Lighting and effects will be used by writing custom vertex and pixel shaders.

The game will still remain cross platform, and will be released for Windows, Mac OS X and Linux. I will be using the SDL library to handle input, sound, window management so the porting to other platforms should be fairly trivial.