Процесс настройки VAO в OpenGL

Могу ли я получить более общее / общее описание этого?

Я пытался исследовать эти вещи всю неделю, но я привожу только супер технические объяснения или примеры.

Может ли кто-нибудь объяснить общий процесс или цель этих ВАО? Может быть, в общих чертах описать "пошаговую" блок-схему для настройки VAO в OpenGL?

Я никогда не был тем, кто учится на примерах... поэтому все, что я нашел в Интернете, до сих пор было бесполезным.

4 ответа

Ваши объекты буфера вершин (VBO) содержат данные вершин. Вы устанавливаете указатели атрибутов, которые определяют, как эти данные должны быть доступны и интерпретированы для рисования вершины - сколько компонентов имеется в каждой вершине, как они хранятся (например, GL_FLOAT) и т. Д.

Объект Vertex Array (VAO) сохраняет все эти атрибуты. Их цель состоит в том, чтобы позволить вам настроить эти атрибуты один раз, а затем восстанавливать их с одним изменением состояния всякий раз, когда вам нужно их использовать.

Преимущество этого в том, что вы можете легко настроить несколько состояний и восстановить их - если я хочу нарисовать куб и треугольник, это два разных состояния - я создаю VAO для каждого, и VAO сохраняет состояние для каждого из них. Когда я хочу нарисовать куб, я восстанавливаю состояние только для куба.

Настроить

Установка имеет четыре шага:

  1. Создать ВАО
  2. Привязать ВАО
  3. Настройте государство
  4. Уберите ВАО

Создать VAO очень просто:

GLuint vao_name;
glGenVertexArrays(1, &vao_name);

Это сгенерирует один массив вершин и сохранит его имя в vao_name.

Как только ваш VAO создан, вам нужно связать его:

glBindVertexArray(vao_name);

Теперь все изменения, сделанные вами в указателях атрибутов или привязках к буферу массива элементов, будут сохранены. Это вызов к любому из следующего:

  1. glVertexAttribPointer (...)
  2. glEnableVertexAttribArray (...)
  3. glDisableVertexAttribArray (...)
  4. glBindBuffer (GL_ELEMENT_ARRAY_BUFFER,...)

Каждый раз, когда вы делаете один из этих вызовов, соответствующее состояние сохраняется в текущем связанном 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

Редактировать:

Вот некоторые ответы, которые помогли мне, когда я пытался понять VAO: перезапись glVertexAttribPointer, пояснение glVertexAttribPointer, когда вызывать glVertexAttribPointer?

Кроме того, спецификация OpenGL хорошо объясняет это, как только вы осознаете основы: https://www.opengl.org/registry/

VAO содержит всю информацию о том, как читать атрибуты из VBO.

Это включает в себя для каждого атрибута, в котором он находится; смещение, шаг, как оно закодировано (int, float, нормализовано или нет), сколько значений на атрибут. Другими словами, параметры glVertexAttribPointer (и связанный GL_ARRAY_BUFFER во время вызова.

Он также содержит буфер массива элементов, который содержит индексы.

Что такое VAO, смотрите в ответе @ratchet-freak.

Что касается цели VAO, то это вопрос повышения производительности за счет того, что одно изменение состояния позволяет настроить все привязки атрибутов вершин, что означает не только меньшее количество вызовов функций, но и больше возможностей для реализации OpenGL для оптимизации этого состояния в целом.

Для VAO понимание VBO и Shader является обязательным условием. VAO предоставляют способ "предварительно определить" данные вершины и их атрибуты.

Один из способов понять это - рисовать с VBO, а затем рисовать то же с VAO. Вы заметите, что это похоже на рисование с VBO, за исключением того, что оно сначала "сохраняется" в VAO для последующего использования. Впоследствии VAO становится активным, чтобы фактически нарисовать сохраненное состояние.

Смотрите VBO, Shader, VAO для довольно хорошего примера.

Другие вопросы по тегам