My final lab course at university in 2010 consisted of implementing the I3D paper “Cascaded Light Propagation Volumes for Real-Time Indirect Illumination”, which describes an lighting algorithm that is being used in Crytek’s CryEngine 3.
The algorithm approximates Global Illumination by rendering light into a reflective shadow map, injecting it into a 3d volume (using a spherical harmonics representation) and propagating the light flux inside this volume (hence the name of the algorithm). It also takes occlusion into account as possible extension.
The whole algorithm is physically motivated but uses many approximations to be more efficient. The paper also contains a few errors and doesn’t explain everything needed to implement the algorithm (like eg the solid angles of the side faces), so I’ve written two documents detailing fixes for the mistakes I’ve found and the additional calculations I’ve performed.
You can find the errata here (including suggested corrections) and the full annotations document here.
The whole prototype (including my code licensed under the FreeBSD license and the media files) can be download here - it’s 68 MB big and has been compressed with 7zip with a compression mode that is not be supported by WinZIP. I’ve updated it to be a Visual Studio 2012 project. The Sponza model is from Crytek, too. You can download the original model and textures here.
The project uses DirectX 10.1 and by default it won’t run in DirectX 10, because it uses the BGRA texture format that has been deprecated in DirectX 10 but is supported again in 10.1.
I have not implemented cascaded LPVs, only use one light/RSM and only inject its depth into the occlusion volume due to time constraints, but the results already look convincing.