Подтвердить что ты не робот

Общие сведения о объектах вершинного массива (glGenVertexArrays)

Я путаюсь с точкой в ​​создании/создании объекта массива вершин (VAO) с помощью:

glGenVertexArrays(GLsizei n, GLuint *arrays);

и

glBindVertexArray(GLuint);

Поскольку я все еще могу создать объект-буфер, скажем для вершин, и описать этот буферный объект с glVertexAttribPointer и glEnableVertexAttribArray, не создавая VAO.

Мой вопрос в том, что вам не нужно фактически создавать VAO для описания данных в объекте буфера, почему бы такие источники, как OpenGL SuperBible 5ed, включить вызов для создания VAO при создании VBOs? Используются ли они только для более продвинутых тем, которые мне еще предстоит обнаружить, я полностью смущен?

Также я впервые столкнулся с этим вопросом при чтении записи wikipedias на VBOs, и их примерный код не включает вызовы glGenVertexArrays(), но они все еще описывают данные с помощью glVertexAttribPointer(). Wiki VBO entry - Пример, где VAO создаются по какой причине?

4b9b3361

Ответ 1

Повышение производительности.

Во многих случаях настройка ваших атрибутов на хосте требует большого количества вызовов API и важного количества проверки внутри реализации.

Выполнение всех этих действий один раз и использование VAO позволяют эту работу амортизировать.

См., например, Graham Sellers анализ для фактических данных.

Ответ 2

Предположим, вы создаете объект, которому нужны три VBOs (разные данные для затенения, возможно, положения, нормали и некоторые параметры эффектного эффекта). Каждый раз, когда вы рисуете этот объект, вам придется привязать все эти VBO и установить любые дополнительные параметры. Если вы используете VAO, вам нужно использовать только один вызов (привязка массива вершин), это создаст всю среду для конкретного объекта.

Ответ 3

Ответ не такой сложный, как вы себе представляли. Подумайте об этом как о забавной метафоре; VertexArrayObject - босс, и он управляет несколькими сотрудниками, которые VetexBufferObjects.