Как вы, вероятно, знаете, это довольно новая функциональность, представленная в OpenGL 4.3. Как я читал спецификацию, сопоставление между атрибутами и буферами теперь имеет уровень косвенности:
- Каждый атрибут имеет свойство, которое указывает, какой индекс привязки он использует.
- Буферы привязаны к индексам привязки.
Вы можете посмотреть на это как на две таблицы, одну из которых определяет отображение индекса атрибута в индекс привязки, а другой - от индекса привязки к имени буфера. Обе эти таблицы являются частью состояния VAO.
Я считаю, что они могут быть указаны полностью независимо и в любом порядке. glVertexAttribBinding()
устанавливает первую ассоциацию между индексом атрибута и индексом привязки. glBindVertexBuffer()
устанавливает связь между индексом привязки и именем буфера.
Это понимание подтверждается таблицей состояний в спецификации. Таблица 23.4 в GL 4.4 спецификации, озаглавленный «Vertex Государственного массива объекты», списки:
VERTEX_ATTRIB_BINDING
, которые могут быть запрошены с glGetVertexAttribiv()
, является значением индекса связывания данного индекса атрибута.
VERTEX_BINDING_BUFFER
, который может быть запрошен с помощью glGetIntegeri_v()
, является значением имени буфера для данного индекса привязки.
Основываясь на этом, обращаясь к своим конкретным вопросам:
При создании сделать VAOs дорожку только VBÖ индексов (через glBindVertexBuffer
), или также имена которых VBÖ привязанных к этим показателям?
Они отслеживают оба.
можно связать различные VBO с индексом 0 непосредственно перед Дро вызовом и иметь его использовать содержимое этого VBO
Да, если вы свяжете другой VBO связывания индекса 0, все атрибуты с индексом привязки 0 будут использовать содержимое этого VBO.
много примеров, я считаю, предшествуем вызовы на glVertexAttribFormat
и glVertexAttribBinding
с вызовом glBindVertexBuffer
, который не должен быть необходимым, если VAO отслеживает только индексы
VAO отслеживает состояние, установленное все эти поэтому имеет смысл использовать все их как часть настройки VAO. Отслеживание всего состояния настройки вершины в VAO является основной целью обеспечения VAO в первую очередь. Он позволяет вам настроить состояние один раз во время инициализации, а затем вам нужно только один вызов до glBindVertexArray()
перед обратным вызовом, чтобы снова настроить все состояние.
Ваш вопрос касался функциональности, доступной только в OpenGL 4.3 и более поздних версиях. Как вы протестировали его в конфигурации, которая поддерживает OpenGL 4.1? –
Правильно, я не тестировал 4.3+ и, как таковой, не может привязать буфер вершин к индексу, отличному от 0. Однако я предполагаю, что если VAO не отслеживают имена VBO в 4.1, они также не будут отслеживать их в 4.3+. Но именно поэтому я включил спецификации для своей системы; YMMV. – jorgander