Я начал учиться и столкнулся с некоторой неясностью: я не понимаю, когда мы выделяем память для VBO?
Я думаю, что мы выделяем память при вызове glBufferData
, но означает ли это, что мы всегда сохраняем большой банк выделенной памяти независимо от того, какой VAO мы связываем? Поэтому мне нужно связать VAO только для атрибутов, просто чтобы указать GPU, из каких VBO брать данные (которые уже есть в GPU) и как эти данные интерпретировать… вот и вся связь между VAO и VBO, только через атрибуты…
VBO, скорее всего (но не всегда!) выделены в памяти графического процессора. glBufferData до недавнего времени был единственным методом выделения памяти в VBO (Если вы используете GL4.5, glBufferStorage теперь является рекомендуемым способом выделения памяти). Данные внутри VBO — это, по сути, просто большой кусок неизвестного материала (ну, неизвестно GPU). Из процессора/основной оперативной памяти мы вызываем glBufferData, и графический процессор выделяет часть памяти для хранения данных и слепо копирует данные из основной оперативной памяти в оперативную память графического процессора. GPU понятия не имеет, что в нем содержится....
VAO — это просто описание размещения буфера в памяти. Возьмем пример...
Предположим, что нормали и вершины упакованы в структуру, которая выглядит так:
struct VertexNormal {
float vx, vy, vz;
float nx, ny, nz;
};
В обоих случаях все верно:
Эту информацию необходимо передать от ЦП к ГП, чтобы ГП мог правильно считывать данные из буферов в атрибуты вершин при рендеринге. Без этой информации графический процессор просто смотрит на VBO как на скопление чего-то неизвестного.
Мы передаем эту информацию графическому процессору через VAO. VAO хранит следующую информацию о данном атрибуте вершины, которая нужна вашему шейдеру:
Эта информация для каждой вершины может быть довольно большой для достаточно сложных шейдеров, поэтому это не то состояние, которое мы хотим настраивать слишком часто. Вот здесь и появляется VAO. Мы создаем VAO и заполняем его информацией о каждом входном атрибуте для нашего вершинного шейдера.
Учитывая, что наш куб и сфера, вероятно, визуализируются с помощью одного и того же шейдера, а данные вершин и нормалей одинаковы в обоих буферах, в этом случае мы можем использовать 1 VAO (и просто изменить буфер [ы], которые мы связываем с помощью glVertexArrayVertexBuffers).
Бывают случаи, когда вам нужно несколько VBO в одном VAO. И бывают случаи, когда один и тот же буфер используется в разных VAOS. Чтение эта хорошая книга