Unity ShaderLab 框架全解析4-1 —— Pass(結構、Tag、State Set-up)

Unity ShaderLab 框架全解析4-1

該系列主要是根據Unity官方文檔和個人蒐集的知識對Unity ShaderLab框架進行總結,比較基礎,用於提高知識學習、複習的效率。對於文中給到的文章鏈接的作者表示感謝

Pass

Pass可以說是ShaderLab當中比較重要的組成部分,當中包含着渲染核心——着色器(當然這裏以頂點-片段着色器爲例,表面着色器雖然沒有Pass,但本質上也是頂點-片段着色器的封裝)

一個Pass的基本結構如下(對應解釋在代碼註釋中給到):

Pass
		{
			Name "name"//可以定義Pass名(可以不定義),便於以後在其他Subshader當中複用該Pass
			
			//Pass特有的Tags
			Tags{……}			

			//渲染狀態設定區域
			//使用一系列指令設定Pass的渲染方式,具體指令下方會進行整理
			//……
			
			
			//用CGPRGRAM和下面的ENDCG包圍的代碼即頂點和片段着色器,這裏也可以使用其他Shader語言比如HLSL/GLSL
			//例如HLSLPROGRAM和ENDHLSL
			CGPROGRAM 
			
			#pragma vertex vert//定義頂點着色器函數
			#pragma fragment frag//定義片段着色器函數
			
			//頂點着色器函數參數輸入結構體
			struct a2v 
			{
		
			};
			//片段着色器函數參數輸入結構體
			struct v2f
			{

			};

			//頂點着色器函數
			v2f vert (a2v v)
			{
			
			}
			
			//片段着色器函數
			fixed4 frag (v2f i) : SV_Target
			{	
			
			}
			
			ENDCG
		}

+++++++++++++++++++++++++++++++++++++++++++手動分割線+++++++++++++++++++++++++++++++++++++++++++++++++++++
Pass的Tag
Pass的Tag用來控制自己何時怎樣用來渲染。
Pass的Tag和Subshader的Tag類似,都是如下的鍵值對:

Tags { "TagName1" = "Value1" "TagName2" = "Value2" }

接下來介紹的Unity內置Tag必須放在Pass內被Unity識別,不能放在Subshader當中。

LightMode:
用來定義Pass在光照管道中的角色,本文目前只給出可能用到的Tag和對應的簡單解釋,因爲LightMode和渲染管線相關,關係到一些更加複雜的知識,在之後的文章當中會有詳細解釋,這裏暫不提及。

Always: 總是渲染,不處理光照
ForwardBase: 在前向渲染管線當中使用,處理環境光、最亮的直射光、頂點光照和球諧函數光照以及光照貼圖。
ForwardAdd: 在前向渲染管線當中使用,處理像素光源
Deferred: 在延遲渲染管線當中使用,渲染G-Buffer
ShadowCaster: 渲染對象的深度到陰影紋理或者深度紋理當中
MotionVectors: 用來計算每個對象的的動態向量
剩餘的Unity遺留的Tags這裏給出官方文檔鏈接

PassFlags
用來控制渲染管線傳遞什麼樣的數據到該Pass當中使用。目前支持的Tag值是:
OnlyDirectional:當使用前向渲染的ForwardBase Pass時,只有directional light 和ambient/lightprobe 數據傳入Pass,意味着不重要光源(not-important)不會把數據傳遞到vertex-light 或者 spherical harmonics變量當中
RequireOptions
用來控制只有當遇到特殊情況時使用該Pass,目前支持的Tag值是:

SoftVegetation: 當開啓軟植被(Soft Vegetation)時調用該Pass(Soft Vegetation具體含義參考:Soft Vegetation

+++++++++++++++++++++++++++++++++++++++++++手動分割線+++++++++++++++++++++++++++++++++++++++++++++++++++++

下面整理一下渲染狀態指令(部分指令對應值含義不做解釋):

=========================================================================================================
Cull
Cull Back | Front | Off

剔除

=========================================================================================================
ZWrite
ZWrite On | Off

深度寫入 如果渲染不透明實體,開啓;渲染半透明對象,關閉

=========================================================================================================
ZTest
ZTest Less | Greater | LEqual | GEqual | Equal | NotEqual | Always

深度測試 符合深度比對結果則通過深度測試,默認爲LEqual,即小於等於深度緩衝區中深度的可以將顏色寫入顏色緩衝區,關閉深度寫入相當於Always;另外,即使ZWrite On,不通過深度測試,也無法寫入深度。

=========================================================================================================
Offset
Offset Factor, Units

z偏移值Offset = Factor * 深度斜率+Units * 深度值可解析差異的最小值

深度斜率:z值相對於x和y值變化而變化中較大的那個(個人理解如有錯誤請指正)

這個指令主要可以用來解決Z-fighting問題,即當兩個多邊形面的深度相同或者由於深度值的精度限制無法將它們表現爲不同時,就會發生顯示錯誤,一般是兩個多邊形的顏色交錯顯示,在Unity當中可以直接用相同位置的模型來模擬:
在這裏插入圖片描述
通過在指令當中設定這兩個值的大小,可以在執行深度測試之前和深度值寫入深度緩衝區之前對z值添加偏移,使顯示結果正確或者至少不是明顯的錯誤:

下面的兩個多邊形的前面是完全重合的,兩個正方體使用的都是純色無光shader
在這裏插入圖片描述
在藍色正方體材質的着色器中Pass中添加如下語句:

Offset 1,0

則會變成如下效果,根據上面的公式可知Z深度值變大,和相機距離變大,則會顯示在紅色正方體後面。
(另外也可以使用同一個shader,用兩個不同的材質球進行測試,將Offset的兩個數值暴露出來在兩個材質球上進行分別更改)
在這裏插入圖片描述

=========================================================================================================
Blend
經過着色器的計算,Blend指令來控制得到的顏色和已經存在緩衝區中的顏色的組合方式,一般只有半透明物體會用到混合,當然想要實現特殊效果同樣可以使用。
下面用SrcColor來代表本次計算得到的顏色,DstColor來代表緩衝區中的顏色。Op代表着兩個顏色組合的運算方式。經過以上運算之後的顏色再填充到顏色緩衝區當中。

Blend Off: 關閉混合(默認)

Blend SrcFactor DstFactor: Op(SrcFactor * SrcColor,DstFactor * DstColor) ,Op默認爲相加

Blend SrcFactor DstFactor, SrcFactorA DstFactorA:
Op(SrcFactor * SrcColor.rgb,DstFactor * DstColor.rgb)
Op(SrcFactorA * SrcColor.a,DstFactorA * DstColor.a)

BlendOp OpColor, OpAlpha: 設置顏色和透明度的運算方式
具體的Op參照官方文檔注意使用邏輯運算的時候,會忽略定義的SrcFactor DstFactor參數,直接用顏色進行邏輯運算):

另外,下面的定義表示在使用MRT(多目標渲染)時可以對不同的渲染目標設定不同的混合方式,N代表渲染目標索引。(這裏暫時不做深入研究)
Blend N SrcFactor DstFactor
Blend N SrcFactor DstFactor, SrcFactorA DstFactorA
BlendOp N Op
BlendOp N OpColor, OpAlpha

SrcFactor DstFactor,SrcFactorA DstFactorA的設置在Unity當中可以使用預設值,同參照官方文檔

Unity ShaderLab 框架全解析4 —— 未完待續……

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章