Against my better judgment, I though I would post my paper and demo here you you guys to tear apart.
This is a deferred lighting approach that simply assigns each light a unique index and then stores this index at each fragment the light hits, rather than storing all the light or material properties per fragment. These indexes can then be used in a fragment shader to lookup into a lighting properties table for data to light the fragment.
This technique can be broken down into three basic render passes:
1) Render depth only pre-pass
2) Disable depth writes (depth testing only) and render light volumes into a light index texture.
Standard deferred lighting / shadow volume techniques can be used to find what fragments
are hit by each light volume.
3) Render geometry using standard forward rendering – lighting is done using the light index
texture to access lighting properties in each shader.
What this achieves is the main advantages of deferred rendering (complex light object scene interactions) with ways around the disadvantages (fat buffer sizes, MSAA and transparency issues)
This technique has a obvious down side of limiting the number of lights that can hit a fragment - but this can be easily managed in a game editor context.
However, I think artists would prefer to have as many non-shadowing lights as they want and deal with overlap issues than the current situation of X lights per object and having to break up objects into small pieces.
Read the full paper here:
http://lightindexed-deferredrender.googlecode.com/files/LightIndexedDeferredLighting1.1.pdf
If you have an Nvidia card you can get the demo here:
http://lightindexed-deferredrender.googlecode.com/files/LightIndexedDeferredRendering1.0.zip
This is a deferred lighting approach that simply assigns each light a unique index and then stores this index at each fragment the light hits, rather than storing all the light or material properties per fragment. These indexes can then be used in a fragment shader to lookup into a lighting properties table for data to light the fragment.
This technique can be broken down into three basic render passes:
1) Render depth only pre-pass
2) Disable depth writes (depth testing only) and render light volumes into a light index texture.
Standard deferred lighting / shadow volume techniques can be used to find what fragments
are hit by each light volume.
3) Render geometry using standard forward rendering – lighting is done using the light index
texture to access lighting properties in each shader.
What this achieves is the main advantages of deferred rendering (complex light object scene interactions) with ways around the disadvantages (fat buffer sizes, MSAA and transparency issues)
This technique has a obvious down side of limiting the number of lights that can hit a fragment - but this can be easily managed in a game editor context.
However, I think artists would prefer to have as many non-shadowing lights as they want and deal with overlap issues than the current situation of X lights per object and having to break up objects into small pieces.
Read the full paper here:
http://lightindexed-deferredrender.googlecode.com/files/LightIndexedDeferredLighting1.1.pdf
If you have an Nvidia card you can get the demo here:
http://lightindexed-deferredrender.googlecode.com/files/LightIndexedDeferredRendering1.0.zip