2015-02-02 6 views
-1

Могу ли я получить более общее/общее описание этого?Процесс создания ВАО в OpenGL

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

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

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

+0

Это было задано в аналогичной форме много раз раньше. См. Например, мой ответ здесь: http://stackoverflow.com/questions/26552642/when-is-what-bound-to-a-vao/26559063#26559063. Или здесь: http://stackoverflow.com/questions/26228498/glvertexattribpointer-overwrite/26229019#26229019. –

+0

Я обнаружил, что эта концепция на самом деле не очень хорошо покрыта, недавно она сама обняла меня. Существует информация об этом, но она фрагментирована и либо не появляется при поиске, либо похоронена под существенным шумом. – Francis

ответ

1

В VAO хранится вся информация о том, как читать атрибуты от VBOs.

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

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

0

Для того, что ВАО являются, см @ ответ храпового урод в .

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

0

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

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

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

Настройка

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

  1. Создание ВАО
  2. свяжи VAO
  3. Настройка состояния
  4. Unbind в ВАО

Создание ВАО очень просто:

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 и настроить для этого другое состояние. В этом случае безопасно вносить изменения в указатели атрибутов, не нарушая прежнее состояние.

Рисунок

Если вы хотите сделать что-то все, что вам нужно сделать, это восстановить ВАО:

glBindVertexArray(cube_vao) 
glDrawArrays(GL_TRIANGLES, 0, 36); 

glBindVertexArray(triangle_vao); 
glDrawArrays(GL_TRIANGLES, 0, 3); 

glBindVertexArray(0);    //Unbind the VAO 

Edit:

Вот некоторые ответы, которые помогли мне, когда я был пытаясь понять ВАО: glVertexAttribPointer overwrite, glVertexAttribPointer clarification, When should glVertexAttribPointer be called?

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

+0

Это довольно либеральный заимствование из предыдущих ответов. Я не собираюсь отмечать это для плагиата, но это действительно граница. В будущем, пожалуйста, напишите содержимое самостоятельно и не копируйте с других людей без атрибуции. –

+0

@RetoKoradi Я нашел, что большая часть информации о VAO редко распространяется, поэтому я ответил, основываясь на том, что я взял из нескольких источников. Я попытался отследить некоторые из источников, которые я использовал для построения этого ответа, я думаю, что один из них был вашим, который объяснял бы , почему его части были похожи. Это был мой первый ответ, поэтому, если я сделал несколько ошибок, это, вероятно, почему. Надеюсь, это больше соответствует ожиданиям сообщества. – Francis

0

Для VAO, понимание РВО и Shader является необходимым условием. VAO предоставляют способ «предварительно определить» данные вершин и его атрибуты.

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

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