2014-11-05 5 views
2

Когда создаются, VAOs отслеживают только индексы VBO (через glBindVertexBuffer), или также имена VBO привязаны к этим индексам? Если я укажу индекс привязки, скажем, 0, используя glVertexAttribBinding во время создания VAO, могу ли я связать другое VBO с индексом 0 непосредственно перед вызовом розыгрыша и использовать его в этом VBO или будет всегда использовать то, что VBO было связанный с индексом 0 во время создания VAO?У объектов вершинного массива OpenGL хранятся имена и индексы вершинного буфера или только индексы?

Я спрашиваю, потому что много примеров, я считаю, предшествуют вызовы glVertexAttribFormat и glVertexAttribBinding с вызовом glBindVertexBuffer, который не должен быть необходимым, если VAO отслеживает только индексы (так как привязки индекса задается в glVertexAttribBinding).

ответ

-1

Ответ заключается в том, что они НЕ хранят имена вершин, а только индексы. Если вы привязываете другой VBO к одному и тому же индексу в другом VAO, вы должны снова связать первый VBO перед любым вызовом glDraw, который использует первое VAO.

По крайней мере, на мой Macbook Pro с:

Renderer: NVidia GeForce GT 650M OpenGL Engine

Версия: 4.1 NVIDIA-10.0.43 310.41.05f01

+2

Ваш вопрос касался функциональности, доступной только в OpenGL 4.3 и более поздних версиях. Как вы протестировали его в конфигурации, которая поддерживает OpenGL 4.1? –

+0

Правильно, я не тестировал 4.3+ и, как таковой, не может привязать буфер вершин к индексу, отличному от 0. Однако я предполагаю, что если VAO не отслеживают имена VBO в 4.1, они также не будут отслеживать их в 4.3+. Но именно поэтому я включил спецификации для своей системы; YMMV. – jorgander

3

Как вы, вероятно, знаете, это довольно новая функциональность, представленная в OpenGL 4.3. Как я читал спецификацию, сопоставление между атрибутами и буферами теперь имеет уровень косвенности:

  1. Каждый атрибут имеет свойство, которое указывает, какой индекс привязки он использует.
  2. Буферы привязаны к индексам привязки.

Вы можете посмотреть на это как на две таблицы, одну из которых определяет отображение индекса атрибута в индекс привязки, а другой - от индекса привязки к имени буфера. Обе эти таблицы являются частью состояния 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() перед обратным вызовом, чтобы снова настроить все состояние.

+0

Если VAO отслеживает имя VBO назначен к индексу, то ему не нужно отслеживать индекс. После создания VAO любой атрибут вершины, который ссылается на этот индекс буфера, теперь может забыть значение индекса буфера и помнить только имя индекса буфера (фактически, после вызова 'glVertexAttribBinding' он может забыть значение индекса). В любом случае, мое замешательство возникло из этого раздела официальных документов opengl: https://www.opengl.org/wiki/Vertex_Specification#Multibind_and_separation. Из этого: «... поддерживать тот же формат при быстром переключении между несколькими буферами ...» – jorgander

+0

Я не уверен, как объяснить это более четко. Вы говорите, что «ему не нужно отслеживать индекс». Ну, вы можете подумать, что это необязательно, но это так, как указано, и так работает. Он позволяет использовать описанные функции. Косвенное указание позволяет назначить один и тот же индекс буфера ряду атрибутов, а затем изменить, какой буфер использует все эти атрибуты, с одним вызовом, который связывает другой буфер с этим индексом. –

+0

Я предполагаю, что терминология неясна, а некоторые из учебников/документов, похоже, конфликтуют. Из вашего ответа: «Буферы привязаны к привязным индексам». - являются ли слова 'bound' и 'binding' излишними здесь? Если нет, что связывает привязки индексов привязки, отличных от этих VBOs? Является ли фраза «буферы привязаны к индексам», эквивалентной тому, что вы хотите сказать? – jorgander