美文网首页
opengl学习-模板测试

opengl学习-模板测试

作者: 小杰66 | 来源:发表于2021-04-23 08:19 被阅读0次

    启用模板测试

    glEnable(GL_STENCIL_TEST);

    清除模板缓冲

    glClear(GL_STENCIL_BUFFER_BIT);

    设置位掩码

    glStencilMask允许我们设置一个位掩码(Bitmask),它会与将要写入缓冲的模板值进行与(AND)运算。默认情况下设置的位掩码所有位都为1,不影响输出,但如果我们将它设置为0x00,写入缓冲的所有模板值最后都会变成0。
    glStencilMask(0xFF); // 每一位写入模板缓冲时都保持原样
    glStencilMask(0x00);// 每一位在写入模板缓冲时都会变成0(禁用写入)

    模板函数

    1. glStencilFunc(GLenum func, GLint ref, GLuint mask)
      控制对模板缓冲内容的操作
    • func:设置模板测试函数(Stencil Test Function)。这个测试函数将会应用到已储存的模板值上和glStencilFunc函数的ref值上。可用的选项有:GL_NEVER、GL_LESS、GL_LEQUAL、GL_GREATER、GL_GEQUAL、GL_EQUAL、GL_NOTEQUAL和GL_ALWAYS
    • ref:设置了模板测试的参考值(Reference Value)。模板缓冲的内容将会与这个值进行比较。
    • mask:设置一个掩码,它将会与参考值和储存的模板值在测试比较它们之前进行与(AND)运算。初始情况下所有位都为1。
    1. glStencilOp(GLenum sfail, GLenum dpfail, GLenum dppass)
      如何更新模板缓冲
    • sfail:模板测试失败时采取的行为。
    • dpfail:模板测试通过,但深度测试失败时采取的行为。
    • dppass:模板测试和深度测试都通过时采取的行为。
      可用的选项有:
      GL_KEEP 保持当前储存的模板值
      GL_ZERO 将模板值设置为0
      GL_REPLACE 将模板值设置为glStencilFunc函数设置的ref值
      GL_INCR 如果模板值小于最大值则将模板值加1
      GL_INCR_WRAP 与GL_INCR一样,但如果模板值超过了最大值则归零
      GL_DECR 如果模板值大于最小值则将模板值减1
      GL_DECR_WRAP 与GL_DECR一样,但如果模板值小于0则将其设置为最大值
      GL_INVERT 按位翻转当前的模板缓冲值

    绘制边框

    glStencilFunc(GL_ALWAYS, 1, 0xFF); 
    glStencilMask(0xFF); 
    DrawTwoContainers();
    
    glStencilFunc(GL_NOTEQUAL, 1, 0xFF);
    glStencilMask(0x00); 
    glDisable(GL_DEPTH_TEST);
    shaderSingleColor.use(); 
    DrawTwoScaledUpContainers();
    glStencilMask(0xFF);
    glEnable(GL_DEPTH_TEST);
    
    80A4BF60-23C6-4F94-B05B-40A7C9D80565.png

    相关文章

      网友评论

          本文标题:opengl学习-模板测试

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