OpenGL的缓冲位

OpenGL有多个缓冲位(Buffer Bit),这些缓冲位又称缓冲区。

GL_COLOR_BUFFER_BIT,颜色缓冲区

OpenGL在绘制图元时,先是在一个缓冲区中完成渲染,然后再把渲染结果交换到屏幕上。我们把这两个缓冲区称为前颜色缓冲区(屏幕)和后颜色缓冲区。在默认情况下,OpenGL命令是在后颜色缓冲区进行渲染的。当然,也可以直接在前颜色缓冲区中进行渲染。

若要在前颜色缓冲区中进行渲染,第一种方法是直接告诉OpenGL希望在前颜色缓冲区中进行绘图,可以调用下面这个函数来实现这个目的:

1
void glDrawBuffer(Glenum mode);

如果参数 mode 指定为 GL_FRONT ,OpenGL就会在前颜色缓冲区中进行渲染;

如果参数 mode 指定为 GL_BACK ,那么渲染将在后颜色缓冲区中进行。

在前颜色缓冲区进行渲染的第二种方法是在OpenGL被初始化时简单地不要求进行双缓冲区渲染。进行单缓冲区渲染时,如果希望把渲染结果实际绘制到屏幕上,需要调用 glFlush()glFinsh() ,这点非常重要。

OpenGL实现除了支持单纯的前颜色缓冲区和后颜色缓冲区之外,还支持其他模式,如用于立体渲染的左和右缓冲区以及辅助缓冲区。

GL_DEPTH_BUFFER_BIT,深度缓冲区

与颜色缓冲区不同的是,深度缓冲区中所填充的是深度值而不是颜色值。

为了启用深度缓冲区进行深度测试,只需要调用:

1
glEnable(GL_DEPTH_TEST);

另外,即使深度缓冲区未被启用,如果深度缓冲区被创建,OpenGL也会把所有写入到颜色缓冲区的颜色片段对应的深度值写入到深度缓冲区中。但是,如果我们希望在进行深度测试时临时禁止把值写入到深度缓冲区,我们可以使用函数:

1
void glDepthMask(GLboolean mask);

GL_FALSE 作为参数,经禁止写入深度值,但并不禁止用已经写入到深度缓冲区的值进行深度测试。

GL_TRUE 作为参数,可以重新启用深度缓冲区的写入。同时,这也是默认的设置。

GL_STENCIL_BUFFER_BIT,模板缓冲区

与颜色缓冲区和深度缓冲区类似,模板缓冲区可以为屏幕上的每个像素点保存一个无符号整数值。这个值的具体意义视程序的具体应用而定。在渲染的过程中,可以用这个值与一个预先设定的参考值相比较,根据比较的结果来决定是否更新相应的像素点的颜色值。这个比较的过程被称为模板测试。

模板测试发生在 透明度测试(alpha test) 之后, 深度测试(depth test) 之前。如果模板测试通过,则相应的像素点更新,否则不更新。就像使用纸板和喷漆一样精确的混图一样,当启动 模板测试(stencil test) 时,通过模板测试的片段像素点会被替换到颜色缓冲区中,从而显示出来,未通过的则不会保存到颜色缓冲区中,从而达到了过滤的功能。

为了启用模板缓冲区进行模板测试,只需要调用:

1
glEnable(GL_STENCIL_TEST);

GL_ACCUM_BUFFER_BIT,积累缓冲区

累积缓冲区允许你把渲染到颜色缓冲区的值,拷贝到累积缓冲区。在多次拷贝操作到累积缓冲区时,可以用不同方式的把颜色缓冲区内容和当前累积缓冲区的内容进行重复混合。当在累积缓冲区完成一幅图像之后,可以拷回颜色缓冲区,然后通过SwapBuffers显示到屏幕上。

可以用 glClearAccum() 来设置红、绿和蓝色分量的清空值,按位顺序清空累积缓存或以 GL_ACCUM_BUFFER_BIT 调用 glClear() 命令。


OpenGL的缓冲位
https://asuka24601.github.io/2022/05/01/OpenGL的缓冲位/
作者
Asuka24601
发布于
2022年5月1日
许可协议