本笔记仅为个人的理解如果有误欢迎指出。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 RenderingHargreaves 和 Harris20042Light Pre-Pass Rendering光照预处理渲染 / 光照预通道渲染Engel20083Light Indexed Rendering光源索引渲染Treblico20091延迟渲染G-Buffer 是延迟渲染概念中的核心之一在传统的延迟渲染中G-Buffer主要存储以下数据漫反射颜色、法线、深度。延迟渲染对物体的渲染一般会有两个Pass以上第一个Pass中会将这些数据写入到G-buffer中随后在另外一个单独的光照计算的Pass中针对场景中的每一个光源依次读取G-buffer中的数据并混合最终累积得到最后的光照。2Light Pre-Pass Rendering光照预处理渲染 / 光照预通道渲染LPPR和DR 的主要区别在于他的G-Buffer中存储每个像素的光照信息而不是完整的几何信息。这样带来的好处就是减少G-Buffer的大小进而减少内存带宽的消耗。LPPR中主要存储以下数据 光源颜色 点乘光照方向 叉乘法线 当然依照光照模型的不同这公式可以是多样的最后在光照计算中结合物体自身的漫反射纹理生成最终图像。3Light 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 RenderingAlbedo、Normal、Depth 等完整几何信息根据 G-buffer 逐光源计算实现简单支持大量光源G-buffer 大带宽占用高Light Pre-Pass RenderingNormal、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因此更适合带宽受限、但需要较高图像质量的移动平台。