QT+OPenGL十六之模板缓冲区

模板缓冲区(Stencil Buffer)

模板缓冲区的作用是可以自定义丢弃片段。作用在深度缓冲区之前,被保留的片段才会进入深度测试阶段。模板缓冲中的模板值(Stencil Value)通常是8位的,因此每个片段/像素共有256种不同的模板值(译注:8位就是1字节大小,因此和char的容量一样是256个不同值)。这样我们就能将这些模板值设置为我们链接的,然后在模板测试时根据这个模板值,我们就可以决定丢弃或保留它了。
learnopengl中介绍了了模板缓冲区的特点:

image.png

为1的片段才会被绘制,否则丢弃。

使用步骤:

开启模板缓冲测试。

glEnable(GL_STENCIL_TEST);

glStencilMask允许我们给模板值设置一个位遮罩(Bitmask),它与模板值进行按位与(AND)运算决定缓冲是否可写。默认设置的位遮罩都是1,这样就不会影响输出,但是如果我们设置为0x00,所有写入深度缓冲最后都是0。

// 0xFF == 0b11111111
//此时,模板值与它进行按位与运算结果是模板值,模板缓冲可写
glStencilMask(0xFF); 
// 0x00 == 0b00000000 == 0
//此时,模板值与它进行按位与运算结果是0,模板缓冲不可写
glStencilMask(0x00); 

同样在绘制最前或者最后进行缓冲区清除

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
模板缓冲区属性设置:

glStencilFunc(GLenum func, GLint ref, GLuint mask)
第一个参数func和深度缓冲区可选值一样GL_NEVER、GL_LEQUAL、GL_GREATER、GL_GEQUAL、GL_EQUAL、GL_NOTEQUAL、GL_ALWAYS区别就在于,它不是和深度值比较而是引用值和模板内容比较。
第二个参数ref:指定模板测试的引用值。模板缓冲的内容会与这个值对比。
第三个参数mask:指定一个遮罩,在模板测试对比引用值和储存的模板值前,对它们进行按位与(and)操作,初始设置为1。
glStencilOp(GLenum sfail, GLenum dpfail, GLenum dppass)
第一个参数sfail: 如果模板测试失败将采取的动作。
第二个参数dpfail: 如果模板测试通过,但是深度测试失败时采取的动作。
第三个参数dppass: 如果深度测试和模板测试都通过,将采取的动作。

image.png

glStencilOp函数默认设置为 (GL_KEEP, GL_KEEP, GL_KEEP) ,所以任何测试的任何结果,模板缓冲都会保留它的值。默认行为不会更新模板缓冲,所以如果你想写入模板缓冲的话,你必须像任意选项指定至少一个不同的动作。

使用glStencilFunc和glStencilOp,我们就可以指定在什么时候以及我们打算怎么样去更新模板缓冲了,我们也可以指定何时让测试通过或不通过。什么时候片段会被抛弃。

暂时我们还用不到模板缓冲区,用到了再完善他的作用。

目录

VSC++2019+QT+OpenGL
QT+OpenGL一之绘制立方体(三角形图元)
QT+OpenGL二之纹理贴图
QT+OpenGL三之矩阵简解
QT+OpenGL四之相机的移动和旋转
QT+OpenGL五之绘制不同的模型(vao,vbo机制)
QT+OpenGL六之天空盒
QT+OpenGL七之使用EBO
QT+OPenGL八之模型准备
QT+OPenGL九之模型解码
QT+OPenGL十之光照模型
QT+OPenGL十一之漫反射和镜面反射贴图
QT+OPenGL十二之定向光
QT+OPenGL十三之真正的点光源和聚光灯
QT+OPenGL十四之多光源混合的问题
QT+OPenGL十五之深度缓冲区
QT+OPenGL十六之模板缓冲区
QT+OPenGL十七帧缓冲区(离屏渲染)
QT+OPenGL十八抗锯齿
QT+OPenGL十九镜面反射效率调整
QT+OPenGL二十Gamma校正

你可能感兴趣的:(QT+OPenGL十六之模板缓冲区)