09-像素操作
2.1.7 像素操作
当我们在display()方法中使用glDrawArrays()命令绘制场景中的物体时,我们通常期望前面的物体挡住后面的物体。这也可以推广到物体自身,我们通常期望看到物体的正面对着我们,而不是背对我们。
为了实现这个效果,我们需要隐藏面消除(Hidden Surface Removal,HSR)。基于场景需要的不同效果,OpenGL可以进行一系列不同的HSR操作。虽然这个阶段不可编程,但是理解它的工作原理是非常重要的。我们不仅需要正确地配置它,之后还需要在给场景添加阴影时对它进行进一步操作。
OpenGL通过精巧地协调两个缓冲区完成隐藏面消除:颜色缓冲区(我们之前讨论过)和深度缓冲区(也叫作Z缓冲、Z-buffer)。这两个缓冲区都和光栅的大小相同——即对于屏幕上每个像素,在两个缓冲区都各有一个对应条目。
当绘制场景中的各种对象时,片段着色器会生成像素颜色。像素颜色会存放在颜色缓冲区中——颜色缓冲区最终会被写入屏幕。当多个对象占据颜色缓冲区中的相同像素时,必须根据哪个对象最接近观察者来确定保留哪个像素颜色。
隐藏面消除按照如下步骤完成。
(1)在每个场景渲染前,深度缓冲区全部初始化为表示最大深度的值。
(2)当像素颜色由片段着色器输出时,计算它到观察者的距离。
(3)如果距离小于深度缓冲区存储的值(对当前像素),那么用当前像素颜色替换颜色缓冲区中的颜色,同时用当前距离替换深度缓冲区中的值,否则抛弃当前像素。
这个过程叫作Z-Buffer算法,如图2.14所示。