1、根據(jù)Unity 3d引擎,可以知道一些常用的Unity Shader 模版
2、標準著色器模版信息
3、常用屬性標簽信息
4、Unity Shader 常用結構
//著色器名稱
Shader "ShaderName"
{
//屬性
Properties{Name("display name",propertyType)=DefaultValue}
//子著色器
SubShader
{
//可選標簽(告訴Unity 何時如何渲染對象)
[Tags]
//可選狀態(tài)設置(開關混合、深度測試、剔除模式、設置深度測試使用函數(shù))
[RenderSetup]
//完整渲染流程
Pass
{
[Name]
[Tags]
[RenderSetup]
}}
//SubShader 不能運行時執(zhí)行(同時渲染陰影)
Fallback "VertexLit"
}
5、淺析Properties 屬性:可以在引擎中屬性面板顯示Shader 屬性
定義:Name(“display name”,PropertyType)=DefaultValue
Name:名字,在Shader中訪問該變量時,即面板顯示的標簽名字
DisPlay Name:顯示名字,即面板顯示標簽的名字
PropertyType:屬性類型
DefaultValue:默認值
Properties {
? ? // Numbers and Sliders
? ? _Int ("Int", Int) = 2
? ? _Float ("Float", Float) = 1.5
? ? _Range("Range", Range(0.0, 5.0)) = 3.0
? ? // Colors and Vectors
? ? _Color ("Color", Color) = (1,1,1,1)
? ? _Vector ("Vector", Vector) = (2, 3, 6, 1)
? ? // Textures
? ? _2D ("2D", 2D) = "" {}
? ? _Cube ("Cube", Cube) = "white" {}
? ? _3D ("3D", 3D) = "black" {}
}
6、淺析SubShader 子著色器,每個Unity Shader 文件可以包含多個SubShader 語義塊,至少一個。在調(diào)用Shader時Unity會掃描所有SubShader并選擇一個可以在目標平臺運行的SubShader,若沒有合適的SubShader,系統(tǒng)就會調(diào)用Fallback語句定義的Unity Shader。
SubShader的代碼段的大體結構如下:
SubShader
{//可選的
[Tags]
//可選的
[RenderSetup]
Pass
{....}
//Other Passes}
其中[Tags]為標簽的設置,[RenderSetup]為一些通用狀態(tài)的設置,這兩者都是可有可無的,而Pass語句塊則定義了一次完整的渲染過程。在SubShader中可以定義多個Pass語句塊,在Pass中可以對只用于該Pass的狀態(tài)進行設置。一般編程時為了減少CPU和GPU的負擔會盡可能少的定義Pass語句塊。
SubShader中的常用狀態(tài)設置有以下幾個:
1.Cull Back/Front/Off
設置剔除模式:剔除背面/剔除正面/關閉剔除。
2.ZTest Less Greater/LEqual/GEqual/Equal/NotEqual/Always
設置深度測試時使用的函數(shù)。
3.ZWrite On/Off
開啟/關閉深度寫入。
4.Blend SrcFactor DstFactor
開啟并設置混合模式。
5.ColorMask RGB? |? A? |? 0? |? 其他任何R、G、B、A的組合
設置顏色通道的寫掩碼(write mask)
SubShader中的標簽(Tags)是一個鍵值對(Key/Value Pair),它的鍵和值都是字符串類型。用途是告訴渲染引擎怎樣以及何時渲染這個對象。其結構如下:
Tags { "TagName1" = "Value1" "TagName2" = "Value2" }//SubShader中主要的標簽類型有以下幾種:
Tags { "Queue" = "Transparent" }//控制渲染順序,制定該物體屬于哪一個渲染序列。
Tags { "RenderType" = "Opaque" }//對著色器進行分類如(透明/不透明)。
Tags { "DisableBatching" = "True" }//是否使用批處理。
Tags { "ForceNoShadowCasting" = "True" }//是否投射陰影。
Tags { "IgnoreProjector" = "True" }//是否不受Projector影響。
Tags { "CanUseSpriteAtlas" = "True" }//該SubShader是否不用于Sprite(精靈)。
Tags { "PreviewType" = "Plane" }//指明材質(zhì)面板會如何預覽該材質(zhì)如(球形“Sphere”、平面“Plane”等)。
上述標簽不可以寫在Pass里。
Pass語句塊的結構大致如下:
Pass{
[Name]
[Tags]
[RenderSetup]
//OtherCode
}
設在一個Pass中如下定義了Pass的名稱:
Name "MyPassName"
通過這個名稱,我們可以使用UsePass命令在其他的Unity Shader中調(diào)用這個Pass,例如:
UsePass "MyShader/MYPASSNAME"http://其中MyShader為定義了這個Pass的Unity Shader的名稱。
Pass同樣可以設置標簽來告訴渲染引擎怎樣渲染物體,但與上文中提到的SubShader中的標簽又不相同,Pass中的標簽有下面幾個類型:
Tags { "LightMode" = "ForwardBase" }//定義該Pass在Unity的渲染流水線的角色。
Tags { "RequireOptions" = "SoftVegetation" }//用于指定當滿足一定條件時才渲染該Pass。