Лучший способ использовать VBOs

Каковы самые быстрые и самые гибкие (применимые в большинстве ситуаций) способы использования VBOs?

Я разрабатываю приложение openGL, и я хочу, чтобы он достиг максимальной производительности, поэтому мне нужно, чтобы кто-то ответил на эти вопросы. Я прочитал много вопросов и ответов, но я догадываюсь, что мне не нужна информация, которая мне не нужна, что забивает мой мозг...

  • Сколько vbos следует использовать?
  • Как мне создать vbos?
  • Как обновить данные vbos, если размер данных не исправлен?
  • Как мне сделать vbos?
  • Как мне обращаться с данными в vbos, которые я больше не хочу отображать?

Ответ 1

  • Сколько vbos следует использовать?

Как можно меньше. Переключение VBO осуществляется с небольшой, но измеримой стоимостью. В общем, вы попытаетесь сгруппировать аналогичные данные в VBOs. Например, в игре FPS все различные виды мусора, лежащие на улице, небольшие реквизиты и т.д., Обычно будут расположены в одном и том же или только небольшом количестве VBOs.

Это также сводится к размеру партии рисунка. glDraw… вызовы, которые составляют менее 100 примитивов, являются субоптимальными (это всегда было так, даже 15 лет назад). Таким образом, вы хотите, по возможности, выпустить по меньшей мере 100 примитивов. Но если имеется только одна сетка, скажем, 20 треугольников (низкопоставленные реквизиты для инстанса или такие), каждый в своем собственном VBO вы больше не можете делать больше.

  • Как мне создать vbos?

glGenBuffers → glBindBuffer → glBufferData​​p >

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-буфера.

Ответ 2

Сколько vbo я должен использовать?

Сколько вам нужно, звучит глупо, но хорошо, так оно и есть

Как обновить данные vbos, если размер данных не исправлен?

Перезаписать и отобразить один и тот же VBO с разными данными и длиной.

Как создать vbos?

Как визуализировать vbos?

см. учебник VBO

Как мне обращаться с данными в vbos, которые я больше не хочу отображать?

создать новое vbo и скопировать данные в него или отобразить только те части этого vbo, которые находятся в памяти.

Чтобы отобразить только части, см. glVertexBuffer glTexCoordPointer (просто вычислите новый указатель и новый размер на основе смещения)

Изменить 1:

Использование одного VBO для всего, что не так, потому что вам нужно управлять алликацией новых координат вершин/текстурных координат, которые действительно становятся очень грязными.

Лучше группировать небольшие реквизиты в VBO и выполнять команды рисования.

Могу ли я добавить данные в буфер с помощью glBufferSubData (добавив 100 элементов в буфер с размером x)?

Нет, это невозможно, потому что описание говорит updates a subset of a buffer object data store, а подмножество - меньшее множество внутри набора.

Изменить 2

Хорошее учебное пособие также Изучение современного 3D-графического программирования, но его не специфический VBO.