Nua Engine consists of a DirectX 11 deferred renderer and my own game framework. The engine has support for creating chunk-based tessellated terrains as well as frustum culling which is carried out in compute shaders. The terrain also renders animated grass at 2 LODs, with each blade of grass having its own geometry and bounding box.
The renderer has a post processing pipeline with effects such as bloom, chromatic aberration, gamma correction and more. Two standout post process effects of this renderer are screen space ambient occlusion (SSAO) and temporal anti-aliasing (TAA).
SSAO approximates occlusion from ambient light at each pixel by sampling random points around a hemisphere in the direction of the pixel’s normal vector. The less points the pixel can see, the less light it’s likely to receive and therefore it is in shadow.
No SSAO
With SSAO
TAA uses camera jitter and pixel data from previous frames to estimate MSAA, whilst staying computationally cheap by gathering its samples over multiple frames. Read more about my implementation here.
TAA with increasing methods of reducing ghosting artifacts
No TAA vs. TAA
The game framework contains a resource manager which ensures resources such as models, textures and shaders are not loaded more than once. In addition, once a resource is no longer needed, the resource manager automatically handles releasing the resource.
Shader loading was implemented with a templated LoadShader<>() function, which takes a shader type as the template as well as the file path as an argument. This function then compiles the shader with the correct parameters and stores it in the resource manager.
Being a deferred renderer, Nua Engine is very efficient at rendering scenes with a large number of lights.
Nua Engine uses ImGui for handling menus to control game objects in the world, as well as allowing the user to update post process settings.