除了深度测试,OpenGL还有一种较为自由的测试,称为模板测试stencil。
模板函数
首先,和深度测试一样,我们要先启用它,同时需要在渲染循环中清除它的缓存
glEnable(GL_STENCIL_TEST);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
除此以外,我们还可以使用以下函数开启和禁用模板值的写入
glStencilMask(0xFF); // 每一位写入模板缓冲时都保持原样
glStencilMask(0x00); // 每一位在写入模板缓冲时都会变成0(禁用写入)
深度测试默认取深度浅的,因为这符合我们的常识。模板测试中,哪些值能通过,必须通过函数设定好。
举例如下,第一个参数是测试模式,可用的选项有:GL_NEVER、GL_LESS、GL_LEQUAL、GL_GREATER、GL_GEQUAL、GL_EQUAL、GL_NOTEQUAL和GL_ALWAYS。它们的语义和深度缓冲的函数类似。
第二个参数是参考值。用来进行对比。
第三个参数是一个掩码,它将会与参考值和储存的模板值在测试比较它们之前进行与(AND)运算。初始情况下所有位都为1。
glStencilFunc(GL_EQUAL, 1, 0xFF)
以上这个函数的意义就是告诉OpenGL,只要一个片段的模板值等于(GL_EQUAL)参考值1,片段将会通过测试并被绘制,否则会被丢弃。
除了怎么测试,我们还要设置如何更改模板的值