opengl学习-模板测试

启用模板测试

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
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容