先看这个效果:

模板测试

发现奇怪之处了吗?

明明是3D的场景,但却没有厚度.
这使用到了模板测试

模板测试

模板测试原理如下大致如下:
模板测试

开启模板测试

使用以下代码开启模板测试:

glEnable(GL_STENCIL_TEST);

注意别忘了清除模板缓冲

glClear(GL_STENCIL_BUFFER_BIT);

模板函数

和深度测试一样,模板测试也需要设置模板函数.
使用以下代码设置模板函数:

glStencilFunc(GL_ALWAYS, 1, 0xFF);

其中参数意义如下:

  • func: 选择模板测试函数,这里选择GL_ALWAYS,表示测试时总是通过.
  • ref: 参考值,这里设置为1.
  • mask: 掩码值,这里设置为0xFF,表示所有位都可以修改,即启用模板缓冲写入.设置为0x00则禁止写入.

在模板测试后会进行深度测试.我们可以设置不同情况下OpenGl如何更新模板缓冲.
使用以下代码设置模板缓冲更新规则:

glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);

其中三个参数如下:

  • sfail: 发生模板测试失败,深度测试成功时,模板缓冲的操作.这里设置为GL_KEEP,表示保持原值.
  • dpfail: 发生深度测试失败,模板测试成功时,模板缓冲的操作.这里设置为GL_KEEP,表示保持原值.
  • dppass: 发生深度测试成功,模板测试成功时,模板缓冲的操作.这里设置为GL_REPLACE,表示替换原值.

可以使用下面这些行为:

  • GL_KEEP: 保持原值.
  • GL_ZERO: 置0.
  • GL_REPLACE: 替换原值.
  • GL_INCR: 递增原值.
  • GL_INCR_WRAP: 递增原值,超过最大值则置0.
  • GL_DECR: 递减原值.
  • GL_DECR_WRAP: 递减原值,低于0则置最大值.
  • GL_INVERT: 反转原值.