Ответ 1
- Сколько vbos следует использовать?
Как можно меньше. Переключение VBO осуществляется с небольшой, но измеримой стоимостью. В общем, вы попытаетесь сгруппировать аналогичные данные в VBOs. Например, в игре FPS все различные виды мусора, лежащие на улице, небольшие реквизиты и т.д., Обычно будут расположены в одном и том же или только небольшом количестве VBOs.
Это также сводится к размеру партии рисунка. glDraw…
вызовы, которые составляют менее 100 примитивов, являются субоптимальными (это всегда было так, даже 15 лет назад). Таким образом, вы хотите, по возможности, выпустить по меньшей мере 100 примитивов. Но если имеется только одна сетка, скажем, 20 треугольников (низкопоставленные реквизиты для инстанса или такие), каждый в своем собственном VBO вы больше не можете делать больше.
- Как мне создать vbos?
glGenBuffers → glBindBuffer → glBufferDatap >
UPDATE Вы можете передать нулевой указатель на параметр data
glBufferData для инициализации объекта буфера без установки данных.
- Как обновить данные vbos, если размер данных не исправлен?
Создайте VBO с более крупной размерностью, чем размер ваших данных. Ваша операционная система делает это в любом случае для ваших данных на стороне хоста, это называется пейджинг. Также, если вы хотите использовать glMapBuffer, создавая объект буфера, кратный размеру главной страницы, очень хорош для всей системы.
Обычный размер страницы для текущих систем - 4kiB. Так что размерность VBO размера я бы выбрал. ОБНОВЛЕНИЕ: вы можете обратиться в свою операционную систему, какой размер страницы он использует. Хотя это зависит от ОС, я бы задал еще один вопрос.
Обновите данные с помощью glBufferSubData или сопоставьте его с изменением glMapBuffer в сопоставленной памяти на стороне хоста, затем glUnmapBuffer.
Если данные перерастают буферный объект, создайте новый, более крупный и скопируйте с помощью glCopyBufferSubData. См. Параграф lase.
- Как мне сделать vbos?
glBindBuffer → glDraw...
- Как мне обращаться с данными в vbos, которые я больше не хочу отображать?
Если данные потребляют только часть VBO и разделяют ее с другими данными, и у вас не хватает памяти, тогда просто не получайте доступ к ней. В идеале вы держите вокруг какой-то индекс, в котором вы отслеживаете, какой VBO имеет, какие части его доступны для какой задачи. Это очень похоже на управление памятью, а именно на схему, известную как стек объектов (obstacks).
Однако в конечном итоге может иметь смысл уплотнить существующий объект буфера. Для этого вы создадите новый объект буфера, привяжите его как пишущий объект, а старый объект буфера будет выбран как цель чтения. Затем используйте glCopyBufferSubData, чтобы скопировать содержимое в новый, затянутый буферный объект. Конечно, вам придется обновить все ссылки на имя объекта буфера (= OpenGL ID) и смещения.
По этой причине имеет смысл написать тонкий слой абстракции поверх объектов буфера OpenGL, который отслеживает фактические типизированные данные в бесструктурных блоках объектов OpenGL-буфера.