1. Realtime lighting 常用方法
在游戏中的实时光照,一般有三种常用的办法,
1) Single-pass, multi-light(一遍渲染多个光源).
For Each Object:
Render object, apply all lighting in one shader.
在Single-Pass光照方法中,所有光照运算都在一个shader中进行。但一个shader有指令数量的限制,所以这个技术只适用于光源数量较少的情况。在某些游戏中,只需要少量光源,例如室外白天场景,这就是个较好的选择。这个技术的缺点是不能支持光源数量较多的情况.
2) Multi-pass, multi-light(多遍渲染多光源).
For Each Light:
For Each Object Affected By Light:
framebuffer += brdf( object, light )
这种方法物体光照的计算只在当前光源shader中进行。这会导致非常高的batch数量(调用Draw的次数),最坏的情况会达到光源数量乘以物体数量。某些操作会重复多次,例如顶点的转换。
3) Deferred Shading(延迟渲染)
For Each Object:
Render lighting properties to “G-buffer”
For Each Light:
framebuffer += brdf( G-buffer, light )
首先,所有物体在不进行光照运算的情况下被绘制,然后对每个像素生成一组数据,这些数据包括位置、法线、高光颜色等,统一称之为G-buffer。之后,将每 个光源以一个2D后期处理的方式(渲染屏幕大小的一个四边形)施加到最终图像上,这个过程使用的数据是在上一个pass中生成的G-buffer。
2.Deferred Shading
1) G-Buffer
Deferred shading第一遍渲染所有物体,生成G-buffer,其中G-buffer一般包含如下信息:
· Position, 每个像素的位置在进行光照计算的时候是必须的,我们也可以只存储Depth,用Depth重建View Space的Position
· Normal, 法线对任何一种光照模型都是必不可少的。
· Diffuse / Specular, 以及其他属性,如albedo,specular power,specular intensity等等。
2)Deferred Shading优点
- 提高performance: 当Object和光源都比较多时,传统的方式需要渲染 num_objects * num_lights 遍,而deferred shading只需要num_objects + num_lights遍。
- 利用G-buffer中存储的信息可以很容易的实现一些post-process。
3)Deferred Shading的主要缺点
- 占用大量显存。由于G-buffer中含有大量数据,因此会额外占用大量的显存。
- 不能正确处理透明物体的渲染。
- 不支持hardware antialiasing。
3.Deferred Shading参考资料。
- GPU-Gem2 Chapter 9. Deferred Shading inS.T.A.L.K.E.R
http://http.developer.nvidia.com/GPUGems2/gpugems2_chapter09.html
- GPU-Gem3 Chapter 19. Deferred Shading in Tabula Rasa.
http://http.developer.nvidia.com/GPUGems3/gpugems3_ch19.htm
-
XNA编程,Deferred Shading介绍
http://shiba.hpe.sh.cn/jiaoyanzu/wuli/ShowArticle.aspx?articleId=777&classId=4
- 6800_Leagues_Deferred_Shading(Nvidia)
http://developer.download.nvidia.com/assets/gamedev/docs/6800_Leagues_Deferred_Shading.pdf
- 其他
http://blog.csdn.net/noslopforever/article/details/3951273
http://blog.csdn.net/garuda/article/details/5273106
http://www.cnblogs.com/rickerliang/archive/2011/05/07/2040062.html