TANGENT_SPACE_ROTATION的解釋


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM