首页 > 技术文章 > TANGENT_SPACE_ROTATION的解释

laoyueblogs 2020-10-08 21:24 原文

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;
  }

 

推荐阅读