Как именно VBO хранит свой контент?

Я начал учиться и столкнулся с некоторой неясностью: я не понимаю, когда мы выделяем память для VBO?

Я думаю, что мы выделяем память при вызове glBufferData, но означает ли это, что мы всегда сохраняем большой банк выделенной памяти независимо от того, какой VAO мы связываем? Поэтому мне нужно связать VAO только для атрибутов, просто чтобы указать GPU, из каких VBO брать данные (которые уже есть в GPU) и как эти данные интерпретировать… вот и вся связь между VAO и VBO, только через атрибуты…

Бывают случаи, когда вам нужно несколько VBO в одном VAO. И бывают случаи, когда один и тот же буфер используется в разных VAOS. Чтение эта хорошая книга

Ripi2 26.07.2019 01:09
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
200
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

VBO, скорее всего (но не всегда!) выделены в памяти графического процессора. glBufferData до недавнего времени был единственным методом выделения памяти в VBO (Если вы используете GL4.5, glBufferStorage теперь является рекомендуемым способом выделения памяти). Данные внутри VBO — это, по сути, просто большой кусок неизвестного материала (ну, неизвестно GPU). Из процессора/основной оперативной памяти мы вызываем glBufferData, и графический процессор выделяет часть памяти для хранения данных и слепо копирует данные из основной оперативной памяти в оперативную память графического процессора. GPU понятия не имеет, что в нем содержится....

VAO — это просто описание размещения буфера в памяти. Возьмем пример...

  • VBO1: содержит данные вершин и нормалей для куба.
  • VBO2: содержит данные вершин и нормалей для сферы.

Предположим, что нормали и вершины упакованы в структуру, которая выглядит так:

struct VertexNormal {
  float vx, vy, vz;
  float nx, ny, nz;
};

В обоих случаях все верно:

  • вершина имеет смещение 0
  • нормаль имеет смещение 12 (т.е. 3 x sizeof(float))
  • шаг для каждой вершины и нормального элемента равен 24 (6 x sizeof(float))

Эту информацию необходимо передать от ЦП к ГП, чтобы ГП мог правильно считывать данные из буферов в атрибуты вершин при рендеринге. Без этой информации графический процессор просто смотрит на VBO как на скопление чего-то неизвестного.

Мы передаем эту информацию графическому процессору через VAO. VAO хранит следующую информацию о данном атрибуте вершины, которая нужна вашему шейдеру:

  • тип данных (GL_FLOAT, GL_INT и т. д.)
  • количество элементов (Vec2, Vec3, Vec4??)
  • шаг между каждым элементом
  • Буфер, содержащий эти данные [также известный как точка привязки]

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

Учитывая, что наш куб и сфера, вероятно, визуализируются с помощью одного и того же шейдера, а данные вершин и нормалей одинаковы в обоих буферах, в этом случае мы можем использовать 1 VAO (и просто изменить буфер [ы], которые мы связываем с помощью glVertexArrayVertexBuffers).

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