Я пытаюсь узнать о массивах вершин и объектах буфера вершин , но я не понимаю различий с точки зрения:
- случай использования (статическая геометрия, такая как рельеф, геометрия, которая изменяет каждый кадр, как система частиц, и т. д.)
- производительность
- портативность (старая видеокарта, консоли, устройства, такие как Android или iPhone и т. д.)
некоторые уточнения?
Ответы:
Вот достойный отзыв о VBOs.
Производительность
Вот хороший обзор семантики вызова.
Вот еще один хороший обзор проблем с производительностью; в нем мы видим, что VBO более производительны, чем массивы.
Причина, по которой мы предпочитаем VBO, заключается в том, что данные загружаются на карту, поэтому вам не нужно передавать их каждый кадр. В зависимости от типа созданного VBO, вы можете дать подсказки графическому драйверу об использовании (запись-много, чтение-много против записи-много, никогда не читать и т. Д.).
использование
VBO действительно хороши для статической геометрии, такой как ландшафт, который вы не ожидаете изменить, или для инстанцированной геометрии.
Вершинные массивы хороши для данных, которые часто изменяются, но которые также считываются хост-машиной, поэтому для прямой визуализации данных, которыми манипулируют (например, буферы данных лазерного дальномера, где я их использовал). Если вы можете избежать чтения данных на хост-устройстве (просто поместив их на карту), VBO в режиме только записи - хороший вариант.
портативность
Вершинные массивы на стороне клиента Они доступны в OpenGL до версии 3.0, устарели в версии 3.0 и отсутствуют в версии 3.1+. OpenGL ES поддерживает их (OpenGL ES 2 нет).
VBOs Они доступны после OpenGL 1.5. Это единственный способ хранить данные геометрии в OpenGL ES 2 (и так далее, WebGL).
источник
(Я добавляю это здесь из-за того факта, что ответ ChrisE является весьма неоднозначным, что, к сожалению, связано с неоднозначностью исходного вопроса. Однако я собираюсь предположить, что вопрос ОП должен был называться «когда использовать ВАО» и когда использовать VBOs ".)
В ertex В uffer O bjects (которые на самом деле не отличаются от других типов B uffer O bjects, например U niform B uffer O bjects) обеспечивают средства для загрузки вершинных данных в графическом оборудовании.
Объекты V ertex A rray O используются в дополнение к объектам VBO для повышения производительности на стороне клиента (на стороне процессора) за счет уменьшения количества вызовов, необходимых для перепривязки отдельных буферов вершин и повторной установки атрибутов вершин каждый раз, когда вы хотите изменить для рендеринга определенным образом. Вместо того, чтобы выполнять всю эту работу в каждом кадре, вы делаете это один раз (при инициализации), а затем просто заново привязываете соответствующий VAO для каждого (набора) вызовов (вызовов) отрисовки, которые используют соответствующие атрибуты вершины.
Несмотря на это, использование VAO не освобождает вас от дополнительной ответственности за необходимость делать
glBindBuffer
+glBufferData
для любых данных, которые изменяют каждый кадр, например, матрицы положения / поворота / преобразования игровой сущности. Только когда у вас есть полностью статические данные, вам нужно толькоglBindVertexArray(&vao) -> glDraw*(...) -> glBindVertexArray(0)
визуализировать.источник