Untiy Shader 結構
標題
//1、定義shader標題,通過/定義shader目錄
Shader "Custom/MyShader"{
}
複製程式碼
property
Properties用於定義Shader中需要使用的屬性
以下例子分別定義了Int、Float、2D紋理、Vector、Color的屬性
Shader "Custom/MyShader"{
Properties {
_IntValue("IntValue",Int) = 2
_FloatValue("FloatValue",Float) = 2.0
_MainTex("MainText",2D) = "black"{}
_Vector("Vector",Vector) = (1,1,2,3)
_Color("Color",Color) = (1,1,1,1)
}
}
複製程式碼
在Properties中定義的屬性最終會在Inspector中出現,開發可以在Inspector中過載其初始值
SubShader
定義一個顯示卡的渲染流程 可配置多個SubShader來定義不同顯示卡的渲染任務
Shader "Custom/MyShader"{
Properties{
}
SubShader{
Tags{} // 可選 標籤
RenderSetup{} //可選 狀態
Pass{ // 表示一次完整的渲染流程
}
}
}
複製程式碼
RenderSetup
RenderSetup沒有固定的關鍵字和結構體,只需在SubShader裡直接書寫對應指令即可,支援的指令如程式碼所示
Shader ...{
...
...{
//剔除指令 可剔除背面、正面渲染或關閉剔除
Cull Off/Back/Front
//深度測試使用的函式
ZTest Less Greater/LEqual/GEqual/Equal/NotEqual/Always
//深度寫入
ZWrite On/Off 開啟/關閉
//開啟和設定混合模式
Blend SrcFactor DstFactor
}
}
複製程式碼
所有的RenderSetup都會作用於每一個Pass,如果需要單獨對某個Pass進行不同的狀態設定,可以單獨在Pass裡定義以上指令
Tags
Tags以鍵值對的形式存在,其定義了 怎樣 和 何時 進行物件渲染
Shader ...{
...
...{
Tags {
"Queue" = "Transparent" //渲染順序
"RenderType" = "Opaque" //著色器分類,用於替換著色器
"DiableBatching" = "True" //是否使用批處理
"ForceNoShadowCasting" = "True" //是否使用投影
"IgnorProjector" = "True" //是否忽略Projector的影響
"CanUseSpriteAtlas" = "True" //是否用於精靈模型
"PreviewType" = "Plane" //設定在材質皮膚如何預覽該材質
}
}
}
複製程式碼
Pass
Shader ...{
...
...{
Pass{
Name "AAAA" //可選
Tags {
"LightMode" = "ForwardBase" //定義Pass在流水線中的的角色
"RequireOptions" = "SoftVegetation" //定義滿足某條件時渲染
}
[RenderSetup] //與SubShader裡的RenderSetup一致
// other code
}
UsePass "...." //可以使用該方式來複用已經定義的Pass 需要用大寫字母
}
}
複製程式碼
Fallback
Shader ...{
...
Fallback "VertexLit" // 如果顯示卡不支援Pass 用該模式
...{
Pass{
}
}
}
複製程式碼
Shader著色器
著色器是指用於渲染的一小段函式
-
按照處理的型別分:
-
頂點著色器:用於負責頂點的幾何計算和頂點的顏色計算。
-
片元著色器:負責片元的幾何計算和顏色計算。
-
-
根據著色器的程式碼型別
-
表面著色器 Unity中對頂點和片元著色器的高度封裝而成,不需要我們操心諸如光照等複雜場景處理。
Shader ...{ SubShader{ Tags {...} //表面著色器解除安裝SubShader裡 CGPROGRAM //在CGPROGRAM和ENDCG之間的就是表面著色器 #pragma surface surf Lambert struct Input{ float4 color : COLOR; }; void surf(Input IN,inout SurfaceOutput o){ o.Albedo = 1; } ENDCG } Fallback ... } 複製程式碼
-
頂點/片元著色器 基礎的著色器語言,也更復雜,封裝程度不如表面著色器,所以靈活性比表面著色器高。
Shader ...{ SubShader{ Tags{ ... } //頂點/片元著色器定義在Pass裡 Pass{ CGPROGRAM //在CGPROGRAM和ENDCG之間的就是頂點/片元著色器 #pragma vertex vert #pragma fragment frag float4 vert(float4 v : POSITION) : SV_POSITION { return mul (UNITY_MATRIX_MVP , v); } fixed4 frag() : SV_Target{ return fixed4(1.0,0.0,0.0,1.0); } ENDCG } } } 複製程式碼
-
固定函式著色器 一種古老的不可程式設計的著色器,只能實現固定簡單的功能 不展開講
-