计算法向量
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是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;
还有一个替代的混合版本(returns 一个大小为 3 的向量,如果你想要一个 4 项向量,请使用 float4(..., 1.0)
):
normal = binormal.yzx*tangent.zxy - binormal.zxy*tangent.yzx;
当我只有 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是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;
还有一个替代的混合版本(returns 一个大小为 3 的向量,如果你想要一个 4 项向量,请使用 float4(..., 1.0)
):
normal = binormal.yzx*tangent.zxy - binormal.zxy*tangent.yzx;