Hi all,
I thought I might share with you all the latest progress of my voxel cone tracing engine, implemented in OpenGL 4.3 and based on Alex Nankervis' voxel cone tracing method (http://www.geeks3d.com/20121214/voxel-cone-tracing-global-illumination-in-opengl-4-3/) - except, I have built on that by creating my own engine from scratch and implementing a number of things differently.
Here are a number of screenshots to show my results so far - of course there are many things that need to be improved, which you will notice a number of artifacts that exist in my test engine:
Basic scene with cone-traced soft-shadows, specular reflections, as well as light specular:
[attachment=13661:gibox0.jpg][attachment=13662:gibox1.jpg]
Single-bounce gi vs "unlimited" multi-bounce gi (unlimited in quotes being that the intensity of each subsequent bounce converges towards zero):
[attachment=13663:gibox2-1.jpg][attachment=13664:gibox2.jpg]
First voxelization of scene (done only in first frame) and then the revoxelization loop of the scene after cone tracing for "unlimited" bounces:
[attachment=13665:gibox2-2.jpg][attachment=13666:gibox2-3.jpg]
Just showing off the quality of the specular reflections:
[attachment=13667:gibox3.jpg][attachment=13668:gibox4.jpg]
and finally...
Single-bounce emissive vs multi-bounce emissive ([edit] I made a mistake here where I accidentally had the green wall outside of the scene volume, thus it was not correctly lit, which is why there is no color bleeding). The last image shows that there is a major problem with the revoxelization of the emissive scene (which leads to flickering artifacts - I guess this may not be a problem in a real game because it can add an effect of flickering lights):
[attachment=13669:giboxemissive1.jpg][attachment=13670:giboxemissive0.jpg][attachment=13671:giboxemissive2.jpg]
To give you guys an idea of the scale of this scene, here are the specs:
- 64x64x64 voxels for the entire scene
- Runs at around 30-35fps on 1024x768 on my gtx485m i7 2720qm with 8gb ram Windows 7 64-bit. Drops to about 23fps if I get close to the Buddha model.
- 64-bit OpenGL 4.3
- 1 3D texture using dominant axis voxelization (plus a second 3D texture for image atomic average operations which reduces flickering artifacts significantly - but doesn't eliminate them).
- (4 diffuse cones traced + 1 specular cone traced + 1 shadow cone traced in direction of light) x 2 (2nd time for revoxelization to achieve "unlimited" multiple bounces).
- Buddha model is the most costly object, with over 500,000 vertices.
- I also apply the lighting and shadows prior to voxelization (and it is applied in each pass). Until someone comes up with a convincing explanation, I don't see any advantage to splatting light into the 3D texture (which is not as accurate) after voxelization from a lightmap texture that has world position information in it.
Things that I need to improve (hopefully I can get some advice from this community):
- If you notice the specular reflection under the red box - part of it is missing which I think is caused by some opacity problem during cone trace of the base mip level:
[attachment=13672:gibox0-1.jpg][attachment=13673:gibox0-2.jpg]
- You would have noticed that the soft shadows are very voxelized and have holes in them - again, some opacity issue that might be related to the red box specular reflection problem. What I had to do was to increase the step size of just the initial cone trace step because originally, the shadow cone tracing was producing the self-shadowing artifacts as shown in the second image, even though the smaller step size produced more accurate shadows without holes in them:
[attachment=13675:giboxshadows3.jpg][attachment=13676:giboxshadows4.jpg]
- In the images above of the emissive test, emissive objects really bring out the incorrect filtering, because I believe I am using 2x2x2 bricks during the mip-mapping process. Another explanation could be that i am not distributing my four diffuse cones evenly enough.
- In some cases, activating multiple bounces actually makes the lighting look worse than a single-bounce due to the scene progressively reducing in intensity for each bounce. However, I think I can address this by turning up the intensity of the direct lighting in each bounce pass.
- I need to implement an octree structure using 3x3x3 bricks.
- I will probably implement some sort of performance debugging which shows the cost in ms of each action.