Darryl Gouder's portfolio

A Final Gathering Technique for Rasterisation


In this project we examined several rendering algorithms such as Whitted, Path Tracing, Irradiance Caching, Instant Global Illumination and Instant Caching and proposed a novel technique called the Instant Irradiance Cache that calculated a set of pre-computed point's diffuse interreflections using Distributed Rendering and Virtual Point Lights, storing the results in a cache and using interpolation to shade nearby points.


The pre-computed points were predetermined using a technique proposed by Jacco Bikker in a paper titled “A Precalculated Point Set for Caching Shading Information “. In this paper he illustrates a technique that uses Poisson Disk Sampling and Ambient Occlusion. These points are stored in a data structure, in our case a hashmap and the diffuse interreflections were calculated using Virtual Point Lights - the method proposed by Keller's Instant Radiosity and IGI paper. This cache was then used to compute the rest of the indirect diffuse lighting of the rest of the scene as is done in Irradiance caching. Our interpolation method used Debattista et al’s weighting scheme method in their paper Instant Caching for Interactive Global Illumination. Our second addition was replacing the scene intersection technique when calculating the VPL contribution. We propose a technique whereby we create a small voxel grid where each voxel contains a floating point value which indicates the probability of occlusion in that cell. This accumulated values from the ray origin voxel to the primitive voxel location would dampen the contribution of the VPL. The ray marching algorithm was based on the DDA algorithm proposed by Amanitides and Woo (Link to paper).


By using different grid sizes we obtained some interesting results. One advantage of our algorithm is that it is scene based rather than screen based such as IGI. Animation was mentioned by Debattista et al as they discuss temporal incoherence for animation, however this was not implemented in our project. My implementation was pure C++ and the renderer ran in parallel using boost threads. It was built as an extension for the existing Illumina PRT – a Physically Based Renderer authored by my supervisor and co-supervisor at the time. These are some of my timings below using different grid sizes. When compared to other algorithms, the speed gain was quite large.

  • IC : Irradiance Cache
  • IGI : Instant Global Illumination
  • IIC : Instant Irradiance Cache. The beta signifies the size of the voxel grid.

Final Remarks

I was supervised by Dr. Keith Bugeja and Dr. Sandro Spina. This is the final report submitted for grading, where I earned a 'B' for my work.

More Images

Sponza path traced.

Sponza rendered using IGI.

Sponza rendered using the Instant Irradiance Cache with the Voxel Grid and full scaling factor.

Sponza rendered using the Instant Irradiance Cache without the Voxel Grid.

Visual difference predictor between the IIC using full SF and Voxel Grid and IGI renders. The blue areas are the areas where there is no visual difference. The green is mild visual difference and the red is large visual difference.