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