1. 程式人生 > >【Unity Shader】--- 準確認識SubShader語義塊結構、渲染狀態設定、Tags標簽

【Unity Shader】--- 準確認識SubShader語義塊結構、渲染狀態設定、Tags標簽

strong blend 渲染引擎 引擎 語法 always 加載 setup 使用

一【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標簽