Realtime volumetric rendering
I wrote my master’s thesis on realtime volumetric rendering.
It covers general computer graphics concepts related to transparency, the physics of participating mediums, and the implementation of some classic algorithms. It also presents an original volumetric rendering algorithm, implemented in an home made Vulkan application.
The paper is written in French. Feel free to contact me if you’d like more information about it.
State of art
As a starting point, I implemented some classic rendering techniques such as analytic height or Henyey-Greenstein BRDF model. Those were implemented in Unity.
Voxel based volumetric rendering, Henyey-Greenstein BRDF implementation:
The idea behind this was to combine 2D sprite based rendering of a particle system with “real” volumetric rendering of a 3D shape, to benefit from texture’s details and realistic lighting.
Particles are rendered as billboard, and don’t need to be sorted. Transmittance, closest and farthest distances are stored in a rendertargets. Those informations are used to raymarch the lighting, using very few steps.
Particles rasterized into a 3D volume grid
I also integrated a custom volumetric renderer for PopcornFX particle systems, into Unity. Particles are “3D-rasterized” using a compute shader into a frustum aligned grid. The grid is then raymarched for volume and/or surface.
Modern engines usually integrate similar techniques. The rasterization step scales linearly with particle count. The rendering step has a constant overheat for a fixed size 3D grid.
This gave surprisingly good results, visually and performance-wise.