OpenGL-模板测试
-
- 应用 物体轮廓
当片段着色器处理完一个片段之后,模板测试(Stencil Test)会开始执行 ,和深度测试一样,它也可能会 丢弃片段。接下来, 被保留的片段会进入深度测试 ,它可能会丢弃更多的片段。模板测试是根据又一个缓冲来进行的,它叫做 模板缓冲(Stencil Buffer) ,我们可以在渲染的时候更新它来获得一些很有意思的效果。
一个模板缓冲中, (通常)每个模板值(Stencil Value)是8位的。所以每个像素/片段一共能有256种不同的模板值。我们可以将这些 模板值设置为我们想要的值,然后当某一个片段有某一个模板值的时候,我们就可以选择丢弃或是保留这个片段了。
应用 物体轮廓
通过使用GL_ALWAYS模板测试函数,我们 保证了箱子的每个片段都会将模板缓冲的模板值更新为1 。因为片段永远会通过模板测试,在绘制片段的地方,模板缓冲会被更新为参考值。
现在模板缓冲在箱子被绘制的地方都更新为1了,我们将要 绘制放大 的箱子,但这次要 禁用模板缓冲的写入:
glStencilFunc(GL_NOTEQUAL, 1, 0xFF);
glStencilMask(0x00); // 禁止模板缓冲的写入
glDisable(GL_DEPTH_TEST);
shaderSingleColor.use();
DrawTwoScaledUpContainers();
我们将模板函数设置为GL_NOTEQUAL,它会 保证我们只绘制箱子上模板值不为1的部分, 即只绘制箱子在之前绘制的箱子之外的部分。注意我们也禁用了深度测试,让放大的箱子,即边框,不会被地板所覆盖。
记得要在完成之后重新启用深度缓冲。