shader 模板的用法

模板測試在我們工作中用得不太多,一般會在做一些遮罩的時候會用到,比如窗戶顯示物體的效果,還有mmo經常會做的鏡頭被建築遮擋就用另一個顏色代替。

當然其實還會有其他一些應用,先說下模板測試的原理。

模板測試的模式是

https://img-blog.csdn.net/20161230150419028

需要注意的是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代替小的

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章