學習資料:http://www.sikiedu.com/course/37/task/433/show
本節學習目標:
- 學習Shader中結構體struct的使用。
- 學習在片元函數(vertex)和頂點函數(fragment)之間傳遞數據。
- 學習從應用程序傳遞到頂點函數(a2v)、從頂點函數傳遞到片元函數(v2f)、從片元函數傳遞回系統(f2a)時,各個階段中可以使用的語義。
Shader "Custom/02" { SubShader{ Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag struct a2v // 命名表示從應用程序傳遞到頂點函數,application to vertex { float4 vertex : POSITION; // 告訴Unity把模型空間下的頂點坐標填充給vertex屬性 float3 normal : NORMAL; // 告訴Unity把模型空間下的法線方向填充給normal屬性 float4 texcoord : TEXCOORD0; // 告訴Unity把第一套紋理坐標填充給texcoord屬性 }; struct v2f // 命名表示從頂點函數傳遞到片元函數,vertex to fragment { float4 position : SV_POSITION; float3 temp : COLOR0; // 屬性必須指定語義。該語意可以由用戶自定義,一般用於存儲顏色 }; // 計算頂點坐標從模型坐標系轉換到裁剪面坐標系 v2f vert(a2v v) { v2f f; f.position = mul(UNITY_MATRIX_MVP, v.vertex); f.temp = v.normal; return f; // 使用結構體struct就可以一次返回多個數據 } // 計算每個像素點的顏色值 fixed4 frag(v2f f) : SV_Target { return fixed4(f.temp, 1); // f.temp是float3已經包含了三個數值 } ENDCG } } FallBack "Diffuse" }
最終顯示的顏色值是每個像素點的法線方向的顏色值。參考右上角的世界坐標。
從應用程序傳遞到頂點函數(a2v)時,可以使用的語義:
- POSITION 頂點坐標(模型空間)
- NORMAL 法線(模型空間)
- TANGENT 切線(模型空間)
- TEXCOORD(0~n) 紋理坐標。x、y從0到1
- COLOR 頂點顏色
從頂點函數傳遞給片元函數(v2f)時,可以使用的語義:
- SV_POSITION 頂點坐標(剪裁空間),一般是系統直接使用
- COLOR0 可以傳遞一組值(4個)
- COLOR1 可以傳遞一組值(4個)
- TEXCOORD(0~7) 傳遞紋理坐標
從片元函數傳遞回系統(f2a)時,可以使用的語義:
- SV_TARGET 顏色值,顯示到屏幕上的顏色