Shader簡要概括:
1、Shader在可編程渲染流水線中,所處的位置是頂點着色器和片元着色器,這兩個部分是高度可編程的。
2、Unity的ShaderLab是Untiy特有的着色器編程語言,他是對Cg/HLSL/的一層封裝,是爲了簡化編程而誕生的。
3、Shader腳本和Material密切相關,和Material一起作用在GameObject上。
4、Unity的着色器包括2種類型,一種是表面着色器,一種是頂點/片元着色器。其中表面着色器其實是對頂點/片元着色器的更高一層封裝,它具有簡單,易用性,但同時犧牲了控制的靈活性。需要注意的是頂點/片元着色器的“頂點着色器”和“片元着色器”寫在同個shader文件裏面,兩個不連續的過程之所以可以放在一起,也是因爲Unity爲用戶進行了封裝。
5、一個Shader可以有多個SubShader,但必須至少有一個SubShader。
6、一個SubShader可以有多個Pass,多個Pass可以實現更加複雜的效果。
Shader結構:
shader結構包含了:聲明,屬性(Properties),SubShader,狀態設置,標籤(tags),Pass,Fallback。
1 聲明:例如 shader "Custom/MyShader" { } 其中"Custom/"表示文件路徑 "MyShader"表示這個Shader的名字
2 屬性:例如 Properties{ _Int("Int", Int) = 2 } 其中 _Int是在Shader腳本里面的變量名,"Int" 是在Inspector 上顯示的變量名, Int 是變量的屬性,= 是給這個變量默認值。
除了Int類型外,還有Float、Range(min,max)、Color、Vector、2D、Cube、3D。需要注意的是2D、Cube、3D的屬性語句是:
_2D("2D", 2D) = "white" {}, 其中"white"是系統內置的紋理,除了“white”還有“black”、“gray”、“bump”。
3 SubShader:SubShader包含了Pass模塊,狀態設置模塊和標籤模塊。Shader可以包含多個SubShader,每個SubShader的渲染級別不同,渲染過程中會選擇最合適的SubShader代碼塊來執行。
4 狀態設置:是ShaderLab提供用於設置渲染狀態的指令。常見的狀態設置有:
Cull Back | Cull Front | Cull Off :剔除模式:剔除背面/正面/關閉剔除;
ZTest Less Greater | ZTest LEqual | ZTest GEqual | ZTest Equal | ZTest NotEqual | ZTest Always :深度測試的判斷條件;
ZWrite On | ZWrite Off :開啓/關閉深度測試;
Blend SrcFactor DstFactor:開啓並設置混合模式;
5 標籤:是一個鍵值對,用於描述對象的渲染方式,形式如 Tags{ “Queue” = "Transfparent" }常見的Tags有:
"Queue" = "Transparent" :控制渲染順序;
"RenderType" = "Opaque" :對着色器進行分類,可用於着色器替換功能;
"DisableBatching" = "True" :使用模型空間下的頂點動畫可能會出現問題,指定該SubShader是否可以批處理;
"ForceNoShadowCasting" = "True" :該SubShader是否會投射陰影;
"IgnorProject" = "True" :表示物體是否不受Projector的影響,常用於半透明物體;
“CanUseSpriteAtlas” = "True" :該SubShader用於精靈時,應該設置爲"False";
"PreviewType" = "Plane" :指明材質面板應該以社麼形狀來預覽模型,一般是球形。
6 Pass:Pass可以包含命名、標籤(Tags)、渲染設置。可以用UsePass命令在其他Shader裏面調用該Pass。
7 FallBack:當shader裏面的所有SubShader都不符合當前運行環境時,便會執行FallBack,它告訴Unity用某個特定的Shader來執行渲染,當然也可以關閉,不使用任何Shader渲染。 例如:FallBack Off / FallBack "Name"。