Я хотел бы нарисовать большое количество (несколько тысяч) простых сеток (каждая может быть ... максимум 50 треугольников, но даже это очень большая верхняя граница), все из которых абсолютно одинаковы.
Как простой способ грубой силы, сейчас я просто делаю тысячи вызовов отрисовки, где я просто изменяю матрицы преобразования, которые нужны шейдерам, а затем снова рисую те же объекты.
Конечно, это ужасно медленно, так как (я предполагаю) слишком много вызовов отрисовки для драйвера и моего ПК, чтобы эффективно обрабатывать.
Что я могу сделать, чтобы сделать это быстрее?
Ответы:
Решением этого является создание экземпляров. Этот урок объясняет несколько методов создания экземпляров. Если у вас есть
ARB_draw_instanced
иARB_instanced_arrays
используйте их.Общая идея состоит в том, чтобы хранить все преобразования ваших сеток в отдельном объекте буфера и связать его с массивом атрибутов, который использует одну «вершину» на экземпляр через
glVertexAttribDivisor
.Если после этого вы по-прежнему работаете не так быстро, как хотите, вероятно, вы привязаны к процессору вершин. Выполните отбраковку ячеек на сетках и, предпочтительно, создайте BVH для прохождения, вместо того, чтобы делать отбраковку на всех сетках независимо.
источник
glVertexAttribDivisor
(которое не считается устаревшим или каким-либо образом устаревшим) имеет то преимущество, что не имеет верхнего предела количества экземпляров. Производительность исторически была лучше, чем единообразные буферы, но, вероятно, сейчас такая же или очень похожая, и оба способа справляются с работой.