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

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

13 голосов
/ 23 апреля 2010

Итак, как в 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

Затем он определяет группу текстовых координат, например

* 1010.*

THEN он определяет "грани" в модели, например:

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

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

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

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

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

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

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

Ответы [ 3 ]

8 голосов
/ 23 апреля 2010

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

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

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

3 голосов
/ 24 ноября 2010

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

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

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

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

2 голосов
/ 23 апреля 2010

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

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

...