【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                      設置剔除模式,剔除背面|正面|關閉剔除  默認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, 這將意味着不會寫入到任何通道。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM