2015-01-14 1 views
2

Можно ли вычислить нормальный вектор сетки, когда у меня есть только векторы TANGENT и BINORMAL?Вычислить нормальный вектор

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

Вам нужно предоставить больше информации, чем это. – user3344003

+1

Как правило, имеет смысл кодировать Normal как float3, а затем касаться как float4 с компонентом .w, установленным на знак 1.0 или -1.0. Затем вы можете восстановить бинормаль в шейдере. См. [Метод Ленгеля] (http://www.terathon.com/code/tangent.html) и [DirectXMesh] (http://go.microsoft.com/fwlink/?LinkID=324981). –

ответ

4

Насколько я понимаю, вектор бинормальная определяется из нормальных и касательных векторов через векторное произведение:

binormal = tangent x normal

Таким образом 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.

Реальная формула должна быть следующей, где и binormal, v является tangent и s является normal:

formula of cross product

Таким образом, код для перекрестного продукта должен, вместо этого, быть:

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; 

И альтернативная, swizzled версия (которая возвращает вектор размера 3, используйте float4(..., 1.0), если вы хотите 4-элементный вектор):

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