模板测试在我们工作中用得不太多,一般会在做一些遮罩的时候会用到,比如窗户显示物体的效果,还有mmo经常会做的镜头被建筑遮挡就用另一个颜色代替。
当然其实还会有其他一些应用,先说下模板测试的原理。
模板测试的模式是
需要注意的是Comp,Pass,Fail 和ZFail将会应用给背面消隐的几何体(只渲染前面的几何体),除非Cull Front被指定,在这种情况下就是正面消隐的几何体(只渲染背面的几何体)。你也可以精确的指定双面的模板状态通过定义CompFront,PassFront,FailFront,ZFailFront(当模型为front-facing geometry使用)和ComBack,PassBack,FailBack,ZFailBack(当模型为back-facing geometry使用)
模板测试最关键的是一个判断,就是根据下面这个判断来确定是要显示谁的颜色的
if(referenceValue&readMask comparisonFunction stencilBufferValue&readMask)
通过像素
else
抛弃像素
其中readMask的默认值为255
其他的解释就不说那么多了。
窗口用法
一般我们用作遮罩的话就是比较普通的用法
第一个shader:
ColorMask 0
ZWrite Off
Stencil{
Ref 1
Comp Always
Pass Replace
}
第二个shader:
Stencil {
Ref 1
Comp Equal
}
这里要主要的是要第一个shader先执行,首先因为管线每帧会重置模板的值,再者是因为我们需要先把第一个模板的数值写入mask中,然后第二个shader发现mask值和我们的ref相等时才会pass这个颜色。
这里有个关键就是第一个shader要先执行,你可以通过RenderQueue让她先执行或调整z轴来让她先执行(透明是从后往前渲染,不透明是从前往后渲染)
永远位于前面
第二个应用是让一个物体永远在另一个物体前面,类似我们做ui的时候想让一个物体永远在另一个物体前面就可以用这个方法。
做法是让需要永远在另一个前面的ref设置更大点,然后Comp是GEqual,并且大的ref需要replace。并且我们要保证我们渲染的物体是在transparent下渲染的(因为这样才能让无论z轴前后,后面的颜色都能渲染上来)
"RenderQueue"="Transparent"
需药永远在前面的模板:
Stencil
{
Ref 2
Comp GEqual
Pass Replace
}
在后面的模板:
Stencil
{
Ref 1
Comp GEqual
}
原理:
我们首先保证我们在透明渲染下,这样前后都能用渲染颜色。然后我们的shader就无论谁先谁后都能渲染出来了。比如Ref为2的先渲染,则把模板的值已经写成2了,Ref为1的就没办法通过渲染了,自然当前像素就是以ref为2的渲染,
如果ref为1先渲染,则ref为2的时候会覆盖掉这个颜色,一样可以显示ref为2的颜色。
如果有各种层级之间的间隔,而且不想让一方处于另一方前面,可以设置不同的shader,不同的ref,大的ref代替小的