Нормализация вектора освещения OpenGL

Я пытаюсь найти нормализацию вектора для произвольного объекта, загруженного в программу opengl. Я пытаюсь вычислить нормали для всех вершин. Я понял, что мне нужно сначала вычислить нормали для граней, а затем найти среднее значение нормалей для вершин.

Когда я запускаю программу, некоторые объекты подсвечиваются правильно, но по большей части это не так. Кажется, что треугольники на каждой независимой грани освещены правильно, но не на соседней грани. Чтобы вычислить нормаль каждой вершины, я бы предположил, что мне нужно найти нормализованное среднее значение шести соединяющих треугольников, попытка сделать это, похоже, не сработала.

Вот код, который я использую для вычисления нормалей каждого лица.

vec3 one, two;
for(int i = 0; i < vertices.vertexNumber; i += 3)
{
    one.x = point3[i+1].x - point3[i].x;
    one.y = point3[i+1].y - point3[i].y;
    one.z = point3[i+1].z - point3[i].z;

    two.x = point3[i+2].x - point3[i].x;
    two.y = point3[i+2].y - point3[i].y;
    two.z = point3[i+2].z - point3[i].z;

    vec3 normal = normalizevec3(crossvec3(one, two));

    normalized[i] = normal;
}

и функция, которую я использую для нормализации векторов

vec3 normalizevec3(vec3 v) {
float vecLength = lengthvec3(v);
vec3 dividebyzero = {0.0, 0.0, 0.0};
if (vecLength == 0)
    return dividebyzero;
float X, Y, Z;
X = v.x / vecLength;
Y = v.y / vecLength;
Z = v.z / vecLength;
vec3 u = {X, Y, Z};
return u;
}

После некоторого рефакторинга вот как выглядит мой куб.

введите здесь описание изображения

введите здесь описание изображения

Нормальные значения, которые я получаю,

0.000000, 0.000000, 1.000000
0.000000, 0.000000, 1.000000
0.000000, 0.000000, 1.000000
0.000000, 0.000000, 1.000000
-1.000000, 0.000000, -0.000000
-1.000000, 0.000000, 0.000000
-1.000000, 0.000000, -0.000000
-1.000000, 0.000000, 0.000000
0.000000, -1.000000, 0.000000
-0.000000, -1.000000, 0.000000
0.000000, -1.000000, 0.000000
-0.000000, -1.000000, 0.000000

person TJGreen    schedule 25.04.2015    source источник
comment
Если вы пытаетесь сгенерировать нормали для произвольного меша (у которого еще нет нормалей), вам понадобится кросс-произведение и какой-то способ разделить одну и ту же вершину между несколькими треугольниками (если только ваши меши никогда не используют нормали). вершина дважды) - каждый треугольник будет иметь другую нормаль, но вы должны указать ее для каждой вершины   -  person Dave    schedule 25.04.2015


Ответы (1)


Нормаль треугольника определяется порядком вершин.

То, что вы делаете, неправильно, потому что вы вычитаете направления, а затем используете векторное произведение, чтобы получить перпендикулярное направление, что просто бессмыслица (вы можете вычесть две ТОЧКИ и получить из этого вектор, а затем нормализовать его к направлению, но два направления нет смысла их вычитать).

Если вы хотите найти среднюю нормаль треугольника (учитывая, что треугольник имеет разные нормали для каждого вектора), используйте необработанное среднее, а затем нормализуйте. Это будет работать нормально.

Кажется, у вас уже есть нормальная информация (вектор нормалей). Этого достаточно для молнии!

Единственный раз, когда вам нужно вычислить «нормаль» вершины, это когда вы фактически вычисляете ее касательную и бинормаль, чтобы применить карты нормалей. Сначала правильно реализуйте шейдер Phong, затем вы можете перейти к картам нормалей.

person MichaelCMS    schedule 25.04.2015