OpenGL学习笔记-十一-模板测试
先看这个效果:
发现奇怪之处了吗?
明明是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: 反转原值.
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 VanishingBlog!