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

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

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

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

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

-1

Решение

ВАО хранит всю информацию о том, как читать атрибуты из VBO.

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

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

1

Другие решения

Ваши объекты буфера вершин (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

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

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

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

1

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

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

0

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

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

Увидеть VBO, Шейдер, ВАО для довольно хорошего примера.

0
По вопросам рекламы [email protected]