自己总结:1个比较(参考值和mask的&操作结果 和 当前模版值和mask的&操作结果 的 比较)
1个规则(比较成功则片段保留,失败则丢弃)
2个函数(glStencilFunc,glStencilOp),
6个参数(比较类型,参考值,掩码值,模版失败的模版值处理,模版成功深度失败,模版成功深度成功),
我们在用OpenGL绘图时往往想制作一些复合图形以及凹凸多边形,像五角星、大的矩形里再画一个小的矩形;另外有时还想做些镂空图或类似的效果。
这时我们可以开启模板测试功能来完成这些需求。由于OpenGL的一个绘制流水线特征以及GPU着色特征,像对于大矩形里画小矩形这种不能通过先绘制大矩形,然后再在其中绘制小矩形的方式进行绘制,否则当此复合图形在做一些旋转时,我们会发现小矩形部分会有非常严重的抖动。
模板测试的一个基本的特性是:它基于在某个坐标位置的模板缓存值与一个参考值相比较的结果,有条件地废弃一个片断。这里要注意的是,这个判定是基于当前被测试的片断(而不是已在帧缓存的像素),并且当前片断的每个像素都会进行模板测试,并且如果某些像素测试失败的话,这些像素就会被废弃。
下面介绍一下如何开启模板测试。
对于Mac OS X下,对你的OpenGL视图的属性中选择模板缓存的位数即可,模板缓存只有8位这一个选项。在iOS的OpenGL ES下,则需要建立一个模板缓存,建立方法与建立深度缓存类似。
然后,我们在代码中用glEnable(GL_STENCIL_TEST);来开启模板测试。
图解:
下面谈谈模板测试是如何工作的。一开始,我们用glClear(GL_STENCIL_BUFFER_BIT);来清除模板缓存的值,使这些值均为0(默认设置,也无须修改)。当我们用类似glDrawArrays这些函数来绘制某个图形后,被绘制的图形先被光栅化,然后得到相应的片断。我们指定一个参考值,一个