Unity-ShaderLab:模板
可將模板緩沖區(qū)用作一般目的的每像素遮罩,以便保存或丟棄像素。
模板緩沖區(qū)通常是每像素 8 位整數(shù)。該值可以寫入、遞增或遞減。后續(xù)繪制調(diào)用可以根據(jù)該值進(jìn)行測試,以確定在運(yùn)行像素著色器之前是否應(yīng)丟棄像素。
語法
Ref
??
要比較的參考值(如果 Comp 是?always?以外的任何值)和/或要寫入緩沖區(qū)的值(如果 Pass、Fail 或 ZFail 設(shè)置為替換)。值為 0 到 255 之間的整數(shù)。
ReadMask
這是一個(gè) 8 位掩碼,值為 0 到 255 之間的整數(shù),用于比較參考值和緩沖區(qū)的內(nèi)容 (referenceValue?&?readMask)?comparisonFunction?(stencilBufferValue?&?readMask)。默認(rèn)值:_255_。
WriteMask
這是一個(gè) 8 位掩碼,值為 0 到 255 之間整數(shù),寫入緩沖區(qū)時(shí)使用。請(qǐng)注意,與其他寫掩碼一樣,它指定寫操作將影響模板緩沖區(qū)的哪些位(例如 WriteMask 0 表示不會(huì)影響任何位,也不會(huì)寫入 0)。默認(rèn)值:_255_。
Comp
用于將參考值與緩沖區(qū)的當(dāng)前內(nèi)容進(jìn)行比較的函數(shù)。默認(rèn)值:_always_。
Pass
如果模板測試(和深度測試)通過,如何處理緩沖區(qū)的內(nèi)容。默認(rèn)值:_keep_。
Fail??
如果模板測試(和深度測試)失敗,如何處理緩沖區(qū)的內(nèi)容。默認(rèn)值:_keep_。
ZFail
如果模板測試通過但深度測試失敗,如何處理緩沖區(qū)的內(nèi)容。默認(rèn)值:_keep_。
Comp、Pass、Fail 和 ZFail 將應(yīng)用于正面幾何體,除非指定了 _Cull Front_,在這種情況下將應(yīng)用于背面幾何體。您還可以通過定義 CompFront、PassFront、FailFront 或 ZFailFront(用于正面幾何體)以及 CompBack、PassBack、FailBack 或 ZFailBack(用于背面幾何體)來顯式指定雙面模板狀態(tài)。
比較函數(shù)
比較函數(shù)為以下函數(shù)之一:

模板操作
模板操作為以下操作之一:

延遲渲染路徑
在延遲渲染路徑中渲染的對(duì)象的模板功能在某種程度上受到限制,因?yàn)樵?G 緩沖區(qū)通道和光照通道期間,Unity 會(huì)將模板緩沖區(qū)用于其他目的。在這兩個(gè)階段中,著色器中定義的模板狀態(tài)將被忽略。因此,不能基于模板測試來屏蔽這些對(duì)象,但是它們?nèi)匀豢梢孕薷木彌_區(qū)內(nèi)容,以供稍后在幀中渲染的對(duì)象使用。在延遲路徑之后在前向渲染路徑中渲染的對(duì)象(例如透明對(duì)象或沒有表面著色器的對(duì)象)將再次正常設(shè)置其模板狀態(tài)。
以下位用于延遲渲染路徑中的模板緩沖區(qū):
位 #7(值=128)指示非背景對(duì)象。
位 #6(值=64)指示非光照貼圖對(duì)象。
位 #5(值=32)未被 Unity 使用。
位 #4(值=16)用于光照通道期間的光形狀剔除,因此,僅對(duì)光接觸到的像素執(zhí)行光照著色器,而不對(duì)表面幾何體實(shí)際上位于光體積后面的像素執(zhí)行光照著色器。
最低的四位(值 1、2、4、8)用于光層剔除遮罩。
可以使用模板讀寫掩碼在“未使用”的位范圍內(nèi)操作,也可以使用?Camera.clearStencilAfterLightingPass?強(qiáng)制攝像機(jī)在光照通道后清理模板緩沖區(qū)。
示例
第一個(gè)示例著色器將在深度測試通過的任何位置寫入值“2”。模板測試設(shè)置為始終通過。
僅當(dāng)像素的第一個(gè)(紅色)著色器已通過,第二個(gè)著色器才會(huì)通過,因?yàn)樗獧z查與值“2”的相等性。它還將遞減 Z 測試失敗的緩沖區(qū)中的值。
第三個(gè)著色器僅在模板值為“1”的任何位置通過,因此只有紅色和綠色球體交叉處的像素符合條件;即,模板由紅色著色器設(shè)置為“2”并由綠色著色器遞減為“1”的情況。
結(jié)果:

下面是另一個(gè)更有針對(duì)性的效果的示例。首先使用此著色器渲染球體,以標(biāo)記模板緩沖區(qū)中的正確區(qū)域:
然后再一次渲染為相當(dāng)標(biāo)準(zhǔn)的表面著色器,但是例外之處是正面剔除,禁用了深度測試,而且模板測試丟棄先前標(biāo)記的像素:
結(jié)果:
