TRANSFORM_TEX

TRANSFORM_TEX是Unity Shader里提供的一个获取正确的UV坐标的宏定义函数,它定义在UnityCG.cginc里:

// Transforms 2D UV by scale/bias property
#define TRANSFORM_TEX(tex,name) (tex.xy * name##_ST.xy + name##_ST.zw)

Vertex Shader的输入参数里已经传入了顶点的UV坐标了,为什么仍需要TRANSFORM_TEX来做转换呢?

原因是当我们的Shader中有对Texture进行引用、采样时,Unity的材质编辑器默认支持了对Texture的Tiling(平铺)和Offset。

没有通过TRANSFORM_TEX进行转换的UV坐标Tiling和Offset的设置就不会生效。那么Unity Shader是如何通过TRANSFORM_TEX实现Tiling和Offset的呢?答案就在它的宏定义里。

tex是传入的UV坐标,它是float4类型,但UV只使用了其xy值。

name是UV将要Sampler的Texture名,通过宏的##连成了一个叫name_ST的变量名,这个变量就是用来存储Tiling和Offset的,其中xy是Tiling,zw是Offset。

因此Unity Shader中当你定义一个Texture Sampler的时候(如sampler2D _MainTex;)总要同时定义一个float4变量(如float4 _MainTex_ST;),这个变量看似没被使用,其实是它的使用被包含在TRANSFORM_TEX里了。