Понимание объектов массива вершин (glGenVertexArrays) - PullRequest
32 голосов
/ 12 мая 2011

Я запутался с точкой при создании / создании объекта Vertex Array (VAO) с:

glGenVertexArrays(GLsizei n, GLuint *arrays);

и

glBindVertexArray(GLuint);

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

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

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

Ответы [ 3 ]

21 голосов
/ 12 мая 2011

Улучшения производительности.

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

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

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

16 голосов
/ 13 мая 2011

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

6 голосов
/ 15 августа 2013

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

...