模型,顶点着色器,片元着色器的关系
Shader "Custom/Test" {
SubShader{
Pass{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
struct a2v {
float4 vertex : POSITION;
float3 normal:NORMAL;
float4 texcoord:TEXCOORD0;
};
struct v2f {
float4 pos : SV_POSITION;
fixed3 color : COLOR0;
};
/*void vert(in a2v v, out v2f a) {
a.pos = UnityObjectToClipPos(v.vertex);
a.color = v.normal * 0.5 + fixed3(0.5, 0.5, 0.5);
}*/
v2f vert(a2v v){
v2f o;
o.pos = UnityObjectToClipPos(v.vertex);
o.color = v.normal * 0.5 + fixed3(0.5,0.5,0.5);
return o;
}
fixed4 frag(v2f i) : SV_Target{
return fixed4(i.color,1.0f);
}
ENDCG
}
}
}
结构体a2v,里面塞进了顶点着色器需要的模型数据。模型的数据传递给顶点着色器,然后在顶点着色器里面编程,来计算各种必要的信息,输出到结构体v2f里面,给接下来的片元着色器准备好数据。
struct a2v {
float4 vertex : POSITION;
float3 normal : NORMAL;
float4 tangent : TANGENT;
float4 texcoord : TEXCOORD0;
fixed4 color : COLOR;
};
结构体v2f,把顶点着色器输出的数据整好,然后传递给片元着色器。在片元着色器里面进行复杂的计算,得到正确的颜色,最后输出到渲染目标中。
struct v2f {
float4 pos : SV_POSITION;
fixed3 color : COLOR0;
float4 texcoord : TEXCOORD0;
};
顶点着色器,片元着色器的数据来源与去向
TEXCOORD 还可以用于储存各种向量,例如灯光方向,视角方向等
学习资料:《unity shader入门精要》