本笔记仅为个人的理解,如果有误欢迎指出。
Deferred Rendering Techniques on Mobile Devices
移动设备上的延迟渲染技术
延迟渲染是一种将场景光照计算延后到第二个渲染阶段进行的技术。。应用程序首先完成场景几何信息的渲染,并在第二个 Pass 中,在所有进行光照计算所需的信息都已经准备好之后,再统一执行光照计算。
这种技术将光照计算和几何计算解耦,因此相比于前向渲染,延迟渲染对于多光源场景更加友好。但延迟渲染不代表没有代价,因为他是在屏幕空间中完成几何体的着色,因此要求每个像素的所有光照相关信息都必须事先存储在G-buffer中。
但G-Buffer的大小随着分辨率改变而改变,1920 x 1080 的分辨率中G-Buffer的大小可能达到数十MB。并且每一帧写入和读取。这增加了内存占用,内存宽带的消耗,这个在PC设备上还好,但是在移动设备上这就成为了延迟渲染主要的瓶颈之一,移动设备的GPU中因为要考虑散热、能耗等问题GPU的带宽比GPU的计算能力更加的宝贵。
本文介绍了三种延迟渲染技术,他们在G-Buffer中存储的数据各有不同,分别为:
1,延迟渲染(Deferred Rendering)(Hargreaves 和 Harris,2004)
2,Light Pre-Pass Rendering(光照预处理渲染 / 光照预通道渲染)(Engel,2008)
3,Light Indexed Rendering(光源索引渲染)(Treblico,2009)
1,延迟渲染:
G-Buffer 是延迟渲染概念中的核心之一,在传统的延迟渲染中G-Buffer主要存储以下数据:
漫反射颜色、法线、深度。
延迟渲染对物体的渲染一般会有两个Pass以上,第一个Pass中会将这些数据写入到G-buffer中,随后在另外一个单独的光照计算的Pass中针对场景中的每一个光源依次读取G-buffer中的数据并混合,最终累积得到最后的光照。

2,Light Pre-Pass Rendering(光照预处理渲染 / 光照预通道渲染)
LPPR和DR 的主要区别在于他的G-Buffer中存储每个像素的光照信息,而不是完整的几何信息。这样带来的好处就是减少G-Buffer的大小进而减少内存带宽的消耗。
LPPR中主要存储以下数据:
( 光源颜色 )点乘((光照方向) 叉乘(法线) )
当然依照光照模型的不同,这公式可以是多样的,最后在光照计算中结合物体自身的漫反射纹理生成最终图像。

3,Light Indexed Rendering(光源索引渲染)
LIR和前两项技术不同,前两项技术在G-Buffer中存储的是光照计算所需要的信息,而LIR中G-Buffer换名为Light Index Texture,存储的是一个影响该像素的光源的索引。再利用这个索引去采样最终保存了光源信息的纹理。
具体过程如下:
第一步:为每个光源分配一个索引值,在屏幕空间上受影响的像素会将该光源的索引记录到RGBA中的其中一个通道上。
因此这个技术每个像素最多只有4个光源能够参与到计算,但因为颜色通道是8位的所以场景中可以存在256个不同的光源,因为一张Light Index Texture最多存储4个光源的索引,在选择要存储哪个光源就要另外做判断了。
但如果不限制Light Index Texture的数量的话,每个像素理论上是可以支持任意数量的光源参与到计算的,只要增加Light Index Texture的数量即可。
第二步:这一阶段对于屏幕上的每一个像素首先会根据Light Index Texture上的光源索引,通过这个光源索引去查询存储了光源信息的纹理,比如光源位置纹理、光源颜色纹理、光源衰减纹理等,最终再结合应用程序传入的漫反射纹理、法线等着色数据信息渲染出最终的颜色。

总结:
| 技术 | G-buffer 中保存的数据 | 光照如何计算 | 最大优势 | 最大缺点 |
|---|---|---|---|---|
| Deferred Rendering | Albedo、Normal、Depth 等完整几何信息 | 根据 G-buffer 逐光源计算 | 实现简单,支持大量光源 | G-buffer 大,带宽占用高 |
| Light Pre-Pass Rendering | Normal、Depth + 光照结果 | 第二次几何 Pass 结合材质完成着色 | G-buffer 更小,节省带宽 | 需要两次几何渲染 |
| Light Indexed Rendering | 每个像素只保存光源索引 | 根据索引查询光源数据后计算 | 几乎不需要 G-buffer,可支持硬件 MSAA,内存带宽占用最低 | 光源管理复杂,每像素可保存的光源数量有限,需要排序和裁剪 |
从移动 GPU 的角度来看,这三种方案实际上是在不同资源之间做权衡:
- Deferred Rendering:用显存和带宽换取较低的几何处理开销。
- Light Pre-Pass Rendering:减少 G-buffer 带宽,增加一次几何渲染。
- Light Indexed Rendering:进一步减少 G-buffer 开销,将问题转移到光源索引管理和光源数据查询上,并且能够支持硬件 MSAA,因此更适合带宽受限、但需要较高图像质量的移动平台。