Производительность использования большого количества небольших VBO - PullRequest
1 голос
/ 31 декабря 2011

Я хотел знать, предназначены ли VBO OpenGL для использования только для больших геометрических массивов или имеет смысл использовать их даже для небольших массивов. У меня есть код, который позиционирует различные геометрии относительно другой геометрии, но некоторые из «листовых» геометрических объектов довольно малы, квадратные сферы 10х10 и т. П. (200 треугольников за штуку). У меня может быть очень много таких маленьких листовых объектов. Я хочу иметь возможность иметь разные матрицы преобразования для каждого из этих маленьких конечных объектов. Кажется, у меня есть 2 варианта:

  1. Используйте отдельное VBO для каждого конечного объекта. Я могу закончить с большим количеством VBO.

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

Имеет ли большое количество VBO неэффективное, или я должен просто пойти дальше и выбрать вариант 1? Есть ли лучшие способы справиться с ситуацией с большим количеством мелких предметов? Должен ли я вместо этого использовать массивы вершин или что-то подобное?

Ответы [ 2 ]

2 голосов
/ 31 декабря 2011

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

  • Если вам никогда не понадобится добавлять или удалять объект после инициализации (или изменять какой-либо объект), то, вероятно, более эффективно постоянно связывать один буфер и изменять значения шага / смещения для визуализации различных объектов.

  • Если у вас есть только базовый набор геометрии, который останется статичным, используйте для этого один VBO и отдельные VBO для геометрии, которую можно добавить / удалить / преобразовать.

  • Если вы можете добавлять или удалять объекты по своему желанию, каждый объект должен иметь свой собственный VBO, чтобы сделать управление памятью намного проще.

1 голос
/ 31 декабря 2011

Хорошая информация находится по адресу: http://www.opengl.org/wiki/Vertex_Specification_Best_Practices

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

Один огромный буфер не получит огромной разницы в производительности ... Я думаю, что лучшим вариантом было бы хранить несколько (но не все) объектов на один VBO.

рендеринг с использованием одного буфера: с этим нет проблем ... у вас просто есть один буфер, который привязан, и вы можете использовать glDrawArrays с различными параметрами. Например, если один меш состоит из 100 вершин, а в буфере th у вас есть 10 таких мешей, которые вы можете использовать

glDrawArrays(triangles, 0, 100);
glDrawArrays(triangles, 100, 100);
glDrawArrays(triangles, ..., 100);
glDrawArrays(triangles, 900, 100);

таким образом вы минимизируете изменение буферов, и все же вы можете сделать его довольно эффективным.

Являются ли эти "маленькие" объекты одинаковыми? у них одинаковая геометрия, но разные трансформации / материалы? Потому что, может быть, стоит использовать «инстансинг»?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...