一個簡單的頂點/片元着色器(續)
參考資料: Unity Shader 入門精要 馮樂樂著 第5章開始Unity Shder 學習之旅 P101
頂點着色器和片元着色器之間的通信
頂點着色器的輸入
//定義一個結構體,用來作爲頂點着色器的輸入
struct a2v{
float4 vertex:POSITION;
float3 normal:NORMAL;//法線,暫時用不到
float4 texcoord:TEXCOORD;//紋理,暫時用不到
};
頂點着色器的輸出
//定義一個結構體,用來作爲頂點着色器的輸出,也就是片元着色器的輸入
struct v2f{
float4 pos:SV_POSITION;//SV_POSITION 是Unity定義的語義,代表是在裁剪空間
fixed3 color:COLOR0;
};
完整的代碼
Shader "Custom/test_shader_light"
{
Properties
{
//聲明瞭一個屬性
_Color ("Color Tint",Color) =(1.0,1.0,1.0,1.0)
}
SubShader
{
Pass{
CGPROGRAM
//編譯指令,它們將告訴Unity ,哪個函數包含了頂點着色器的代碼,哪個函數包含了片元着色器的代碼
#pragma vertex vert
#pragma fragment frag
//在Unity 中,必須要有變量名與Properties 中定義的的屬性名保持一致
fixed4 _Color;
//定義一個結構體,用來作爲頂點着色器的輸入
struct a2v{
float4 vertex:POSITION;
float3 normal:NORMAL;//法線,暫時用不到
float4 texcoord:TEXCOORD;//紋理,暫時用不到
};
//定義一個結構體,用來作爲頂點着色器的輸出,也就是片元着色器的輸入
struct v2f{
float4 pos:SV_POSITION;//SV_POSITION 是Unity定義的語義,代表是在裁剪空間
fixed3 color:COLOR0;
};
//頂點着色器的代碼,它將模型空間的點轉換到裁剪座標系中。
v2f vert(a2v v){
v2f o;
o.pos = UnityObjectToClipPos(v.vertex);
o.color = fixed3(0.5,0.5,0.5);//沒有特別的含義
return o;
}
//片元着色器的代碼,直接使用定義的Color 屬性
fixed4 frag(v2f i ):SV_Target{
fixed3 c = i.color;
c *= _Color.rgb;
return fixed4(c,1.0);
}
ENDCG
}
}
FallBack "Diffuse"
}
需要注意的是,頂點着色器是逐頂點調用的,而片元着色器是逐片元調用的。片元着色器的輸入實際是把頂點着色器的輸出金星插值後得到的結果