(1)帧缓存介绍
OPENGL系统的帧缓冲区是由所有存储着像素信息的缓冲区组成的,包括:颜色缓冲区、深度缓冲区、模板缓冲区、累积缓冲区。可以使用glGetIntegerv()查询特定画面可用的缓冲区的存储信息。
颜色缓冲区是用于绘图的缓冲区,它包含了颜色索引或者RGB颜色数据,还可能有alpha数据。若OPENGL支持立体画面,则提供了左、右缓冲区;若OPENGL支持双缓冲,则提供前、后缓冲区。可以使用glGetBooleanv()判断自己系统是否支持立体画面和双缓冲;可以使用glGetIntegerv()判断支持多少个辅助缓冲区。
比如在当前GLUT的配置下:
深度缓冲区也叫z缓冲区,通常是用作消隐。
模板缓冲区常用于将绘图限制在屏幕中的某个区域。
累积缓冲区也用于存储RGBA颜色数据,常用于抗锯齿处理。
(2)清除帧缓冲区
OPENGL的清除命令是硬件实现的,这保证了清除的速度。
1. 指定RBGA颜色缓冲区的清除值
void glClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);
2. 指定颜色索引模式下的颜色缓冲区的清除值
void glClearIndex(GLfloat index);
3. 指定深度缓冲区的清除值
void glClearDepth(GLclampf depth);
4. 指定模板缓冲区的清除值
void glClearStencil(GLint s);
5. 指定累积缓冲区的清除值
void glClearAccum(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
其中,除了深度缓冲区的默认清除值为1.0外,其他都是0。
6. 清除缓冲区
void glClear(GLbitfield mask);
清除指定的缓冲区,mask为GL_COLOR_BUFFER_BIT、GL_DEPTH_BUFFER_BIT、GL_STENCIL_BUFFER_BIT、GL_ACCUM_BUFFER_BIT的逻辑OR操作的组合结果。
比如将颜色缓冲区清除成绿色、蓝色:
(3)写入和读取颜色缓冲区
1.void glDrawBuffer(GLenum mode);//选择用于写入的颜色缓冲区
mode值可以是:GL_FRONT GL_BACK GL_LEFT GL_RIGHT GL_FRONT_LEFT GL_FRONT_RIGHT GL_BACK_LEFT GL_BACK_RIGHT GL_AUXi GL_FRONT_AND_BACK GL_NONE
2.void glDrawBuffers(GLsizei n, const GLenum *buffers);//指定同时接收颜色值的多个缓冲区,它是OPENGL2.0加入的函数,常用于渲染到多个输出缓冲区
buffers只允许包括GL_NONE GL_FRONT_LEFT GL_FRONT_RIGHT GL_BACK_LEFT GL_BACK_RIGHT GL_AUXi
3. void glReadbuffer(GLenum mode);//选择作为像素读取来源的颜色缓冲区
mode值可以是:GL_FRONT GL_BACK GL_LEFT GL_RIGHT GL_FRONT_LEFT GL_FRONT_RIGHT GL_BACK_LEFT GL_BACK_RIGHT GL_AUXi GL_FRONT_AND_BACK GL_NONE
(4)屏蔽缓冲区
使用屏蔽技术可以在数据写入到缓冲区之间,对指定数据先进行AND操作,进行屏蔽。
void glIndexMask(GLuint mask);//颜色索引模式下的掩码
void glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);//RGBA下的掩码
void glDepthMask(GLboolean flag);//决定深度缓冲区是否被禁用
void glStencilMask(GLuint mask);//模板的掩码
void glStencilMaskSeparate(GLenum face, GLuint mask);//允许对正面和背面独立使用掩码,这是OPENGL2.0新加入的函数
其中,所有布尔型的默认值均为GL_TRUE,所有GLint掩码的默认值是全1。
下面是将蓝色成分拒绝写入缓冲区的前后对比:
glColorMask(GL_TRUE, GL_TRUE, GL_FALSE, GL_TRUE);
本文转自:博客园 - 三戒1993,转载此文目的在于传递更多信息,版权归原作者所有。