【Unity Shader】--- 準確認識SubShader語義塊結構、渲染狀態設定、Tags標簽
一【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 設置剔除模式,剔除背面|正面|關閉剔除
ZTest ZTest Less Greater|LEqual|GEqual|Equal|NotEqual|Always 設置深度時使用的函數
ZWrite ZWrite On|Off 開啟和關閉深度寫入
Blend Blend SrcFactor DstFactor 開啟並設置混合模式
當在SubShader塊中設置了上述狀態,將會被應用於所有的Pass。如果不想這樣(例如在雙面渲染中,我們可以希望第一
個Pass剔除正面來對背面進行渲染,在第二個Pass中選擇剔除背面來對正面進行渲染),可以在Pass內部來單獨設置狀態。
三【Tags標簽】
UnityShader的Tags是一個鍵值對(Key/Value Pair),他的鍵和值都是字符串類型。這些鍵值是對SubShader和渲染引擎
之前溝通的橋梁。他們用於告訴渲染引擎:怎麽樣和什麽時候調用這個SubShader。
標簽語法如下:Tags{"TagName1" = "Value1" "TagName2" = "Value2"}
待續...32
【Unity Shader】--- 準確認識SubShader語義塊結構、渲染狀態設定、Tags標簽