Specialization project during 7 weeks where I could choose to make a project of my liking. I decided to implement a real-time global illumination solution called Voxel Cone Tracing (VCT).
During a specialization course at The Game Assembly, I wanted to learn more about graphics programming and global illumination is a very hot topic these days so seemed really fitting to try to implement it. I choose a technique called Voxel Cone Tracing with DirectX 11 as the rendering API. The reason why on this specific technique is that it gives very high quality results and seemed like a good challenge for me to learn.
Below are the features my implementation supports.
Multiple Light Bounces
Real light bounces around the world before it hits our eyes. VCT also supports this feature. Here we see 1 to 4 bounces.
One big thing of VCT is the specular reflections. It is not a perfect mirror representation of the world but instead of the voxelized meshes. Yet the result can be sharp or blurry depending on the angle of the cone, giving it a highly believable result.
Cone Traced Soft Shadows
With the help of the voxel textures, it is easy to cone trace to get shadows. Depending on the angle of the cone, the shadow can either be soft or hard.
Real-time Voxelization of Dynamic Meshes
One of the reasons for this technique is that it can easily support dynamic objects. The frame rate drop in the video on the right is due to the voxel debug renderer is not optimal. But it shows the principle of it.
Emissive Textures Adding Light to the Scene
Support for emissive textures super simple in VCT. Just output the emissive into the radiance texture and continue with the light bounce accumulation.
The problem with traditional Voxel Cone Tracing is that it takes up a lot of texture memory to cover a large area. The Tomorrow Children made by Q-Games solved this by using cascades, similar to cascaded shadow mapping. I saw this and found it easy to implement into my own solution. On the right, we have to pictures from RoboReboot, a game that I worked on with 10 other people. Compared to the images above, the cascaded version is able to have a much larger area it can illuminate.
Even though the time constraints were very tight and a lot of fiddling with DirectX, I did manage to get a result I’m happy with. Something that I would like to look into the future would be anisotropic voxel textures for better quality and less colour bleeding.
Another thing that would be interesting to look at is to using the voxels to check collision for GPU particles. Considering the voxels is in world space it would give representation compared to screen space techniques.