模板測試在我們工作中用得不太多,一般會在做一些遮罩的時候會用到,比如窗戶顯示物體的效果,還有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代替小的