// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
Shader "Custom/FirstSimpleShader"{
SubShader{
Pass{
CGPROGRAM
#pragma vertex vert//告诉Unity哪个函数包含了顶点着色器的代码,哪个函数包含了片元着色器的代码
#pragma fragment frag
//使用一个结构体来定义顶点着色器的输入,把数据从应用阶段传递到顶点着色器中。
struct a2v {
float4 vertex:POSITION;//POSITION语义告诉Unity,用模型空间的顶点坐标填充vertex变量
float3 normal:NORMAL;//NORMAL语义告诉Unity,用模型空间的法线方向填充normal变量
float4 texcoord:TEXCOORD0;//用模型的第一套纹理坐标填充texcoord变量
};
float4 vert(a2v v) :SV_POSITION{//语义限定输入和输出
return UnityObjectToClipPos(v.vertex);
}
fixed4 frag() : SV_Target{
return fixed4(1.0,1.0,1.0,1.0);
}
ENDCG
}
}
}
填充到POSITION,TANGENT,NORMAL这些语义中的数据,由使用该材质的MeshRender组件提供的。在每帧调用Draw Call的时候,MeshRender组件会把它负责渲染的模型数据发送给Unity Shader。
一个模型通常包含一组三角形面片,每个三角形面片由三个顶点构成,而每个顶点又包括一些数据,例如顶点位置、法线、切线、纹理坐标、顶点颜色等。
通过上面方法,我们就可以在顶点着色器中访问顶点的这些模型数据。