帧缓冲区有许多缓冲区构成,这些缓冲区大致分为:
颜色缓冲区:用于绘图的缓冲区,它包含了颜色索引或者RGBA颜色数据。
深度缓冲区:存储每个像素的深度值,当启动深度测试时,片段像素深度值和深度缓冲区深度值进行比较,决定片段哪些像素点数据可以替换到颜色缓冲区中。
模板缓冲区:就像使用纸板和喷漆一样精确的混图一样,当启动模板测试时,通过模板测试的片段像素点会被替换到颜色缓冲区中,从而显示出来,未通过的则不会保存到颜色缓冲区中,从而达到了过滤的功能。
累积缓冲区:累积缓冲区允许你把渲染到颜色缓冲区的值,拷贝到累积缓冲区。在多次拷贝操作到累积缓冲区时,可以用不同方式的把颜色缓冲区内容和当前累积缓冲区的内容进行重复混合
模板测试
模板测试只有存在模板缓冲区的情况下进行,模板测试把像素存储在模板缓冲区的点与一个参考值进行比较(glStencilFunc),根据测试结果,对模板缓冲区的值进行响应的修改glStencilOp
void glStencilFunc (GLenum func, GLint ref, GLuint mask);
func:GL_NEVER 从来不能通过
GL_ALWAYS 永远可以通过(默认值)
GL_LESS 小于参考值可以通过
GL_LEQUAL 小于或者等于可以通过
GL_EQUAL 等于通过
GL_GEQUAL 大于等于通过
GL_GREATER 大于通过
GL_NOTEQUAL 不等于通过
ref: 参考值
mask:掩码,书上说模板测试只在哪些对应为1的位上进行。(不是很确定具体作用)
举例:glStencilFunc (GL_LESS, 1.0, 1.0);模板缓冲区对应的像素点的值如果小于1.0,则通过模板测试
void glStencilOp (GLenum fail, GLenum zfail, GLenum zpass);
fail模板测试未通过时该如何变化;zfail表示模板测试通过,但深度测试未通过时该如何变化;zpass表示模板测试和深度测试或者未执行深度测试均通过时该如何变化
GL_KEEP(不改变,这也是默认值)
GL_ZERO(回零)
GL_REPLACE(使用测试条件中的设定值来代替当前模板值)
GL_INCR(增加1,但如果已经是最大值,则保持不变),
GL_INCR_WRAP(增加1,但如果已经是最大值,则从零重新开始)
GL_DECR(减少1,但如果已经是零,则保持不变),
GL_DECR_WRAP(减少1,但如果已经是零,则重新设置为最大值)
GL_INVERT(按位取反)
未启用模板缓冲区
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glLoadIdentity(); glTranslatef(0, 0, -20); glColor3f(1.0f,1.0f,1.0f); dRadius = 5.0*(sqrt(2.0)/2.0); glBegin(GL_LINE_STRIP); for (dAngel=0;dAngel<380.0;dAngel+=0.1) { glVertex2d(dRadius*cos(dAngel),dRadius*sin(dAngel)); dRadius*=1.003; } glEnd(); glColor3f(1.0f,0.0f,0.0f); glRectf(-5,-5,5,5); |