Могу ли я получить более общее / общее описание этого?
Я пытался исследовать эти вещи всю неделю, но я привожу только супер технические объяснения или примеры.
Может ли кто-нибудь объяснить общий процесс или Цель из этих ВАО? Может быть, набросок немного «шаг за шагом» Блок-схема для настройки VAO в OpenGL?
Я никогда не был тем, кто учится на примерах … поэтому все, что я нашел в Интернете, до сих пор было бесполезным.
ВАО хранит всю информацию о том, как читать атрибуты из VBO.
Это включает в себя для каждого атрибута, в котором он находится; смещение, шаг, как оно закодировано (int, float, нормализовано или нет), сколько значений на атрибут. Другими словами, параметры glVertexAttribPointer
(и связанный GL_ARRAY_BUFFER во время вызова.
Он также содержит буфер массива элементов, который содержит индексы.
Ваши объекты буфера вершин (VBO) содержат данные вершин. Вы устанавливаете указатели атрибутов, которые определяют, как эти данные должны быть доступны и интерпретированы для рисования вершины — сколько компонентов имеется в каждой вершине, как они хранятся (например, GL_FLOAT) и т. Д.
Объект Vertex Array (VAO) сохраняет все эти атрибуты. Их цель — позволить вам настроить эти атрибуты один раз, а затем восстанавливать их с одним изменением состояния всякий раз, когда вам нужно их использовать.
Преимущество этого состоит в том, что вы можете легко настроить несколько состояний и восстановить их — если я хочу нарисовать куб и треугольник, это два разных состояния — я создаю VAO для каждого, и VAO сохраняет состояние для каждого из них. Когда я хочу нарисовать куб, я восстанавливаю состояние только для куба.
Настроить
Установка имеет четыре шага:
Создать VAO очень просто:
GLuint vao_name;
glGenVertexArrays(1, &vao_name);
Это сгенерирует один массив вершин и сохранит его имя в vao_name.
Как только ваш VAO создан, вам нужно связать его:
glBindVertexArray(vao_name);
Теперь все изменения, которые вы вносите в указатели атрибутов или привязки к буферу массивов элементов, будут сохранены. Это вызов к любому из следующего:
Каждый раз, когда вы делаете один из этих вызовов, соответствующее состояние сохраняется в текущем связанном VAO. И когда вы позже связываете VAO снова, состояние восстанавливается.
После того, как вы установили состояние, вы можете отменить привязку VAO. Сделайте это, связав VAO 0:
glBindVertexArrays(0);
Вы также можете связать другой VAO и настроить для этого другое состояние. Когда это происходит, можно безопасно вносить изменения в указатели атрибутов, не нарушая ваше предыдущее состояние.
Рисование
Если вы хотите что-то нарисовать, все, что вам нужно сделать, это восстановить VAO:
glBindVertexArray(cube_vao)
glDrawArrays(GL_TRIANGLES, 0, 36);
glBindVertexArray(triangle_vao);
glDrawArrays(GL_TRIANGLES, 0, 3);
glBindVertexArray(0); //Unbind the VAO
Редактировать:
Вот некоторые ответы, которые помогли мне, когда я пытался понять ВАО:
glVertexAttribPointer перезаписать, уточнение glVertexAttribPointer, Когда следует вызывать glVertexAttribPointer?
Кроме того, спецификация OpenGL объясняет это хорошо, как только вы осознаете основы: https://www.opengl.org/registry/
Что такое VAO, смотрите в ответе @ ratchet-freak.
Для Цель В VAO речь идет об улучшении производительности, позволяя одному изменению состояния настроить все привязки атрибутов вершин, что означает не только меньшее количество вызовов функций, но и больше возможностей для реализации OpenGL оптимизировать для этого состояния в целом.
Для VAO понимание VBO и Shader является обязательным условием. VAO предоставляют способ «предварительно определить» данные вершины и их атрибуты.
Один из способов понять это — рисовать с VBO, а затем — с VAO. Вы заметите, что это похоже на рисование с VBO, за исключением того, что оно сначала «сохраняется» в VAO для последующего использования. Впоследствии VAO становится активным, чтобы фактически нарисовать сохраненное состояние.
Увидеть VBO, Шейдер, ВАО для довольно хорошего примера.