glVertexAttrib *: какие индексы атрибутов предопределены? - PullRequest
1 голос
/ 09 февраля 2009

семейство функций glVertexAttrib позволяет добавлять общие атрибуты к каждой вершине. Вы можете установить индекс, с которым будут связаны данные. Тем не менее, вы не можете выбрать индекс произвольно, так как я обнаружил, что использование индексов ниже 4 нарушит стандартные (Normal / TexCoord) атрибуты, плюс 0 - позиция вершины. Как я могу узнать, какой будет первый реальный свободный индекс, который будет использоваться для пользовательских атрибутов?

Ответы [ 3 ]

7 голосов
/ 09 февраля 2009

Я нашел сайт, на котором перечислены предопределенные индексы на оборудовании NVIDIA:

http://www.opengl.org/sdk/docs/tutorials/ClockworkCoders/attributes.php

К сожалению, есть определенные ограничения при использовании этого на NVidia Аппаратные средства. По словам NVidia: «GLSL попытки устранить алиасинг атрибуты вершины, но это неотъемлемая к аппаратному подходу NVIDIA и необходимо для поддержания совместимость с существующим OpenGL приложения, которые клиенты NVIDIA полагаться на. Внедрение NVIDIA GLSL поэтому не позволяет встроенный атрибуты вершины, чтобы столкнуться с общие атрибуты вершин, которые присваивается определенной вершине индекс атрибута с glBindAttribLocation. Например, вы не следует использовать gl_Normal (встроенный атрибут вершины), а также использовать glBindAttribLocation для привязки универсального атрибут вершины с именем "что угодно", чтобы атрибут вершины индекс 2, потому что gl_Normal псевдонимы для индекса 2. "

Другими словами, аппаратное обеспечение NVidia индексы зарезервированы для встроенных атрибуты:

  • gl_Vertex 0
  • gl_Normal 2
  • gl_Color 3
  • gl_SecondaryColor 4
  • gl_FogCoord 5
  • gl_MultiTexCoord0 8
  • gl_MultiTexCoord1 9
  • gl_MultiTexCoord2 10
  • gl_MultiTexCoord3 11
  • gl_MultiTexCoord4 12
  • gl_MultiTexCoord5 13
  • gl_MultiTexCoord6 14
  • gl_MultiTexCoord7 15
2 голосов
/ 09 февраля 2009

Вы можете использовать только массивы атрибутов вершин и, таким образом, полностью пропустить glVertexPointer() и co. Это позволит избежать любых двойных взлетов и также хорошо унифицировано. Тем не менее, вы все равно должны использовать glGetAttribLocation(), потому что, AFAIK, вы не можете заранее знать, какому индексу будет сопоставлен каждый атрибут во время выполнения.

Как всегда, спецификация расширения содержит все кровавые подробности.

2 голосов
/ 09 февраля 2009

Вы не должны выбирать свои собственные индексы. GL может предоставить вам бесплатные через функцию glGetAttribLocation , используя имя атрибута в коде (если вы делаете это после связывания программы).

Я никогда не сталкивался с этой проблемой ... но, к сожалению, у меня нет собственного кода-обертки для шейдера (на работе atm), чтобы объяснить, почему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...