一【SubShader】
每個UnityShader文件可以包含多個SubShader語義塊,但至少要有一個。當Unity需要加載這個UnityShader時,
Unity會掃描所有的SubShader語義塊,然后選擇一個能夠在目標平台上運行的SubShader。如果都不支持的話,Unity
就會使用FallBack語義指定的UnityShader。
Unity提供這種語義的原因在於,不同的顯卡具有不同的能力。例如,一些舊的顯卡僅能支持一定數目的操作指令,
而一些高級的顯卡可以支持更多的指令數,那么我希望在舊的顯卡上使用計算復雜度較低的着色器,而在高級的顯卡上
執行計算復雜度高的着色器,以便提供更出色的畫面效果。
SubShader
{
//可選的
[Tags]
//可選的
[RenderSetup]
Pass
{
}
//或更多Pass
}
SubShader中定義了一系列的Pass以及可選的標簽[Tags]、狀態[RenderSetup]。每個Pass定義一次完整的渲染流程
但是如果Pass數目過多會造成渲染性能的下降。因此,我們盡量使用數量最小的Pass。
補充說明:[Tags][RenderSetup]也可以在Pass中聲明。不同的是,SubShader中的一些標簽設置是特定的。也就是說,
這些標簽和Pass中設置的標簽是不一樣的。而對於狀態設置來說,其使用的語法是相同。不過在SubShader進行的設置
將會用於所用的Pass。
二【渲染狀態】
ShaderLab提供了一系列渲染狀態的設定,這些指令可以設置顯卡的各種狀態,例如是否開啟混合/深度測試等。
狀態名稱 設置指令 解釋
Cull Cull Back|Front|Off 設置剔除模式,剔除背面|正面|關閉剔除 默認CullBack
ZTest ZTest Less Greater|LEqual|GEqual|Equal|NotEqual|Always 設置深度時使用的函數 默認ZTest LEqual 小於或等於目標深度才能被渲染
ZWrite ZWrite On|Off 開啟和關閉深度寫入 默認ZWrite On
Blend Blend SrcFactor DstFactor 開啟並設置混合模式
當在SubShader塊中設置了上述狀態,將會被應用於所有的Pass。如果不想這樣(例如在雙面渲染中,我們可以希望第一
個Pass剔除正面來對背面進行渲染,在第二個Pass中選擇剔除背面來對正面進行渲染),可以在Pass內部來單獨設置狀態。
三【Tags標簽】
UnityShader的Tags是一個鍵值對(Key/Value Pair),他的鍵和值都是字符串類型。這些鍵值是對SubShader和渲染引擎
之前溝通的橋梁。他們用於告訴渲染引擎:怎么樣和什么時候調用這個SubShader。
標簽語法如下:Tags{"TagName1" = "Value1" "TagName2" = "Value2"}
SubShader標簽類型:注意這些標簽只能在SubShader中聲明,不能再Pass中
標簽類型 說明 列 子
Queue 控制渲染順序,指定該物體屬於哪一個渲染隊列 Tags{"Queue" = "Transparent"}
RenderType 對着色器分類。例如:這是一個不透明着色器 Tags{"RenderType" = "Opaque"}
DisableBatching 一些SubShader在使用Unity批處理時會出現問題。
可以用該標簽直接表明是否使用批處理 Tags{"DisableBatching" = "True"}
ForecNoShadowCasting 控制該SubShader的物體是否會投射陰影 Tags{"ForceNoShadowCasting" = "True"}
IgnoreProjector 設置該SubShader的物體是否受Projector影響 Tags{"IgnoreProjector" = "True"}
True常用與半透明物體。
CanUseSpriteAtlas 當該SubShader用於“sprite”時,將該標簽設為False Tags{"CanUseSpriteAtlas" = "False"}
PriviewType 材質面板的預覽類型,一般默認材質預覽效果是球形 Tags{"PreviewType" = "Plane"}
還可以該為"Plane" "SkyBox"。
四【Pass語義塊】
Pass
{
[Name]
[Tags]
[RenderSetup]
//other code
}
1、[Name]Pass名稱
Pass的名稱,可以使用ShaderLab的UsePass命令來使用其他Shader的Pass代碼
例如:UsePass"MyShader/MYPASSNAME",這樣提高代碼復用性,
注意:UnityShader內部會自動把PassName轉換成大寫格式。
2、[RenderSetup]Pass渲染狀態設置
SubShader的渲染狀態也適用於Pass,而且Pass還可以適用固定管線着色器的命令
3、[Tags]Pass的標簽
Pass的標簽不同於SubShader標簽,這些標簽用於告訴渲染引擎我們希望如何來渲染物體
標簽類型 說明 例子
LightModel 定義該Pass在渲染管線中的角色 Tags{"LightModel"="ForwardBase"}
RequireOption 用於指定滿足某些條件是才渲染該 Pass Tags{"RequireOption" = "SoftVegetation"}
ColorMask 可以讓我們制定渲染結果的輸出通道,而不是通常情況下的RGBA這4個通道全部寫入。可選參數是 RGBA 的任意組合以及 0, 這將意味着不會寫入到任何通道。