OpenGL的几种缓存


屏幕是由一个个具有颜色的微小正方形组成的,这微小正方形称为像素。为了在屏幕上显示三维场景,最终必须将三维模型分解成许许多多的像素,这个过程就是光栅化。当绘制光栅化得到的像素时,我们需要颜色及其它辅助信息,OpenGI.为屏幕上所有象素的每种信息的集合都提供了一块存储区域,这种存储区域称为“缓存”(buffer)。根据缓存中包含的信息类型可以将它分为以下4类:
    ·颜色缓存(Color Buffer)
    包含每个象素的颜色信息。颜色信息可以是颜色索引值(在颜色索引方式下),也可以是颜色的红、绿、蓝3个分量(在RGBA方式下),还可以存放表示物体透明程度的Alpha值。
    ·深度缓存(Depth Buffer)
    包含每个象素的深度值。深度值与z坐标有关,描述物体上某点距离观察点的远近,也可以称它为Z缓存(Z Buffer) 。
    ·模板缓存(Stencil Buffer)
    包含物体的模板值。模板值具有屏蔽作用,用于控制绘制的区域,使屏幕上某些区域可画,某些区域不可画。
    ·累积缓存(Accumulation Buffer)
    包含颜色信息。其可以合成一系列的绘制结果,实现某些特殊效果。
        一、颜色缓存和Alpha测试
    为了在屏幕上显示场景,就必须将场景写入颜色缓存,所以颜色缓存是最常用的缓存。一般情况下,有两种颜色缓存:前缓存(Front Buffer)和后缓存(Back Buffer),其中前缓存可见(不可缺少),后缓存不可见。开发者可以在后缓存中绘制场景,将绘制结果写入前缓存显示,由于绘制过程不可见,便实现了实时动画。
    在为OpenGl.中,光栅化得到的象素并不一定显示在屏幕上,它被称为“颗粒"(fragment ) 。颗粒必须通过一系列测试才能显示。这里首先介绍Alpha测试,该测试可以确保不透明物体先画,透明物体后画,从而正确绘制出透明物体。
   Alpha测试比较颗粒的Alpha值和一个参考值的大小。满足测试条件的颗粒通过该测试,进入下一步测试;未满足条件的不再显示。
          二、深度缓存和深度测试
    深度缓存保存象素的深度值,深度值描述象素距离观察点的远近。一般情况下,深度值较大的象素会被深度值较小的象素覆盖,因为距离观察点远的物体总是被距离近的物体遮挡。使用深度缓存和深度测试可以在硬件级实现消隐。
    深度测试比较颗粒的深度值和需写入的象素已有的深度值。满足测试条件的颗粒通过测试,进入下一级测试;未满足条件的颗粒不再显示,即被遮挡。
    深度缓存和深度测试的使用是相当灵活的。当我们需要重复一个很复杂、精度很高的背景时,与其重画该背景,不如将它存为一幅具有深度的图像,这样可以提高绘制的速度。
          三、模板缓存和模板测试
    模板缓存存放象素的模板值。因为模板值用于控制象素是否可以被改写,所以模板缓存用于控制屏幕上哪些区域可画,哪些区域禁止画,从而实现高级剪裁。
    模板测试比较需写入的象素已有的模板值和一个参考值的大小。满足测试条件的,允许颗粒进入下一级测试;未满足条件的不再显示。通过模板测试,可以绘制多个几何体的交集,也可以实现特殊地剪裁。
    使用模板测试还可以实现驾驶仿真中表盘的绘制,这样可以保证场景不出现在表盘之上。
    这里总结一下各种测试的顺序,依次是:Alpha测试、模板测试、深度测试。
          四、累积缓存
    累积缓存可以积累一系列的绘制结果并合成它们,它可以用来实现场景的全局反走样、运动模糊和对焦效果。
    画直线和多边形时,可能出现不应有的锯齿,我们称这种现象为“走样”。通过使用累积缓存,可以模糊整个场景的边界,使锯齿变得不明显,我们称实现了场景的全局反走样。

你可能感兴趣的:(测试,存储,buffer)