Ember

computeTangent

Jul 19th, 2013
113
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 0.72 KB | None | 0 0
  1. float4 computeTangent(float3 wsPosition, float3 wsNormal, float2 texCoord)
  2. {
  3. // compute cotangent T and cobitangent B
  4. float3 Q1 = ddx(wsPosition);
  5. float3 Q2 = ddy(wsPosition);
  6. float2 st1 = ddx(texCoord);
  7. float2 st2 = ddy(texCoord);
  8.  
  9. float r = 1 / (st1.x * st2.y - st2.x * st1.y);
  10.  
  11. float3 sdir = float3((st2.y * Q1.x - st1.y * Q2.x) * r, (st2.y * Q1.y - st1.y * Q2.y) * r, (st2.y * Q1.z - st1.y * Q2.z) * r);
  12. float3 tdir = float3((st1.x * Q2.x - st2.x * Q1.x) * r, (st1.x * Q2.y - st2.x * Q1.y) * r, (st1.x * Q2.z - st2.x * Q1.z) * r);
  13.  
  14. float4 T;
  15. T.xyz = normalize(sdir - wsNormal * dot(wsNormal, sdir));
  16. T.w = (dot(cross(wsNormal, sdir), tdir) < 0) ? -1 : 1;
  17.  
  18. return T;
  19. }
Advertisement
Add Comment
Please, Sign In to add comment