This is the code for my master's thesis on real-time dynamic global illumination using the many-lights approach. The thesis itself can be found here: https://github.com/karyon/masterthesis, including a compiled pdf.
The following techniques have been implemented:
- Reflective Shadow Maps. They are rendered via the normal g-buffer shaders (model.vert, model.frag) and regularly sampled in vpl_processor.comp
- Imperfect Shadow Maps. The scene is converted to points with tessellation shaders (ism.tesc, ism.tese) and then rendered either via splatting (ism.geom, ism.frag) or as single pixels via a compute shader (ism.geom, ism.comp). In case of the single-pixel renderer, a pull-push postprocossing is applied (pull.comp, push.comp).
- Interleaved Sampling. This has been integrated into the final gathering shader. (final_gathering.comp). No buffers are split and re-interleaved; the result is pretty efficient.
- Clustered Deferred Shading. Implemented in two compute shader passes (clustering.comp, light_lists.comp). Turned out to have too much overhead in the contex of many-light methods.
- Tiled Deferred Shading. Integrated into the final gathering shader (final_gathering.comp, this is in a separate branch) and a clear performance win in all test cases.
For a more thorough documentation see the implementation chapter in the thesis.
The end result is pretty fast (<10ms for a complete frame, 6ms for the global illumination part, on a GTX 980), but the indirect shadows are of rather poor quality and are not temporally coherent, i.e. it flickers when lights or geometry moves. Again, for a more detailed analysis see the results chapter in the thesis.
Sorry :(
- Assimp 3.3.1
- glbinding @ 72fae95f8939a5c253faf57bebd0915a105bc511
- glkernel @ 5518736f5c701bdc7d5ff230840ba87ebec97bc8
- glm 0.9.7.4
- globjects @ 33bdd04396ab3a4b9270a9d944ef170ce7e96adc
- gloperate (my fork) @ 6d2ae8ec46e44660fccb4f4fe32f1212c0b9550b
- libzeug @ 52f7a419396653a3dd05a5a43231af59d9b5051c
- Qt 5.6