Можно ли вычислить нормальный вектор сетки, когда у меня есть только векторы 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
, то есть, что вы написали правильно ,
Поскольку согласно документу, 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
:
Таким образом, код для перекрестного продукта должен, вместо этого, быть:
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;
Вам нужно предоставить больше информации, чем это. – user3344003
Как правило, имеет смысл кодировать Normal как float3, а затем касаться как float4 с компонентом .w, установленным на знак 1.0 или -1.0. Затем вы можете восстановить бинормаль в шейдере. См. [Метод Ленгеля] (http://www.terathon.com/code/tangent.html) и [DirectXMesh] (http://go.microsoft.com/fwlink/?LinkID=324981). –