为了使用纹理,首先需要在Properties语义块中添加一个纹理属性:
_MainTex("Main Tex", 2D) = "white"{
}
然后需要在Cg代码片中声明和上述属性相匹配的变量:
sampler2D _MainTex;
此外,我们还需要为纹理类型的属性声明一个float4类型的变量_MainTex_ST
.这个名字不是乱取的,在Unity中,需要使用纹理名_ST的方式来声明某个纹理的属性.S代表缩放,t代表平移.
接下来需要定义顶点着色器的输入和输出结构体:
struct a2v
{
float4 vertex : POSITION;
float3 normal : NORMAL;
float4 texcoord : TEXCOORD0;//unity将模型的第一组纹理坐标存储到该变量中
};
struct v2f
{
float4 pos : SV_POSITION;
float3 worldNormal : TEXCOORD0;
float3 worldPos : TEXCOORD1;
float2 uv : TEXCOORD2;//用于存储纹理坐标的变量uv
};
使用TEXCOORD0
语义声明了一个新的变量texcoord
,这样Unity就会将模型的第一组纹理坐标存储到该变量中.
然后定义顶点着色器:
v2f vert(a2v v)
{
v2f o;
o.pos = UnityObjectToClipPos(v.vertex);
o.worldNormal = UnityObjectToWorldNormal(v.normal);
o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;
o.uv = v.texcoord.xy * _MainTex_ST.xy + _MainTex_ST.zw;//先使用缩放值对顶点纹理坐标进行缩放,然后使用
//偏移属性对zw对结果进行偏移。
//o.uv = TRANSFORM_