glVertexAttribPointer для встроенных атрибутов вершин, таких как gl_Vertex, gl_Normal - PullRequest
7 голосов
/ 22 сентября 2011

Я должен отправить атрибуты вершины с помощью glVertexAttribPointer шейдерам, ожидающим их встроенного (gl_Vertex, gl_Color и т. Д.).

Функция glVertexAttribPointer должна указывать индекс (илиместоположение) каждого встроенного атрибута.Я могу сделать это на реализациях NVidia, так как местоположение каждого атрибута фиксировано (см. http://www.opengl.org/sdk/docs/tutorials/ClockworkCoders/attributes.php в разделе «Пользовательские атрибуты»), однако я не уверен насчет расположения в реализации ATI.

Кроме того, функция glGetAttribLocation вернет -1 при попытке определить местоположение любого атрибута, начинающегося с «gl _».

Я думаю, что что-то упустил, и это тривиальная проблема, однако у меня естьне найдено правильное решение для ATI.

1 Ответ

7 голосов
/ 22 сентября 2011

Встроенные массивы атрибутов устанавливаются не с glVertexAttribPointer, а с такими функциями, как glVertexPointer, glColorPointer, ... . И вы включаете их, вызывая glEnableClientState с такими константами, как GL_VERTEX_ARRAY, GL_COLOR_ARRAY, ... вместо glEnableVertexAttribArray.

В то время как на nVidia glVertexAttribPointer может работать, из-за их совмещения именных индексов атрибутов со встроенными атрибутами, это не соответствует стандарту, и я уверен, что вы не можете ожидать этого от любого другого производителя оборудования. Поэтому для уверенности используйте glVertexAttribPointer для пользовательских атрибутов и функции glVertexPointer/glNormalPointer/... для атрибутов bultin вместе с соответствующими функциями включения / выключения.

Имейте в виду, что встроенные атрибуты в любом случае устарели вместе с упомянутыми функциями. Поэтому, если вы хотите написать современный код OpenGL, вам все равно следует определить свои собственные атрибуты. Но, возможно, вам придется поддерживать устаревшие шейдеры или не заботиться о прямой совместимости на данный момент.

...