UnityShader入门精要-3.3 UnityShader的结构
一個UnityShader的基礎結構如下所示:
Shader "ShaderName"{Properties{//屬性 } SubShader{//顯卡A使用的子著色器 }SubShader{//顯卡B使用的子著色器 }Fallback "VertexLit"}Unity在背后根據使用的平臺來吧這些結構編譯成真正的代碼和Shader文件,開發者只需要和UnityShader打交道即可。(Unity編寫Shader的語言是ShaderLab)
屬性:在Shader中訪問它們需要使用每個屬性的名字,這些屬性的名字通常由一個下劃線開始,還需要為屬性指定它的類型,還需要指定一個默認值,當第一次把該Shader賦給某個材質的時候,材質面板上顯示的就是這些默認值。
屬性類型:
| 標簽類型 | 說明 | 例子 |
| Queue | 控制渲染順序,指定該物體屬于哪一個渲染隊列,通 過這種方式可以保證所有的透明物體可以在所有不透 明物體后面被渲染(詳見第8章),我們也可以自定義 使用的渲染隊列來控制物體的渲染順序 | Tags{"Queue"="Transparent" } |
| RenderType | 對著色器進行分類,例如這是一個不透明的著色器, 或是一個透明的著色器等。這可以被用于著色器替換 (ShaderReplacement)功能 | Tags{"RenderType"="Qpaque"} |
| DisableBatching | 一些SubShader在使用Unity的批處理功能時會出現問 題,例如使用了模型空間下的坐標進行定點動畫。這時可 以通過該標簽來直接指明是否對改SubShader使用批處 理 | Tags{"DisableBatching"="True"} |
| ForceNoShadowCasting | 控制使用該SubShader的物體是否會投射陰影 | Tags{"ForceNoShadowCasting"="True"} |
| IgnoreProjector | 如果該標簽值為“True”,那么使用該SubShader的物 體將不會受Projectror的影響。通常用于半透明物體 | Tags{"IgnoreProjector"="True"} |
| CanUseSpriteAtlas | 當該SubShader是用于精靈(Sprite)時,將該標簽設 為“False” | Tags{"CanUseSpriteAtlas"="False"} |
| PreviewType | 指明材質面板將如何預覽該材質。默認情況下,材質 將顯示為一個球型,我們可以通過把該標簽的值設為 “Plane” "SkyBox" 來改變預覽類型 | Tags{"PreviewType"="Plane"} |
?需要注意的是,上述的標簽僅可以在SubShader中聲明,而不可以在Pass塊中聲明。Pass塊雖然也可以定義標簽,但這些標簽不同于SubShader的標簽類型。這是我們下面要講到的:
- Pass語義塊
? ? ?Pass語義塊包含的語義定義如下:
Pass{[Name][Tags][RenderSetup]//Other code }首先可以在Pass中定義該Pass的名稱,例如:
Name "MyPassName"通過這個名稱可以使用ShaderLab的UsePass命令來直接使用其他的UnityShader中的Pass。例如:
UsePass "MyShader/MYPASSNAME"這樣可以提高代碼的復用性。需要注意的是由于Unity內部會把素有的Pass的名稱轉換成大寫字母表示,因此在使用UsePass命令時必須使用大寫形式的名字。
其次,我們可以對Pass設置渲染狀態。SubShader的狀態設置同樣適用于Pass.除了上面提到的狀態設置外,在Pass中我們還可以使用固定管線的著色器命令。
?Pass同樣可以設置標簽,但它的標簽不同于SubShader的標簽,這些標簽也是用于告訴渲染引擎我們希望怎么樣來渲染該物體。下表給出了Pass中使用的標簽類型。
| 標簽類型 | 說明 | 例子 |
| LightMode | 定義該Pass在Unity的渲染流水線中的角色 | Tags{"LightMode"="ForwardBase"} |
| RequireOptions | 用于指定當滿足某些條件時才渲染該Pass,它的值是一個 由空格分隔的字符串。目前,Unity支持的選項有: SoftVegetation.在后面的版本中可能會增加更多的選項 | Tags{"RequireOptions"="SoftVegetation"} |
除了上面普通的Pass定義外,UnityShader還支持一些特殊的Pass,以便進行代碼服用或實現更復雜的效果。
- UsePass : 如上文所說,可以使用該命令來服用其他UnityShader中的Pass;?
- GrabPass : 該Pass負責抓取屏幕并將結果存儲在一張紋理中,以用于后續的Pass處理;
?
最后留一條路: Fallback
? 緊跟在各個SubShader語義塊后面的,可以是一個Fallback命令。他用于告訴Unity,"如果上面所有的SubShader在這塊顯卡上都不能運行,那么就使用這個最低級的Shader吧!"
? ? 它的語義如下:
Fallback "name" //或者 Falllback off?如上所述,我們可以通過一個字符串來告訴Unity這個“最低級的UnityShader”是誰。我們也可以任性的關閉Fallback功能,但一旦你這么做,你的意思大概就是:“如果一塊顯卡跑不了上面所有的Shader,那就不要管他了!”
? 下面給出一個使用Fallback的例子:
Fallback "VertexLit"? ?事實上,Fallback還會影響陰影的投射。在渲染陰影紋理時,Unity會在每個UnityShader中尋找一個陰影投射的Pass,通常情況下,我們不需要自己專門實現一個Pass, 這是因為Fallback使用 的內置Shader中包含了這樣一個通用的Pass。因此,為每個UnityShaer正確的設置Fallback是非常重要的。
? 除了上述語義,還有一些不常用到的語義。例如,如果我們不滿足于Unity內置的屬性類型,想要自定義材質面板的編輯界面,就可以使用CustomEditor語義來擴展編輯界面。我們還可以使用Category語義來對UnityShader中的命令進行分組。
?
轉載于:https://www.cnblogs.com/guoguoguo/p/7152503.html
總結
以上是生活随笔為你收集整理的UnityShader入门精要-3.3 UnityShader的结构的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Apache OFBIZ高速上手(二)-
- 下一篇: 【C#日期系列(一)】--C#获取某月第