• 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

    • 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

                  http://blog.csdn.net/pizi0475/article/details/7108450

                  http://blog.csdn.net/pizi0475/article/details/7521394

posted on 2012-08-28 17:50  Just a Programer  阅读(2539)  评论(0编辑  收藏  举报