忙碌了好几天终于把deffered lighting做出了个雏形。其实关键就是局部灯光范围的检测。这里我是通过depth fail test和读写stencil value 来实现的。以下是每一步的截图:
这幅图是将场景物体的法向量渲染到第一个render target texture的RGB值
这幅图是将场景物体的projection depth渲染到第一个render target texture的Alpha值
这幅图是将场景物体的diffuse color渲染到第二个render target texture的RGB值,如果有specular color的话可以写到alpha值
之后就开始利用之前的两幅场景信息的texture来计算光照了,可以将之前的diffuse texture看做四边形渲染到back buffer,depth信息通过VS_Depth写入。normal 信息用于光照的计算。
下面这幅图是global ambiant light 和global directional light的效果图
这幅图保留了局部灯光的模型,除了全局的灯光,另外添加了4个local point lights 和4个local cone lights。将这些光照模型渲染到back buffer,关闭读写颜色和深度。做depth fail测试和写stencil buffer. 之后再读取back buffer,检测stencil buffer的值,如果大于一说明此像素受到光照影响并添加光照计算。
这幅则是最终的结果图
Reference:
[1] ShaderX2
[3] http://en.wikipedia.org/wiki/Deferred_shading
[4] http://http.developer.nvidia.com/GPUGems2/gpugems2_chapter09.html
[5] http://www.gamerendering.com/2008/11/01/deferred-lightning/
[6] http://www.ogre3d.org/tikiwiki/tiki-index.php?page=Deferred+Shading
[7] http://ftp.ambility.com/DeferredShading.pdf
[8] http://www.guerrilla-games.com/publications/dr_kz2_rsx_dev07.pdf
[9] http://developer.download.nvidia.com/assets/gamedev/docs/6800_Leagues_Deferred_Shading.pdf