Когда использовать массив вершин, а когда использовать VBO?

14

Я пытаюсь узнать о массивах вершин и объектах буфера вершин , но я не понимаю различий с точки зрения:

  • случай использования (статическая геометрия, такая как рельеф, геометрия, которая изменяет каждый кадр, как система частиц, и т. д.)
  • производительность
  • портативность (старая видеокарта, консоли, устройства, такие как Android или iPhone и т. д.)

некоторые уточнения?

nkint
источник
3
Для всех, кто прибудет сюда, ознакомьтесь с наиболее
востребованным

Ответы:

14

Вот достойный отзыв о 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
источник
2
В этом PerformanceTuning.pdf говорится, что VBO "могут ухудшить производительность в неоптимальных случаях" ... но это не уточняет. Есть идеи, что это за дела? У меня есть случай, когда мне нужно обновлять геометрию каждый кадр, поэтому мне интересно, будет ли массив вершин лучше или хуже, чем VBO в этом случае. Спасибо.
sidewinderguy
1
прочитайте opengl.org/sdk/docs/man/xhtml/glDrawElements.xml и opengl.org/wiki/GlDrawElements - массивы вершин AREN'T не устарели и не удалены, они все еще поддерживаются начиная с OpenGL 4.x; Выясните свои факты, приятель, потому что то, что вы распространяете, является просто дезинформацией
1
@vaxquis Массивы вершин на стороне клиента устарели. Серверные вершинные массивы не являются. ВАО - это разные вещи и предназначены для сохранения государства. Ничто не было неправильно в посте, хотя могло бы быть более точным, если бы это указывало на стороне клиента. Но я думаю, это было неявно.
concept3d
1
«Массивы вершин на стороне клиента устарели. Массивы вершин на стороне сервера - нет». «Вершинные массивы. Они доступны в OpenGL до версии 3.0, устарели в версии 3.0 и отсутствуют в версии 3.1+». «Вы можете заранее указать отдельные массивы вершин (...) и использовать их для построения последовательности примитивов с помощью одного вызова glDrawElements. Ядро в версии 4.4», - я вижу противоречие в этих утверждениях.
2
Плюс, прежде чем сказать что-то «не рекомендуется», укажите источник такого заявления, желательно в официальном документе. Указание от StackExchange на StackOverflow в качестве доказательства - это НЕ способ, которым работает наука, и защита с «Я думаю, это было неявно» не является аргументом. Никто не спрашивал о клиент-серверных массивах, вопрос был о массиве вершин в самом широком смысле по сравнению с VBO. Кстати, я ничего не сказал о ВАО, откуда эта идея?
11

(Я добавляю это здесь из-за того факта, что ответ 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)визуализировать.

инженер
источник
+1 VAO - это ужасное и запутанное имя, и оно всегда напоминает мне о том, какой путаницей стал openGL.
concept3d
1
Я также не забываю идти с обсуждением по этому вопросу (большая часть была удалена). Опять же, проблема в ужасной терминологии OpenGL. Я также отредактировал ответ Криса, чтобы быть более точным.
concept3d