一. ShaderLab 代碼整體布局
Shader "Shader名字"
{
//1.屬性塊
Properties{}
//2.代碼塊
CGINCLUDE
...
ENDCG
或者
HLSLINCLUDE
...
ENDHLSL
或者
GLSLINCLUDE
...
ENDGLSL
//3.子著色器串列塊
SubShader{
Tags{}
Pass{...}
Pass{...}
...
}
SubShader{...}
...
//4.備用著色器定義塊
FallBack "..."
}
二. 材質屬性定義
-
關鍵字:Properties
-
屬性定義格式:
屬性名("屬性描述",屬性型別) = 屬性默認值 -
用處:只要在這里被定義的屬性,就在Unity的Editor中,被材質的默認Inspector識別.也就是說可以通過編輯器修改這個屬性,設定預設值.
- 需要注意:
-
每個屬性的定義,在陳述句最后一定不能有分號
-
這里定義了某個屬性,那么使用這個Shader的材質,本屬性就是不會被SetGlobalxxx來改變的.
-
-
布局示例:
Properties
{
//主顏色,型別:顏色
_Color ("Main Color", Color) = (1, 1, 1, 1)
//顏色的調整值, 型別:范圍值
_ColorMultiplier("Color Multipler", Range(0,10)) = 2
//主紋理, 型別:紋理
_MainTex ("Effect Texture", 2D) = "black" {}
//環境立方體貼圖, 型別: 立方體貼圖
_EnvCube("Env Cube", Cube) = "white" {}
//切割區域, 型別:向量
_ClipRect("ClipRect", Vector) = (-50000,-50000,50000,50000)
//曝光系數, 型別:浮點值
_BloomFactor("BloomFactor", Float) = 0
}
三. 邏輯代碼區域
- 關鍵字:會根據使用的語言有不同.
-
cg語言:CGINCLUDE ... ENDCG
-
hlsl語言:HLSLINCLUDE ... ENDHLSL
-
glsl語言:GLSLINCLUDE ... ENDGLSL
-
-
用處:當前著色器中需要有不同邏輯的子著色器或者pass時,方便代碼撰寫和統一管理.也是為了用于分離業務邏輯定義和渲染標記定義.
- 需要注意:
-
每個著色器的代碼檔案中盡量只有一個邏輯代碼塊.
-
每個著色器的代碼檔案中盡量只使用一種高級語言,cg,hlsl,glsl.其中cg和hlsl語法幾乎一樣,并且推薦使用這兩種.
-
在定義結構體時,一定不要忘記在定義的結束大括弧后加上分號
-
如果這個代碼塊內容需要被共享給其他著色器代碼檔案,那么可以把這個代碼塊提取出來,另外放到一個檔案中,然后通過#include的方式參考.(如果是cg代碼就放到xxx.cginc檔案,如果時hlsl代碼就放到xxx.hlsl檔案中.)
-
-
布局示例
//1.參考區域
#include "...";
...
//2.常量或者宏的定義區域
#define _XXX_XXX_ON 1
static float xxx = 23;
const float xxx = 23;
...
//3.結構體的定義區域
struct xxx {};
...
//4.需要外部賦值的變數定義區域
uniform float xxx;
...
//5.通用方法定義區域
inline float getNoise(...)
{...}
void resetValue(...)
{...}
//6.頂點程式定義區域
v2f vert(appdata v)
{...}
v2f vertAdd(appdata v)
{...}
v2f vertBlend(appdata v)
{...}
...
//7.片元程式定義區域
fixed4 frag(v2f i):SV_Target
{...}
fixed4 fragAdd(v2f i):SV_Target
{...}
fixed4 fragBlend(v2f i):SV_Target
{...}
...
四. 可匹配的著色器串列
-
關鍵字: SubShader
-
用處:這里定義一系列的SubShader,在需要著色時,應用會從上到下的順序,一個一個篩選可以執行的著色器.
- 注意:
-
可以有多個子著色器.
-
每個子著色器內部可以有多個渲染遍Pass.
-
排列著色器代碼時,一定把你最希望匹配的子著色器放在最前面.
-
-
布局:
SubShader
{
//1.子著色器等級
LOD 100
//2.標簽
Tags{...}
//3.渲染設定串列
[Render Setup]
//4.渲染遍串列(走一遍GPU的渲染流程,叫做渲染遍 Pass)
Pass
{
...
}
Pass
{
...
}
//5.參考其他Shader的渲染遍.
UsePass "某個Shader的名字/Pass名字"
...
}
- 下面介紹一下子著色器的一些關鍵元素
-
著色標簽:
-
關鍵字: Tags
-
格式模板:
Tags{"Tag1"="Tag1Value" "Tag2"="Tag2Value"} -
用處: 這里的標簽是給Unity3D的渲染邏輯使用的,用于判斷在Unity渲染處理中是否執行某個邏輯.也可以自定義一些標簽,用于自己獨有的邏輯.
-
注意:
-
Tags標簽可以在SubShader的域中定義,也可以在Pass的域中定義.
-
標簽和值中間的賦值等號之間不可以有空格.
-
每個標簽之間使用空格分隔.
-
標簽和值都是用引號包括的字串內容.
-
-
一些常用標簽的
-
Queue:這個是用來表示當前著色器在哪個渲染佇列中.
渲染佇列 描述 渲染佇列值 Background 這個佇列被最先渲染,它被用于skyboxes等, 1000 Geometry 這是默認的渲染佇列,它被用于絕大多數物件,不透明幾何體使用該佇列, 2000 AlphaTest 通道檢查的幾何體使用該佇列,它和Geometry佇列不同,對于在所有立體物體繪制后渲染的通道檢查的物件,它更有效, 2450 Transparent 該渲染佇列在Geometry和AlphaTest佇列后被渲染,任何通道混合的(也就是說,那些不寫入深度快取的Shaders)物件使用該佇列,例如玻璃和粒子效果, 3000 Overlay 該渲染佇列是為覆寫物效果服務的,任何最后被渲染的物件使用該佇列,例如鏡頭光暈, 4000 -
LightMode:這個是用來表示當前著色器選擇哪個光照模式
光照模式 描述 Always 適用與任何渲染模式,不使用任何光源 ForwardBase 用于前向渲染, 只能夠使用:環境光,主光源,頂點/球諧光,光照貼圖 ForwardAdd 用于前向渲染, 附加每個像素光源,每個pass對應一個像素光源. Deferred 用于延遲渲染, 渲染G-Buffer ShadowCaster 用于渲染物件深度到陰影貼圖或者深度貼圖 PrepassBase 用于遺留的延遲照明,渲染法線和高光指數 PrepassFinal 用于遺留的延遲照明,通過結合紋理,照明和發射渲染最終的顏色, Vertex 用于遺留的沒有光照貼圖的頂點光渲染,所有頂點都能被使用. VertexLMRGBM 用于遺留的帶有光照忒圖的頂點光渲染,在PC平臺,這里的光照貼圖使用RGBM格式來編碼. VertexLM 用于遺留的帶有光照忒圖的頂點光渲染;在移動平臺,這里的光照貼圖使用double-LDR格式來編碼 -
RenderType:渲染型別,這個用處挺多,比如:Unity生成的深度圖,就是利用這個標簽.我們也可以使用這個標簽,不過要使用Camera.SetReplacementShader函式.
-
-
-
渲染設定標記 (Render Setup )
-
關鍵字:這個太多了,Blend,ZTest,ZWrite,Cull,Lighting 等等.
-
用處:這里的標記主要是給GPU用的,通道設定顯示硬體的各種狀態,例如能打開alpha混合,能使用霧,等等
-
注意:
-
標記定義完成后,不能有分號作為結束.
-
標記和值之間都是使用空格作為分割.
-
標記與標記之間使用空格或者換行作為分割.
-
-
一些常用標記的作用
標記格式 值串列 描述 Lighting VALUE On; Off 開啟或關閉頂點光照,開啟燈光之后,頂點光照才會有作用 Cull VALUE Back; Front; Off 設定多邊形剔除模式 ZTest VALUE (Less; Greater; LEqual; GEqual; Equal; NotEqual; Always) 設定深度測驗模式 ZWrite VALUE On ; Off 設定深度寫模式 Fog {VALUE} Mode; Color; Density; Range 設定霧引數:模式,顏色,密度,區域 AlphaTest VALUE1 VALUE2 (Less; Greater; LEqual; GEqual; Equal; NotEqual; Always) CutoffValue 開啟alpha測驗 Blend VALUE1 VALUE2[,VALUE3 VALUE4] Zero; One; SrcAlpha; SrcColor; DstAlpha; DstColor; OneMinusXXXX 設定alpha混合模式 ColorMask VALUE RGB; A; 0; any combination of R, G, B, A 設定顏色寫遮罩,設定為0將關閉所有顏色通道的渲染 Offset VALUE1,VALUE2 float 型別值 設定深度偏移
-
-
著色器等級
-
關鍵字: LOD
-
格式:
LOD 整數值 -
用處: 用于在渲染時篩選子著色器.
-
注意: 定義Lod數值越大的SubShader,應該放在前面.
-
-
渲染遍Pass
-
關鍵字: Pass,UsePass
-
用處: 每個Pass都表示從頭到尾執行一遍GPU渲染流程.這里主要定義渲染設定,編譯設定等.(本來這里可以定義業務邏輯,不過我們規范把業務邏輯全部定義到邏輯代碼區域中.)
- 注意:
-
在Pass中也可以使用著色標簽和渲染設定,如果與SubShader中的有重復,就應用Pass中的.
-
每個Pass就是一次渲染提交,盡量減少Pass的數量.
-
在Pass中定義Name時,一定要使用全部大寫.
-
使用UsePass關鍵字,可以參考其他著色代碼檔案中的Pass.參考格式為:
UsePass "Shader名字/Pass名字" -
這里如果這里沒有邏輯的話,每個行后就不要有分號
-
-
布局示例:
Pass{ //1.定義名字 Name "全部大寫的Pass名字" //2.標簽 Tags{...} //3.渲染設定串列 [Render Setup] //4.使用cg或者hlsl語言來寫的,決定著色器如何編譯的一些編譯指令. //cg語言 CGPROGRAM #pragma target 3.0 #pragma vertex vert #pragma fragment frag #pragma multi_compile _XXX_ON _XXX_OFF #pragma multi_feature _XXXX_ON _XXXX_OFF .... ENDCG 或者 //hlsl語言 HLSLPROGRAM #pragma target 3.0 #pragma vertex vert #pragma fragment frag #pragma multi_compile _XXX_ON _XXX_OFF #pragma multi_feature _XXXX_ON _XXXX_OFF .... ENDHLSL 或者 //glsl語言 GLSLPROGRAM .... ENDGLSL } -
-
五. 備用著色器
-
關鍵字: FallBack
-
用處:當所有的子著色器都不被匹配時,就執行這里指定的著色器
- 注意:
-
這里指定的是一個著色器的名字,并不是檔案路徑名.
-
如果使用關鍵字Off,就表示關掉了這個退路.
-
-
示例:
Fallback "Gonbest/FallBack/FBWithShadowAlpha"

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/317683.html
標籤:其他
上一篇:關于unity 目錄出錯的問題
下一篇:菜鳥騰飛計劃3
