首先介绍一下最基本的渲染模型:前向渲染(Forward Rendering)。渲染有两个最基本的要素:物体和灯光。前向渲染是指依次将每个灯光应用到每个物体上。流程如下:
for 每个物体
for 每个灯光
按照光照模型进行渲染
从中我们可以看出,这种算法的时间复杂度是
这种方法的原理是推迟了光照计算,从而避免多次渲染同一个像素。流程如下:
for 每个物体
将各种几何信息储存到g-buffer中
for 每个灯光
从g-buffer中读取信息,按照光照模型进行渲染
根据流程可以得出,这种算法的复杂度是
根据上一篇中得到的公式,与物体相关的信息包括:物体位置、法线向量、纹理坐标、反射系数(
从这里可以看出,延迟渲染其实是一种空间换时间的策略,用g-buffer所占用的空间来换取渲染效率。所以延迟渲染的瓶颈主要是在g-buffer上,g-buffer的大小就是优化的重点。具体的优化方法不是本文的重点,这里不再赘述。
延迟渲染有两个限制。一个是无法使用硬件提供的抗锯齿功能,因为物体的几何信息基本都被抛弃了,只保留了每个像素所需要的基本渲染信息。延迟渲染一般使用Edge AA等方法来进行抗锯齿,相关信息可能之后会专门写一篇来说明。另一个限制是对半透明混合无能为力。因为g-buffer上只保留了最靠近相机的那个像素的信息,无法在光照计算后进行正确的混合,所以一般是用延迟渲染将非半透物体渲染完之后,再用前向渲染将半透明物体渲染一遍。