unity-shader-TEXCOORD1 中的 xyzw

unity-shader-TEXCOORD1 中的 xyzw 可以用来存储 两个 uv 值


appdata_full 结构体定义了多个贴图坐标texcoord,texcootd1… 为使用多重纹理贴图,一个材质可以有多张贴图,每张贴图设置不同的uv坐标,子弹打在墙上,墙上有弹痕,还有墙体的涂鸦效果都可以用多重纹理实现,如果不使用多重纹理 texcoodtd1也可以使用它存放其它动态计算的信息。
texcoord 用float4应该是TEXCOORD0寄存器用的32位的,而后面XBOX360多的texcoord2-texcoord5用的是16位的寄存器,这跟硬件有关系,贴图坐标有1维、2维、3维的 使用float4和half4会更好,
比如我们使用最多的就是2维的普通的纹理贴图坐标,uv 分别存在texcoord.xy,texcoord.zw不使用,当然你也可以用texcoord.xyzw存储两个UV坐标,那么读取第二个UV坐标时,你必须先找到第一个的地址,所以为了执行效率浪费点空间是值得的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
struct appdata_full
{
float4 vertex : POSITION;
float4 tangent : TANGENT;
float4 texcoord : TEXCOORD0;
float4 texcoord1 : TEXCOORD1;
fixed4 color : COLOR;
#if defined(SHADER_API_XBOX360)
half4 texcoord2 : TEXCOORD2;
half4 texcoord3 : TEXCOORD3;
half4 texcoord4 : TEXCOORD4;
half4 texcoord5 : TEXCOORD5;
#endif
};