美文网首页my-QT专栏
QT+OPenGL十六之模板缓冲区

QT+OPenGL十六之模板缓冲区

作者: c之气三段 | 来源:发表于2021-04-26 20:04 被阅读0次

    模板缓冲区(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十六之模板缓冲区

        本文链接:https://www.haomeiwen.com/subject/vfoerltx.html