Что ожидает glDrawElements () в массиве нормали? - PullRequest
1 голос
/ 15 сентября 2011

Я пишу декодер для 3D-моделей MilkShape. Я загружаю содержимое в массив вершин и массив индекса лица (как std::vector), затем использую glDrawElements() для его рендеринга, пока все хорошо.

Но проблема в массиве нормали. В каком порядке OpenGL ожидает нормалей? Файл MilkShape 3D содержит три одинаковые нормали float[3], следующие по индексу лица (треугольника). Но если я просто push_back() прочитал в массив нормалей, OpenGL не будет правильно применять освещение.

Так что я думаю, что испортил заказ. Как это сделать правильно? Спасибо за чтение.

Ответы [ 3 ]

1 голос
/ 15 сентября 2011

OpenGL предполагает, что нормали индексируются так же, как позиции вершин.Необходимо понимать, что сама вершина является вектором векторов атрибутов или, другими словами, вектором всех значений атрибутов (положение, нормаль, цвет, координата (ы) текстуры и т. Д.).Массив индекса glDrawElements обращается к массиву вершин, где каждая вершина является таким вектором более высокой размерности.

Теперь, что могло бы произойти, - то, что Milkshape смешивает наматывание лица и дает вам нормали, некоторые из которых были перевернутыпротивоположное направление (внутрь, а не наружу).Я не знаю, как это делается в Milkshape, но в Blender есть функция «Пересчитать нормали» (доступ по сочетанию клавиш CTRL + N), которая исправляет это.

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

glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE);
0 голосов
/ 15 сентября 2011

Я действительно испортил порядок нормалей.

Структура файла 3D-модели MilkShape может быть приблизительно равна:

  1. список вершин, float[3]
  2. список индексов вершин как short[3] для треугольников + 3 нормали как float[3] каждый

Вам нужно загрузить нормали в normals[currentFace.index123]. Проще говоря, индексы нормали из массива normals должны соответствовать индексам вершин из массива vertices.

0 голосов
/ 15 сентября 2011

То, что вы описываете, звучит так, будто MilkShape3D дает вам индивидуальные нормали. OpenGL ожидает нормали для каждой вершины.

Таким образом, вам нужно обработать ваши данные, чтобы сгенерировать каждую вершину для каждого лица. Для этого есть много литературы в Интернете, один хит в Google дает это .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...