延时渲染(Deferred Shading)
1、延时渲染的优势
延时渲染(deferred shading)相对于前向渲染(forward shading)主要有以下两个优势:(1) 只对看得见的像素进行光照计算,对于深度比较复杂(像素被超过4个以上的面片所覆盖)以及灯光数目较多的场景,可以有效提高渲染速度;(2)将光照与其他效果分离,可以大大减少shader组合的数量,假设光照效果数为M,其他效果数为N,对于前向渲染,则需要组合出M*N个shader,而对于延时渲染,只需要M+N个shader即可。
2、延时渲染框架

图1:延时渲染pipeline
延时渲染是一种multi-pass渲染技术,分为几何pass和光照pass,然后有可选的一个或多个后处理pass。
geometry pass
这个pass的输入是一个object list,然后绘制每个object,但是并不直接输出到frame buffer,而是输出到几何缓存(Geometry Buffer)中,它其实就是一个opengl中的FBO(frame buffer object),几何缓存中包括diffuse map,position map以及normal map,其中position和normal map都用16位的浮点纹理存储,diffuse map直接用rgb纹理存储即可,position和normal是指在视图空间的位置和法线,因为法线是归一化的,所以只存储其xy分量即可,剩余的一个分量用来存储material id,其用来在lighting pass中索引material pallette。一个简单的geometry pass的shader如下:
vertex shader:
对于每个object,1D纹理中对应于其四个material参数,它们都是3D的向量,也就是对应纹理中的4个像素;一般显卡都支持4096大小的纹理,这样可以支持1024个object,暂时够用,如果要支持非常多的object,可以使用2D或者3D纹理;根据material id在shader中生成相应纹理坐标,就可以索引出相应的材质参数了,整个lighting pass的shader(方向光)代码如下:
vertex shader:
3、Results
延时渲染的实现效果如下:
四个点光+四个方向光,上: geometry buffer 下:最终光照效果
地形,一个方向光,上: geometry buffer 下:最终光照效果