OpenGL的帧缓存——缓存的分类与操作

No replies
Demi
Demi 的头像
Offline
Joined: 2017-03-07

帧缓存:它是屏幕所显示画面的一个直接映象,又称为位映射图(Bit Map)或光栅。帧缓存的每一存储单元对应屏幕上的一个像素,整个帧缓存对应一帧图像。

一、缓存的分类

1. 颜色缓存
指程序员绘图所用的缓存,分为:
左、右缓存——用于立体感视图(必须要有左缓存);
前、后缓存——用于双缓存(必须要有前缓存);
4个辅助缓存——可选择的、不可显示(程序员可以自己定义和使用它们)。

2. 深度缓存
用来存储每个象素的深度值,也称为Z缓存。

3. 模板缓存
可以将作图限制在屏幕的某些部分中进行。

4. 累积缓存
包含RGBA颜色数据,通常用于将一系列图象累加成一幅最终的合成图象。
象素不能直接绘制到累积缓存中,累加操作常常先在矩形块中进行,然后再与颜色缓存交换数据。

二、缓存的操作

1. 清空缓存
(1). 指定要写入缓存的清除值:
glClearColor()——为颜色缓存设置清除值(red,green,blue,alpha);
glClearIndex()——为颜色索引缓存设置清除值(index);
glClearDepth()——为深度缓存设置清除值(默认为1.0);
glClearStencil()——为模板缓存设置清除值(默认为0.0);
glClearAccum()——为累积缓存设置清除值(red,green,blue,alpha);
(2). 清除指定的缓存:
glClear(GLbitfield mask);
mask的值是GL_COLOR_BUFFER_BIT、GL_DEPTH_BUFFER_BIT、GL_STENCIL_BUFFER_BIT和GL_ACCUM_BUFFER_BIT等常数的按位逻辑或(OR)。可以一次清除多个缓存,如硬件支持同时清除这些缓存,则操作同时进行;否则,按顺序清除各个缓存。

2. 为读写操作选择颜色缓存
绘图操作的结果可以放入任何一个颜色缓存中:前、后、左前、左后、右前、右后或任意辅存,程序员可选择单
个缓存作为绘图目标或读取目标。对绘制图形而言,也可将目标同时绘制到几个缓存中,用glDrawBuffer()函数来选
择将要写入的缓存;用glReadBuffer()函数来选择缓存,作为glReadPixels()、glCopyPixels()、glCopyTexImage*()
和glCopyTexSubImage*()的应用目标。

3. 缓存的屏蔽(掩码)
OpenGL在向激活的颜色、深度和模板缓存中写入数据之前,需按下面函数指定的掩码对这些数据进行屏蔽操作。
每个掩码要与对应的待写数据进行按位逻辑与(AND)操作。
void glIndexMask(GLuint mask);
mask默认为1。若掩码中出现1,则颜色索引模式中相应的位被写入;而在0出现的位,则不写。
void glColorMask(GLboolean red,green,blue,alpha);
默认为GL_TRUE,表示相应的分量已写入;若为GL_FALSE,则没写入。
void glDepthMask(GLboolean flag);
默认为GL_TRUE,表示深度缓存被激活用于写操作;若为GL_FALSE,则取消。
void glStencilMask(GLuint mask);
默认为1,和颜色索引类似。

(本文参考的是《OpenGL编程权威指南》,也就是传说中的“红宝书”)
转自: https://blog.csdn.net/zhongjling/article/details/8486563

--电子创新网--
粤ICP备12070055号