Подтвердить что ты не робот

3 индексных буфера

Итак, как в D3D, так и в OpenGL есть возможность рисовать из буфера индекса.

Формат файла OBJ, однако, делает что-то странное. Он задает кучу таких вершин, как:

v -21.499660 6.424470 4.069845
v -25.117170 6.418100 4.068025
v -21.663851 8.282170 4.069585
v -21.651890 6.420180 4.068675
v -25.128481 8.281520 4.069585

Затем он задает связку нормалей типа..

vn 0.196004 0.558984 0.805680
vn -0.009523 0.210194 -0.977613
vn -0.147787 0.380832 -0.912757
vn 0.822108 0.567581 0.044617
vn 0.597037 0.057507 -0.800150
vn 0.809312 -0.045432 0.585619

Затем он указывает кучу tex-коордов, например

vt 0.1225 0.5636
vt 0.6221 0.1111
vt 0.4865 0.8888
vt 0.2862 0.2586
vt 0.5865 0.2568
vt 0.1862 0.2166

Затем он указывает "лица" на модели, например:

f 1/2/5 2/3/7 8/2/6
f 5/9/7 6/3/8 5/2/1

Где мы v/t/n первое число является индексом в массиве вершин, второе - индексом в tex-координате массив, третий, в массив нормалей.

Итак, пытаясь сделать это с помощью вершинных буферов,

В OpenGL я могу использовать glVertexPointer, glNormalPointer и glTexCoordPointer для установки указателей на каждый из массивов координат вершин, нормалей и текстур соответственно.. но когда дело доходит до рисования с помощью glDrawElements, я могу только укажите ОДИН набор индексов, а именно индексы, которые он должен использовать при посещении вершин.

Хорошо, тогда что? У меня есть 3 набор индексов для посещения.

В d3d все то же самое - я могу настроить 3 потока: один для вершин, один для texcords и один для нормалей, но когда дело доходит до использования IDirect3DDevice9:: DrawIndexedPrimitive, я могу указать только ONE, который будет индексироваться в массив вершин.

Итак, возможно ли рисовать из вершинных буферов с использованием разных массивов индексов для каждого из вершинного, texcoord и обычного буферов (EITHER d3d или opengl!), или я должен создать один чередующийся массив, а затем посетите ИТ?

4b9b3361

Ответ 1

OBJ не был предназначен для сопоставления с OpenGL или DirectX.

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

Вам нужно преобразовать представление OBJ в то, что использует только один индекс на вершину (возможно, дублируя некоторые данные вершин на этом пути).

Ответ 2

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

Решение находится здесь: формат отображения файла obj в формате wavefront opengl

Однако я хотел бы найти решение, которое оставляет вершинные данные неповрежденными для обработки между кадрами с opencl,

Одним из решений является ограничение на 1 координату текстуры на вершину. Я знаю, что opengl имеет несколько текстурных координат на вершину. Как я могу использовать их с glGenBuffersARB и т.д. Я не знаю. У кого-нибудь есть предложения?

Ответ 3

Что вы действительно хотите делать (говоря со стороны D3D забора, я не знаю, что OpenGL извините) загружает OBJ в массив настраиваемого формата вершин - таким образом у вас есть структура с index, vertex, normal и tex, и вы можете просто визуализировать его с помощью одного DrawIndexedPrimtive.

Неужели я не понимаю ваше определение проблемы здесь? Я думаю, вам нужно дать немного больше подробностей - вам не нужно будет использовать несколько индексных буферов для рендеринга одного OBJ файла (если вы не намеренно его выгружаете). Если это так, то вы намеренно выполняете его, тогда вы должны взглянуть на аргументы DrawIndexedPrimitive, которые позволяют вам указать смещение в VB для использования.