Как вычислить касательную и бинормальное?

Говоря о картировании рельефа, зеркальном освещении и подобных вещах в OpenGL Shading Language (GLSL)

У меня есть:

  • Массив вершин (например, {0.2,0.5) , 0,1, 0,2,0,4,0,5, ...})
  • Массив нормалей (например, {0,0,0,0,1.0, 0,0,1,0,0.0, ...})
  • Положение точечного источника света в мировом пространстве (например, {0.0,1.0, -5.0})
  • Положение зрителя в мировом пространстве (например, {0.0,0.0,0.0}) (предположим, что зритель находится в центре мира)

Теперь, как я могу вычислить бинормаль и касательную для каждой вершины? Я имею в виду, какова формула для вычисления бинормалей, что я должен использовать на основе этой информации? И о касательной?

Я построю TBN Матрица в любом случае, так что если вы знаете формулу для построения матрицы непосредственно на основе этой информации, будет хорошо!

О, да,Если нужно, у меня тоже есть координаты текстуры. И поскольку я говорю о GLSL, было бы неплохо решение для каждой вершины, я имею в виду такое, которое не требует доступа к более чем одной информации о вершине за раз.

---- Обновление ---- -

Я нашел это решение:

vec3 tangent;
vec3 binormal;

vec3 c1 = cross(a_normal, vec3(0.0, 0.0, 1.0));
vec3 c2 = cross(a_normal, vec3(0.0, 1.0, 0.0));

if (length(c1)>length(c2))
{
    tangent = c1;
}
else
{
    tangent = c2;
}

tangent = normalize(tangent);

binormal = cross(v_nglNormal, tangent);
binormal = normalize(binormal);

Но я не знаю, правильно ли оно на 100%.

43
задан genpfault 28 November 2012 в 15:30
поделиться