- Unity支持的语义有:POSITION、NORAML、TEXCOORD(0-3)、COLOR、SV_POSITION、TANGENT等
- a2v (把数据从应用阶段传递到顶点着色器中)
这些语义是由使用该材质的Mesh Render组件提供的。在每帧调用Draw Call的时候,Mesh Render组件会把它负责渲染的模型数据发给Unity Shader。而一个模型通常包括一组三角面片,每个三角面片由3个顶点构成,而每个顶点又包含了一些数据(例如顶点位置,法线切线纹理坐标等)。通过上面方法,我们就可以在顶点着色器中访问顶点的这些模型数据
- v2f (用于顶点着色器和片元着色器之间传递信息)
在顶点着色器的输出结构中,必须包含一个变量,它的语义是SV_POSITION,否则渲染器将无法得到裁剪空间中的顶点坐标,也无法把顶点渲染到屏幕上。
- 片元着色器中的输入实际上是把顶点着色器的输出进行插值后得到的结果。
Shader "Custom/testShader" {
properties{
_Color ("my color", Color) = (1.0, 1.0, 0, 1.0)
}
subshader {
pass{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
fixed4 _Color;
struct a2v
{
float4 vertex : POSITION; //语义告诉unity,用模型空间的顶点坐标填充vertex变量
float3 normal : NORMAL; //告诉unity,用模型空间的法线向量填充normal变量
float4 texcoord : TEXCOORD0; //用模型的第一套纹理坐标填充texcoord变量
};
struct v2f
{
float4 pos : SV_POSITION; //告诉unity,pos里包含了顶点在裁剪空间中的位置信息
fixed3 color: COLOR0; //存储颜色信息
};
v2f vert(a2v v)
{
v2f o;
o.pos = mul(UNITY_MATRIX_MVP, v.vertex); //使用v.vertex来访问模型空间的顶点坐标
o.color = v.normal * 0.5 + fixed3(0.5, 0.5, 0.5); //存储到o.color中再传递给片元着色器
return o;
}
fixed4 frag(v2f i) : SV_Target
{
fixed3 c = i.color;
c *= _Color.rgb;
return fixed4(c, 1.0); //将插值后的i.color显示到屏幕上
}
ENDCG
}
}
}
网友评论