2
當我只有TANGENT和BINORMAL向量時,是否可以計算出我的法向量法向量?計算法向量
float4 Binormal : BINORMAL ;
float4 Tangent : TANGENT ;
float4 Position : POSITION ;
當我只有TANGENT和BINORMAL向量時,是否可以計算出我的法向量法向量?計算法向量
float4 Binormal : BINORMAL ;
float4 Tangent : TANGENT ;
float4 Position : POSITION ;
據我瞭解,副法線矢量從正常和切向量通過交叉產品定義:
因此normal = binormal x tangent
,就是你寫的是正確的。
因爲根據DOC,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;
您將不得不提供更多信息。 – user3344003
通常將Normal作爲float3進行編碼更有意義,然後將.w組件設置爲1.0或-1.0的符號作爲float4相切。然後,您可以在着色器中重建副法線。請參閱[Lengyel方法](http://www.terathon.com/code/tangent.html)和[DirectXMesh](http://go.microsoft.com/fwlink/?LinkID=324981)。 –