Сегодня я только начинаю изучать OpenGL из этого руководства: http://openglbook.com/the-book/
Я перешел к главе 2, где рисую треугольник и понимаю все, кроме VAO (это аббревиатура в порядке?). В руководстве есть этот код:
glGenVertexArrays(1, &VaoId);
glBindVertexArray(VaoId);
Хотя я понимаю, что код необходим, я понятия не имею, что он делает. Хотя я никогда не использую VaoId после этого момента (кроме как для его уничтожения), код без него не работает. Я предполагаю, что это связано с тем, что это необходимо, но я не знаю почему. Должен ли этот точный код быть частью каждой программы OpenGL? В учебнике VAO объясняются как:
Объект массива вершин (или VAO) - это объект, который описывает, как атрибуты вершин хранятся в объекте буфера вершин (или VBO). Это означает, что VAO - это не фактический объект, хранящий данные вершины, а дескриптор данных вершин. Атрибуты вершин можно описать с помощью функции glVertexAttribPointer и двух ее сестринских функций glVertexAttribIPointer и glVertexAttribLPointer, первую из которых мы рассмотрим ниже.
Я не понимаю, как VAO описывает атрибуты вершин. Я их никак не описал. Получает ли он информацию из glVertexAttribPointer? Я думаю, это должно быть оно. Является ли VAO просто местом назначения информации от glVertexAttribPointer?
Кстати, приемлемо ли руководство, которому я следую? Есть ли что-нибудь, чего мне следует остерегаться, или лучшее руководство, которому нужно следовать?
источник
glVertexAttribPointer
VertexArrayMacro
или что-то подобное.Объекты массива вершин похожи на макросы в программах обработки текстов и т.п. Хорошее описание можно найти здесь .
Макросы просто запоминают ваши действия, такие как активация этого атрибута, привязка этого буфера и т. Д. Когда вы вызываете
glBindVertexArray( yourVAOId )
, он просто воспроизводит эти привязки указателя атрибутов и привязки буфера.Итак, ваш следующий вызов для рисования использует все, что было связано с VAO.
VAO не хранят данные о вершинах . Нет. Данные вершин хранятся в буфере вершин или в массиве клиентской памяти.
источник
Я всегда думаю о VAO как о массиве буферов данных, используемых OpenGL. Используя современный OpenGL, вы создадите объекты VAO и Vertex Buffer.
Следующий шаг - привязать данные к буферу:
В этот момент OpenGL видит:
Теперь мы можем использовать glVertexAttribPointer, чтобы сообщить OpenGL, что представляют данные в буфере:
OpenGL теперь имеет данные в буфере и знает, как данные организованы в вершины. Тот же процесс можно применить к координатам текстуры и т.д., но для координат текстуры будет два значения.
Затем вы можете связать текстуры и нарисовать массивы, вы захотите создать шейдер Vert и Frag, скомпилировать и прикрепить его к программе (не включенной здесь).
источник
VAO - это объект, который представляет стадию выборки вершин конвейера OpenGL и используется для подачи входных данных в вершинный шейдер.
Вы можете создать объект массива вершин, подобный этому
Сначала давайте рассмотрим простой пример. Рассмотрим такой входной параметр в коде шейдера.
Чтобы заполнить этот атрибут, мы можем использовать
Хотя объект массива вершин хранит эти значения статических атрибутов для вас, он может делать гораздо больше.
После создания объекта массива вершин мы можем приступить к заполнению его состояния. Мы попросим OpenGL заполнить его автоматически, используя данные, хранящиеся в предоставляемом нами буферном объекте. Каждый атрибут вершины получает данные из буфера, привязанного к одной из нескольких привязок буфера вершин. Для этого мы используем
glVertexArrayAttribBinding(GLuint vao, GLuint attribindex, GLuint bindingindex)
. Также мы используемglVertexArrayVertexBuffer()
функцию для привязки буфера к одной из привязок буфера вершин. Мы используемglVertexArrayAttribFormat()
функцию для описания макета и формата данных, и, наконец, мы включаем автоматическое заполнение атрибута путем вызоваglEnableVertexAttribArray()
.Когда атрибут вершины включен, OpenGL будет передавать данные в вершинный шейдер на основе информации о формате и местоположении, которую вы предоставили с помощью
glVertexArrayVertexBuffer()
иglVertexArrayAttribFormat()
. Когда атрибут отключен, вершинному шейдеру будет предоставлена статическая информация, которую вы предоставляете при вызовеglVertexAttrib*()
.И код в шейдере
Ведь вам нужно позвонить
glDeleteVertexArrays(1, &vao)
.Вы можете прочитать OpenGL SuperBible, чтобы лучше понять это.
источник