模板测试(stencil test)应该说是对于深度测试的另外一种补充,锦上添花类型的。可以拿来实现一些效果:比方说RTS游戏中选中人物的时候,人物外围有一层光圈(表明被选中)。
和深度测试一样,模板测试有模板缓冲(stencil buffer),由GLFW自动创建(别的库的话当然要看文档,看有没有自动创建)。
当fragment shader处理完了一个片段之后,便会启动模板测试,它可能会丢弃片段,之后再启动深度测试(当然也可能会丢弃大量片段啦)。
详细的细节就不讲了(毕竟learn opengl里面都有)。
粗略地讲一下“光圈”实现的本质(直接引用learn openglcn 下面人的评论啦,我就不写了):
代码上其实就是画了两个图形。一般情况下,两个图形都会画出来(当然深度测试会挡住一部分)。
现在加入了模板测试,那么第一个画的图形的模板值全替换为1(关键操作GL_REPLACE 和 开启缓冲输入)。
第二个图形,放大一点点,换个单色的着色器,那么一般情况下,会有有一个大一圈的单色模型挡住了第一个图形(深度测试的锅)。
哪怕关了深度测试,图形依然是一片绿的(后绘制的覆盖前绘制的)。
现在利用第一个图形那部分模板值全是1的特点,运用函数设置为当模板值不等于1时,第二个图形进行绘制。那么效果就是,第一个图形正常绘制,第二个图形仅有比第一个图形大的那部分绘制出来,所以看上去就是多了一个边缘。
参考:
[1]模板测试