Unity-ShaderLab 剔除和深度測試

剔除是一種優(yōu)化方式,即不渲染背離觀察者的多邊形。所有多邊形都有正面和背面。剔除利用大多數(shù)對象均為封閉體這一事實;如果您有一個立方體,您將永遠不會看到背離您的面(前方始終只有一面朝向您),所以 Unity 不需要繪制背離的面。因此有了“背面剔除”一詞。
讓渲染看起來正確的另一個功能是“深度測試”。深度測試確保在場景中僅繪制距離最近的表面對象。
語法
Cull
控制應該剔除多邊形的哪些面(不繪制)
Back?不渲染背離觀察者的多邊形_(默認值)_,即剔除背面多邊形。
Front?不渲染面向觀察者的多邊形。用于從里到外翻轉(zhuǎn)對象。
Off?禁用剔除 - 繪制所有面。用于特殊效果。
ZWrite
控制是否將此對象的像素寫入深度緩沖區(qū)(默認值為 _On_)。如果要繪制實體對象,請將其保留為 on。如果要繪制半透明效果,請切換到?ZWrite Off
。有關更多詳細信息,請參閱下文。
ZTest
應如何執(zhí)行深度測試。默認值為 _LEqual_(將前方或遠處的對象作為現(xiàn)有對象繪制;隱藏其后面的對象)。
Offset
允許使用兩個參數(shù)指定深度偏移:_factor_ 和?units。Factor?相對于多邊形的 X 或 Y 縮放最大 Z 斜率,而?units?縮放最小可分辨深度緩沖區(qū)值。因此可強制將一個多邊形繪制在另一個多邊形上,盡管它們實際上位于相同位置。例如,Offset 0, -1
?將多邊形拉近攝像機并忽略多邊形的斜率,而?Offset -1, -1
?在觀察掠射角時進一步拉近多邊形。
示例
此對象將僅渲染對象的背面:
嘗試將它應用到一個立方體,并注意當您圍繞它轉(zhuǎn)動時幾何體感覺是錯誤的。這是因為您只看到了立方體的內(nèi)部部分。

具有深度寫入的透明著色器
通常,半透明著色器不會寫入到深度緩沖區(qū)。但是,這會產(chǎn)生繪制順序問題,尤其是復雜的非凸網(wǎng)格。如果您想淡入和淡出這樣的網(wǎng)格,那么在渲染透明度之前使用填充深度緩沖區(qū)的著色器可能會很有用。
調(diào)試法線
下一種情況更有趣;首先我們用法線頂點光照渲染對象,然后我們用亮粉色渲染背面。這樣將產(chǎn)生突出顯示需要翻轉(zhuǎn)法線的位置的效果。如果您看到物理控制的對象被任何網(wǎng)格“吸入”,請嘗試為它們分配此著色器。如果可以看到任何粉紅色的部分,這些部分會吸入任何不幸觸及它的東西。
我們開始吧:
玻璃剔除
控制剔除的用處不僅限于調(diào)試背面。如果您有透明對象,則通常需要顯示對象的背面。如果渲染時沒有任何剔除 (Cull Off),一些背面可能與一些正面重疊。
下面是一個簡單的著色器,適用于凸面體對象(球體、立方體或汽車擋風玻璃)。