TANGENT_SPACE_ROTATION 宏 相當於嵌入如下兩行代碼:
float3 binormal = cross( v.normal, v.tangent.xyz ) * v.tangent.w;
float3x3 rotation = float3x3( v.tangent.xyz, binormal, v.normal );
也就是構造出 tangent space 的坐標系, 定義轉換world space的向量到tangent space的rotation 矩陣。
TANGENT_SPACE_ROTATION這行代碼之后,就可以用rotation這個代表從世界坐標到切線空間的矩陣了。不過要記得TANGENT_SPACE_ROTATION后面要加分號“;”的,比如:
struct v2f {
float4 pos:SV_POSITION;
float2 uv:TEXCOORD0;
float3 lightDir:TEXCOORD1;
};
v2f vert (appdata_full v) {
v2f o;
o.pos=UnityObjectToClipPos(v.vertex);
o.uv=v.texcoord.xy;
TANGENT_SPACE_ROTATION;
o.lightDir= mul(unity_WorldToObject, _WorldSpaceLightPos0).xyz;//Direction Light
o.lightDir=mul(rotation,o.lightDir);
return o;
}
float4 frag(v2f i):COLOR
{
float3 N=UnpackNormal(tex2D(_BumpMap,i.uv));
float diff=max(0,dot(N,i.lightDir));
float4 c=_LightColor0*diff;
return c*2;
}