Как получить индексированные позиции вершин И индексированные нормали вершин из файла wavefront .obj в вершинный шейдер OpenGL?

Я пытался использовать два объекта Vertex Buffer (VBO) и два объекта Index Buffer (IBO) в объекте Vertex Array (VAO) для визуализации данных из файла волнового фронта .Obj, содержащего 3D-модель.
Файл .obj использовал определение вершины / нормального лица:

f v1//vn1 v2//vn2 v3//vn3

Я понял, что не могу использовать два IBO для индексации с помощью VAO OpenGL, поскольку только один буферный объект (за один раз) может быть привязан к цели привязки GL_ELEMENT_ARRAY_BUFFER. Это означает, что я не могу просто определить индексы положения вершин И нормальные индексы вершин, что является проблемой, когда мне нужно и то и другое в качестве входных данных для вершинного шейдера GLSL.

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

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

Как мне решить эту проблему?

Я использую C ++ и Visual Studio 2012 с OpenGL 3.3.

2

Решение

Одна вещь, которую вы должны понять, это то, что «вершина» не является синонимом «позиции». Вершина — это целый набор атрибутов; положение, нормаль, координата текстуры и т. д. OpenGL обрабатывает геометрию по одному примитиву за раз, где примитив состоит из 1 (точки), 2 (линии) или 3 вершин (треугольника). Вы не можете обрабатывать позиции и нормальные отдельно, они всегда должны идти вместе.

Прежде чем вы сможете обработать его в OpenGL, вы должны развернуть данные в файле .obj. Для каждого уникального набора атрибутов введите новую вершину с новым индексом и замените индексированные атрибуты из .obj на индексированную вершину, которую требует OpenGL.

7

Другие решения

Других решений пока нет …