三维游戏图形学学习笔记(二)延迟渲染

  首先介绍一下最基本的渲染模型:前向渲染(Forward Rendering)。渲染有两个最基本的要素:物体和灯光。前向渲染是指依次将每个灯光应用到每个物体上。流程如下:

for 每个物体
    for 每个灯光
        按照光照模型进行渲染

  从中我们可以看出,这种算法的时间复杂度是 O(MN) 。如果物体和灯光都比较多,性能确实有影响。为了解决这个问题,有人发明了延迟渲染(Deferred Shading)。
  这种方法的原理是推迟了光照计算,从而避免多次渲染同一个像素。流程如下:

for 每个物体
    将各种几何信息储存到g-bufferfor 每个灯光
    从g-buffer中读取信息,按照光照模型进行渲染

  根据流程可以得出,这种算法的复杂度是 O(M+N) 。这极大的降低了时间复杂度,减少了渲染的浪费。这个算法的关键是g-buffer(geometry buffer)中存储哪些信息。
  根据上一篇中得到的公式,与物体相关的信息包括:物体位置、法线向量、纹理坐标、反射系数( Ka Kd Ks Ke )、高光指数。所需要的信息确实是相当的多,因此想要发挥延迟渲染的威力,那么显卡至少需要支持MRT,即同时将多个信息渲染到多张纹理的功能。当然现在显卡基本都有这个功能,这方面无需担心。
  从这里可以看出,延迟渲染其实是一种空间换时间的策略,用g-buffer所占用的空间来换取渲染效率。所以延迟渲染的瓶颈主要是在g-buffer上,g-buffer的大小就是优化的重点。具体的优化方法不是本文的重点,这里不再赘述。
  延迟渲染有两个限制。一个是无法使用硬件提供的抗锯齿功能,因为物体的几何信息基本都被抛弃了,只保留了每个像素所需要的基本渲染信息。延迟渲染一般使用Edge AA等方法来进行抗锯齿,相关信息可能之后会专门写一篇来说明。另一个限制是对半透明混合无能为力。因为g-buffer上只保留了最靠近相机的那个像素的信息,无法在光照计算后进行正确的混合,所以一般是用延迟渲染将非半透物体渲染完之后,再用前向渲染将半透明物体渲染一遍。

猜你喜欢

转载自blog.csdn.net/vvsxr/article/details/71054972