Ответ 1
По сути, вам нужно понять две вещи:
-
Объекты вершинного массива (VAO) - концептуально ничего, кроме тонких оболочек состояния.
-
Объекты буфера вершин (VBOs) хранят фактические данные.
Другой способ думать об этом заключается в том, что VAO описывают данные, хранящиеся в одном или нескольких VBOs.
Подумайте о VBOs (и вообще о буферных объектах) как о неструктурированных массивах данных, хранящихся в памяти сервера (GPU). Вы можете компоновать свои данные вершин в нескольких массивах, если хотите, или можете упаковать их в один массив. В любом случае буферные объекты сводятся к местам хранения данных.
Объекты Vertex Array отслеживают фактические указатели для памяти VBO, необходимой для команд рисования.
Они немного сложнее, чем указатели, так как вы знали бы их на языке, таком как C. Указатели вершин отслеживают объект буфера, который был привязан, когда они были указаны, смещение в его адресное пространство, шаг между атрибутами вершин и способы интерпретации базовых данных (например, следует ли сохранять целые значения или преобразовывать их в плавающие точки [ 0.0, 1.0], нормализуясь к диапазону типов данных).
Например, целочисленные данные обычно преобразуются в с плавающей запятой, но это команда, которую вы используете для указания указателя вершин (glVertexAttribPointer (...)
vs. glVertexAttribIPointer (...)
), который определяет это поведение.
Объекты вершинного массива также отслеживают объект-буфер, привязанный в настоящее время к GL_ELEMENT_ARRAY_BUFFER
.
GL_ELEMENT_ARRAY_BUFFER
есть команда: glDrawElements (...)
издает свой список индексов из (при условии ненулевой привязки), и есть no glElementArrayPointer (...)
. glDrawElements (...)
объединяет команду указателя и рисования в одну операцию и будет использовать привязку, хранящуюся в активном объекте Vertex Array, чтобы выполнить это.
С учетом этого, если ваши объекты не разделяют вершинные данные, вам, как правило, понадобится уникальный набор VBOs для каждого.
Вы можете использовать один VAO для всего своего программного обеспечения, если хотите, или можете воспользоваться тем фактом, что изменение связанного VAO изменяет почти весь набор состояний, необходимых для рисования разных объектов.
Таким образом, рисование ландшафта и куба может быть таким же простым, как изменение связанного VAO. Возможно, вам придется сделать больше, если вам нужно применить разные текстуры к каждому из них, но VAO позаботится обо всех настройках, связанных с вершинами.