一、Deferred shading技术简介
Deferred shading是这样一种技术:将光照/渲染计算推迟到第二步进行计算。我们这样做的目的是为了避免多次(超过1次)渲染同一个像素。
其基本思想如下:
1、在第一步中,我们渲染场景,但是与通常情况下应用反射模型计算片断颜色不同的是,我们只是简单的将几何信息(位置坐标,法线向量,纹理坐标,反射系数等等)存储在中间缓冲区中,这样的缓冲区我们称之为g-buffer(g是几何geometry的缩写)。
2、在第二步,我们从g-buffer中读取信息,应用反射模型,计算出每个像素的最终颜色。
Deferred shading技术的应用使得我们避免了应用反射模型于最终不可见的片断上。例如,考虑这样的像素,它位于两个多边形重叠的区域。通常的片断着色器会读对 每个多边形分别计算那个像素一次;然而,两次执行的结果最终只有一个成为该像素的最终颜色(这里基于的一个假设是:混合已被禁用)。这样,其中的一次计算 就是无用的。有了Deferred shading技术,反射模型的计算会推迟到所有几何体被处理之后,那时候每个像素位置几何体的可见性也是已知的。这样,对于屏幕上的每个像素,反射模型 的计算只会发生一次。
Deferred shading容易懂而且便于使用。它能够帮助实施很复杂的光照/反射模型。
二、结合例子来说明Deferred shading技术
下面的例子采用Deferred shading技术渲染了一个包含一个茶壶和一个圆环的场景。效果如下:
图一 场景渲染效果图
在这个例子中,我们将位置坐标、法线以及漫反射因子存储在g-buffer里。在第二步的时候,我们使用g-buffer里面的数据来进行漫反射光照模型的计算。
g-buffer包含3个纹理:分别用来存储位置坐标、法线以及漫反射因子。对应的采用了3个uniform变量:PositionTex、NormalTex、ColorTex。
他们均被关联到一个FBO上。关于FBO使用见:FBO。
下面是创建包含g-buffer的FBO的代码:
[cpp] view plaincopy