頂點片段着色器
V&F Shader:英文全稱Vertex and Fragment Shader,最強大的Shader類型,也是我們在使用ShaderLab中的重點部分,屬於可編程管線,使用的是CG/HLSL語法。分為vertex頂點部分和Fragment像素部分。
本篇的末尾講述頂點函數傳入的結構體類型的參數appdata_base。
Shader "Custom/Exam1" { Properties { _MainTex ("Texture", 2D) = "white" { } //引號里面的"Texture"則是Unity檢視面板中對應顯示的屬性名稱 } SubShader { pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" sampler2D _MainTex; float4 _MainTex_ST; struct v2f { float4 pos : SV_POSITION; float2 uv : TEXCOORD0; } ; v2f vert (appdata_base v) { v2f o; o.pos = mul(UNITY_MATRIX_MVP,v.vertex); //MVP矩陣變換,將裁剪空間坐標轉換為相對屏幕位置的UV坐標 o.uv = TRANSFORM_TEX(v.texcoord,_MainTex); //TRANSFORM_TEX的作用是用頂點的UV v.texcoord和材質球的采樣圖片_MainTex做運算,確保頂點材質球里的縮放和偏移是正確的。 return o; } float4 frag (v2f i) : COLOR { float4 texCol = tex2D(_MainTex,i.uv); float4 outp = texCol; return outp; } ENDCG } } }
這里有一張圖片,直接山寨過來吧。
頂點片段着色器,用文字描述永遠不及一張圖解。
頂點函數傳入的結構體參數:
只要引用UnityCg.cginc頭文件(目錄Unity > Editor > Data > CGIncludes下)就可以使用預先設定好的結構體直接使用,他們分別有appdata_base appdata_tan和appdata_full:
如下所示:
注:頂點坐標和正切線為什么是float4,這有點意思,因為這里它表示是齊次坐標,比如我們這樣表示一個float4(x,y,z,w),當w = 1的時候它表示點(x,y,z),當w= 0的時候它表示一個向量(x,y,z)。區別就在這里,當W為1時表示點,當W為0時表示向量。
texcoord0和texcoord1分別表示兩層UV,有時候我們模型上的貼圖需要多個圖片一起貼在一處,那么貼兩層就會有兩層UV,至於更多的層數,這里就不講了,因為更深入的筆者也並不是特別了解,當然學過美術的,對這個應該是非常的了解。
以下三種類型為Unity內置的頂點Shader傳入結構體,如果想自定義也是可以的,但是自定義結構體里面的屬性,必須是基於appdata_full的,這樣才能識別出來,也就是自定義的結構里的屬性必須到appdata_full里的屬性里去選。
struct appdata_base { float4 vertex : POSITION; //頂點坐標 float3 normal : NORMAL;//法線 float4 texcoord : TEXCOORD0;//UV }; struct appdata_tan { float4 vertex : POSITION; float4 tangent : TANGENT; float3 normal : NORMAL; float4 texcoord : TEXCOORD0; }; struct appdata_full { float4 vertex : POSITION;//頂點坐標 float4 tangent : TANGENT;//正切 float3 normal : NORMAL;//法線 float4 texcoord : TEXCOORD0;//第一層UV float4 texcoord1 : TEXCOORD1; //第二層UV fixed4 color : COLOR; //顏色 };