The first thing to do is to store direct lighting into a 3D texture, through a voxelisation of the scene.
The we generate mipmaps for this 3D texture, to simulate propagation of the direct lighting.
Once this is done, we “trace” cones in an hemisphere, oriented along the normal of each pixel we’re processing.
The goal is to cover the hemisphere with those cones, in order to retrieve the indirect lighting received by this pixel.
We trace several cones for the diffuse part of lighting, and an additional thin cone, which orientation is determined by the viewer position, to compute the specular reflection.
Here are the results in Castor3D: