<aside> <img src="/icons/exclamation-mark_gray.svg" alt="/icons/exclamation-mark_gray.svg" width="40px" /> Unity Shader是列優先

</aside>

Unity Shader代碼演示

Shader "Custom/Shader Name" {
	Properties {
		// 屬性...
	}

	SubShader {
		Pass {
			CGPROGRAM

			// 聲明vertex shader & fragment shader 的入口
			#pragma vertex vert
			#pragma fragment frag
		
			float4 vert (float4 v : POSITION) : SV_POSITION {
				return UnityObjectToClipPos (v);
			}

			fixed4 frag () : SV_Target {
				return fixed4 (1.0, 1.0, 1.0, 1.0);
			}
		}
	}

	Fallback ...
}

在新版Unity(5.6以上)中,會自動修改以下的代碼

return mul (UNITY_MATRIX_MVP, v.vertex);
// 修改為
return UnityObjectToClipPos (v.vertex);

兩個實際在做的事是一樣的,都是將頂點變換到齊次空間中。但實際上UnityObjectToClipPos() 比使用UNITY_MATRIX_MVP更快。

因為UNITY_MATRIX_MVP是將MVP三個矩陣相乘在一起的矩陣,而UnityObjectToClipPos()則是三個矩陣分別的運算。矩陣運算有以下的性質

uniform 關鍵字

Unityのシェーダのプロパティを使ってみる | 測度ゼロの抹茶チョコ

uniform 是修飾全局變量時使用的,不能用於shader中的輸入輸出。Unity Shader中的變量默認都為uniform,在Shader中不能修改,只能從外部修改。例如通過API進行修改,或者在Editor中修改。

Unity Shader提供的包