计算法向量

Calculate Normal Vector

当我只有 TANGENT 和 BINORMAL 向量时,是否可以计算我的网格法线向量?

      float4 Binormal : BINORMAL ;
      float4 Tangent  : TANGENT  ;
      float4 Position : POSITION ;

据我了解,副法向量是通过叉积从法向量和切向量定义的:

因此normal = binormal x tangent,即你写的是正确的

根据文档,the cross product is defined for vectors of size 3,您可以执行以下操作:

normal = float4(cross(binormal.xyz, tangent.xyz), 1.0);

这是使用我推荐的 HLSL 的叉积。但要更详细地了解,您实际上并没有执行 real cross product.

真正的公式应该是下面的,其中u是binormal,v是tangentsnormal

因此叉积的代码应该是:

normal.x = binormal.y*tangent.z - binormal.z*tangent.y;
normal.y = binormal.z*tangent.x - binormal.x*tangent.z;
normal.z = binormal.x*tangent.y - binormal.y*tangent.x;

还有一个替代的混合版本(returns 一个大小为 3 的向量,如果你想要一个 4 项向量,请使用 float4(..., 1.0)):

normal = binormal.yzx*tangent.zxy - binormal.zxy*tangent.yzx;