OpenGL 帧缓冲区
文章引用OpenGL 帧缓冲区 - wen_dao_ - 博客园
帧缓冲区
几乎每个图形程序的重要目标之一都是在屏幕上绘制图形。屏幕是由一个矩形像素数组组成的,每个像素都可以在图像的某一个点上显示一个某种颜色的微小方块。在光栅化阶段(包括纹理和雾)之后,数据就不再是像素,而是片段。每个片段都具有与像素对应的坐标数据以及颜色值和深度值。
如果顺利通过了这些测试和操作,片段值便可以转换为像素。 如果顺利通过了这些测试和操作,片段值便可以转换为像素。为了绘制这些像素,我们需要知道它们的颜色(即存储在颜色缓冲区中的信息)。当每个像素的数据按照统一的方式存储时,存储所有像素的数据按照统一的方式存储时,存储所有像素的存储空间就叫做缓冲区。不同的缓冲区为每个像素存储的数据量可能不同。但是,在一个特定的缓冲区内,每个像素存储的数据是相同的。为每个像素存储了1位信息的缓冲区又称为位平面(bitplane)。
颜色缓冲区
颜色缓冲区,它用于保存屏幕上所显示的颜色信息。假设屏幕的宽度为1280个像素,高度为1024像素,并使用24位的完整颜色。换句话说,这个屏幕可以显示2的24次方中不同的颜色。由于24位相当于3个字节,因此这个颜色缓冲区必须为屏幕上1289*1024个像素的每一个都存储在3个字节的数据。在特定的硬件系统中,物理屏幕所显示的像素可能更多或更少。另外,每个像素可能更多或更少。另外,每个像素的数据量也可能更多或更少。但是,对于一个特定的颜色缓冲区而言,它为屏幕上每个像素所存储的数据量是相同的。
颜色缓冲区只是用了存储像素信息的许多缓冲区之一,还有很多其他缓冲区。例如,深度缓冲区存储了每个像素的深度信息。颜色缓冲区本身也可能包括几个子缓冲区。系统的帧缓冲区是由所有这些缓冲区组成的。除了颜色缓冲区之外,其他缓冲区都无法直接查看,它们用于实现诸如隐藏表面消除,场景抗锯齿、模版测试、绘制平滑的运动图像等功能。
颜色缓冲区通常用于绘图的缓冲区。它们包含了颜色索引或RGB颜色数据,还可能包含alpha数据。支持立体画面的OpenGL实现了提供了左右颜色缓冲区,分别包含了左右立体图像。如果OpenGL实现不支持立体图像,那就值使用了左缓冲区。类似地,双缓冲系统提供了前后缓冲区,而单缓冲系统只提供了前缓冲区。
深度缓冲区
深度缓冲区存储每个像素的深度值。深度通常是根据物体和观察点的距离来测量的,因此具有较大深度的像素有可能会被具有较小深度值的像素覆盖。但是,这只是一种通常的约定,我们完全可以更改深度缓冲区的行为。深度缓冲区有时又称为z缓冲区(x表示屏幕的水平方向,y表示屏幕的垂直方向,z表示从观察点垂直于屏幕的方向)。
模版缓冲区
模版缓冲区的用途之一就是把绘图限制在屏幕中的某个区域,就像使用纸板和喷漆实现精确的绘图一样。例如,例如,如果想绘制一幅在形状怪异的挡风玻璃上出现的图像,可以在模版缓冲区内存储一幅挡风玻璃形状的图像,然后在绘制整个场景。模版缓冲区可以防止哪些透过挡风玻璃无法看到的物体被绘制出来。因此,如果应用程序是一个模拟驾驶的程序,可以只绘制车内的仪表和其他物体1次,当汽车开动时,只有车窗外的场景需要更新。
积累缓冲区
与RGBA模式下的颜色缓冲区一样,积累缓冲区也用于存储RGBA颜色数据(在颜色索引模式下,使用积累缓冲区的结果是未定义的)。积累缓冲区通常用于把一些列的图像合成为一幅图像。通过这种方法,可以对图像进行超量采样,然后对样本求平均值,并且将结果写入到颜色缓冲区中,从而显示场景的抗锯齿处理。不能把数据直接写入到积累缓冲区,积累操作总是以矩形块为单位对数据进行操作,通常是把数据移入或一出颜色缓冲区。
清除缓冲区
在图形程序中,清除屏幕(以及所有缓冲区)是开销最大的操作之一。一个1280*1024的屏幕包含了上百万的像素。对于简单的图形应用程序,清除操作话费的时间可能比接下来进行的绘图操作的时间还要多。如果需要清除的不仅仅是颜色缓冲区,还需要清除深度和模版缓冲区,清除操作所花费的时间可能还要成倍地增加。 为了解决这个问题,有些计算机提供了能够同时清除多个缓冲区的硬件。OpenGL的清除命令能够充分的利用这类硬件的优势。首先,指定需要写入到每个将要清除的缓冲区的值,然后发布一条命令执行清除操作。在这个命令中,需要传递将要清除的缓冲区列表。如果硬件支持同时清除多个缓冲区,这些清除操作就会同时进行。否则,这些缓冲区就会按顺序逐个清除。