Global Illumination Project
Indirect light from red walls bouncing onto a white cube
I first began work on my global illumination project in June 2011 researching different global illumination algorithms and techniques and deciding which I would implement, after much research and consideration I decided to implement a type of irradiance volumes technique presented by ATI and used their demo as a guideline. The ATI demo can be found here: http://developer.amd.com/sdks/radeon/pages/RadeonSDKSamplesDocuments.aspx#d3d10
The basic algorithm of my project is to render the scene into light probes which are placed on a grid within the scene, the probes are then converted to spherical harmonic(SH) coefficients and rendered as points into a 3D volume texture to represent the whole lighting environment. The scene is then rendered normally and indirect lighting is computed by performing a dot-product of the probe coefficients and coefficients of a pre-computed light transfer function. The light probes are essentially cubemaps but all probe textures are stored in one large texture array (rather than individual cubemap textures), storing them like this allows the project to take full advantage of the geometry shader's ability to render to multiple slices of a texture array and renders to multiple probes with a single draw call.
As well as being able to render indirect illumination I wanted my project to be able to render realistic shadows, I began with implementing a cube shadow mapping technique from scratch, this allowed point light sources to cause shadows. I then wanted the shadowing to be a lot softer and more like actual real-life shadows, so I chose to implement a technique presented by Nvidia called percentage closer soft shadows (PCSS). The only problem with this was I couldn't find a method of implementing PCSS with a cube shadow map, it was mainly because of this reason that I went on to add dual-paraboloid shadow mapping to my project, this form of shadow mapping only uses two textures for point light sources and I was able to implement the PCSS technique with it.
Currently I'm implementing a spatial partitioning scheme to allow me to use more than one set of light probes, the idea is that the scene will have two rooms and a set of light probes for each room, only one set of light probes will be rendered to depending on the position of the primary light source.
I'm also adding a simple GPU particle system to the scene, the particles will represent small dust particles and will be able to emphasise the indirect light.