歡迎加入Unity業内qq交流群:956187480
一個簡單的頂點/片元着色器
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
Shader "a幻世界/頂點片元着色器"
{
//暴露在外面的屬性欄
Properties{
//聲明一個color屬性
_Color("Color",Color) = (1,1,1,1)
}
//針對顯示卡a的shubshader
SubShader{
Pass{
//設定渲染狀态和标簽
//開始CG代碼片段
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
//為了在cg代碼段通路_Color屬性,我們必須在這裡定義一個跟Properties裡面相對應的變量,名稱和類型必須一緻
float4 _Color;
//使用一個結構體來定義頂點着色器的輸入
struct a2v {
float4 pos:POSITION;//用模型空間的頂點填充pos變量
float4 color:COLOR0;//用模型空間的顔色填充color
float4 normal:NORMAL;//用模型的法線方向填充normal變量
float4 texcoord:TEXCOORD0;//用模型的第一套紋理坐标填充texcoord變量
};
//使用一個結構體來定義頂點着色器的輸出,在頂點着色器跟片元着色器之間傳遞資訊
struct v2f {
float4 pos:SV_POSITION;//SV_POSITION語義告訴unity,pos裡面包含了頂點在裁剪空間裡的位置資訊
float4 color:COLOR0;//COLOR0語義存儲顔色資訊
};
//寫一個輸出模型空間資訊輸出裁剪空間資訊的函數
v2f vert(a2v v) {
v2f o;//建立一個頂點着色器輸出的結構體
o.pos = UnityObjectToClipPos(v.pos);//把模型空間的頂點位置轉換到裁剪空間的位置
o.color = v.normal*0.5f + fixed4(0.5, 0.5, 0.5,0.5);//把模型空間的法線方向分量[-1,1]映射到裁剪空間傳遞給片元着色器
return o;
}
//片元着色器接收到頂點資訊後通過插值把顔色渲染到螢幕上
float4 frag(v2f i):SV_Target{
float4 c = i.color;
c *= _Color.rgba;
return fixed4(c);
}
ENDCG
}
//其他需要的pass
}
Fallback "Diffuse"
}