openGL glDrawElements с чередованными буферами - PullRequest
3 голосов
/ 06 марта 2009

До сих пор я использовал только 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 нельзя переставить так, чтобы они разделяли тот же список индексов, что и первый, что является лучшим способом сделать это.

Ответы [ 2 ]

5 голосов
/ 06 марта 2009

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

0 голосов
/ 30 августа 2013

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

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

...