openGL glDrawElements с чередующимися буферами

До сих пор я использовал только glDrawArrays и хотел бы перейти к использованию индексного буфера и индексированных треугольников. Я рисую довольно сложный объект с координатами текстуры, нормалями и координатами вершин. Все эти данные собираются в один чередующийся буфер вершин и отрисовываются с использованием вызовов, подобных (при условии, что все операции выполнены правильно):

glVertexPointer( 3, GL_FLOAT, 22, (char*)m_vertexData );
glNormalPointer( GL_SHORT, 22, (char*)m_vertexData+(12) );
glTexCoordPointer( 2, GL_SHORT, 22, (char*)m_vertexData+(18) );
glDrawElements(GL_TRIANGLES, m_numTriangles, GL_UNSIGNED_SHORT, m_indexData );

Позволяет ли это также чередовать m_indexData с индексами моих нормалей и текстурных координат, а также со стандартным массивом индексов позиций? Или предполагается наличие единого линейного списка индексов, которые применяются ко всему формату вершин (POS, NOR, TEX)? Если верно последнее, то как можно визуализировать одну и ту же вершину с разными текстурными координатами или нормалями?

Я предполагаю, что этот вопрос также можно было бы перефразировать следующим образом: если бы у меня было 3 отдельных индексированных списка (POS, NOR, TEX), где последние 2 нельзя переставить, чтобы использовать тот же список индексов, что и первый, как лучше всего это сделать.


person DavidG    schedule 06.03.2009    source источник


Ответы (2)


У вас не может быть разных индексов для разных списков. Когда вы укажете glArrayElement(3), тогда OpenGL возьмет 3-й элемент каждого списка.
Что вы можете сделать, так это поиграть с указателем, который вы укажете, поскольку, по сути, место в списке, к которому в конечном итоге осуществляется доступ, является смещением указателя от начала список плюс указанный вами индекс. Это полезно, если у вас есть постоянное смещение между списками. если списки представляют собой просто случайную перестановку, то такая игра для каждой вершины, вероятно, будет такой же дорогой, как простое использование старых простых glVertex3fv(), glNormal3fv() и glTexCoord3fv()

person shoosh    schedule 06.03.2009
comment
Просто чтобы подтвердить, индексы, используемые в glDrawElements, применяются ко всему вашему формату вершин, каждый раз, когда вершина появляется в этой сетке, она должна иметь одни и те же координаты нормали и текстуры? я спрашиваю, потому что некоторые 3D-приложения экспортируют модели, в которых заданная позиция вершины может иметь разные координаты нормали и текстуры. - person DavidG; 06.03.2009
comment
Если вы хотите, чтобы одна и та же вершина отображалась в сетке с двумя разными наборами нормалей и текстурными координатами, вам нужно дважды добавить вершину в массивы. Что касается OpenGL, это две разные вершины. - person shoosh; 06.03.2009

У меня аналогичные проблемы с попыткой сделать то же самое в Direct3D 9.0.

Для моей реализации OpenGL 3 это было довольно просто, и мой исходный код доступен в Интернете, если он может вам помочь... https://github.com/RobertBColton/enigma-dev/blob/master/ENIGMAsystem/SHELL/Graphics_Systems/OpenGL3/GL3model.cpp

person Goombert    schedule 30.08.2013