当前位置:嗨网首页>书籍在线阅读

09-像素操作

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

2.1.7 像素操作

当我们在display()方法中使用glDrawArrays()命令绘制场景中的物体时,我们通常期望前面的物体挡住后面的物体。这也可以推广到物体自身,我们通常期望看到物体的正面对着我们,而不是背对我们。

为了实现这个效果,我们需要隐藏面消除(Hidden Surface Removal,HSR)。基于场景需要的不同效果,OpenGL可以进行一系列不同的HSR操作。虽然这个阶段不可编程,但是理解它的工作原理是非常重要的。我们不仅需要正确地配置它,之后还需要在给场景添加阴影时对它进行进一步操作。

OpenGL通过精巧地协调两个缓冲区完成隐藏面消除:颜色缓冲区(我们之前讨论过)和深度缓冲区(也叫作Z缓冲、Z-buffer)。这两个缓冲区都和光栅的大小相同——即对于屏幕上每个像素,在两个缓冲区都各有一个对应条目。

当绘制场景中的各种对象时,片段着色器会生成像素颜色。像素颜色会存放在颜色缓冲区中——颜色缓冲区最终会被写入屏幕。当多个对象占据颜色缓冲区中的相同像素时,必须根据哪个对象最接近观察者来确定保留哪个像素颜色。

隐藏面消除按照如下步骤完成。

(1)在每个场景渲染前,深度缓冲区全部初始化为表示最大深度的值。

(2)当像素颜色由片段着色器输出时,计算它到观察者的距离。

(3)如果距离小于深度缓冲区存储的值(对当前像素),那么用当前像素颜色替换颜色缓冲区中的颜色,同时用当前距离替换深度缓冲区中的值,否则抛弃当前像素。

这个过程叫作Z-Buffer算法,如图2.14所示。

50.png

图2.14 Z-buffer算法