当我只有TANGENT和BINORMAL向量时,是否可以计算我的网格法线向量?
float4 Binormal : BINORMAL ;
float4 Tangent : TANGENT ;
float4 Position : POSITION ;
答案 0 :(得分:4)
据我所知,通过交叉乘积从正常向量和切向向量定义了副法向量:
因此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是tangent
而s
是normal
:
因此,交叉产品的代码应该是:
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;
另一个混合版本(返回大小为3的向量,如果你想要一个4项向量,则使用float4(..., 1.0)
):
normal = binormal.yzx*tangent.zxy - binormal.zxy*tangent.yzx;