OpenGL рисует один и тот же полигон много раз в нескольких местах - PullRequest
3 голосов
/ 25 октября 2011

В моем приложении opengl я рисую один и тот же многоугольник примерно 50 000 раз, но в разных точках на экране.В моем текущем подходе я делаю следующее:

  • Рисуем многоугольник один раз в списке отображения
  • для каждого экземпляра многоугольника, нажимаем матрицу, переводим в эту точку, масштабируеми вращать соответствующим образом (масштабирование каждой точки будет одинаковым, перемещение и вращение не будут).

Однако, с 50k полигонов, это 50k push и pops и вычисления правильных матричных переводовчтобы перейти к правильной точке.

Мой коллега также предложил нарисовать всю сцену в буфер, а затем просто нарисовать весь буфер с одним переводом.Компромисс здесь заключается в том, что нам нужно хранить все вершины многоугольника в памяти, а не только список отображения, но нам не нужно было бы делать push / translate / scale / rotate / pop для каждой вершины.

Первый подход - это тот, который мы внедрили в настоящее время, и я бы предпочел посмотреть, сможем ли мы его улучшить, поскольку для второго способа потребуются серьезные изменения (однако, если второй способ намного быстрее, мы всегда можем сделатьпереписать).

Нужны ли все эти push / pops?Есть ли более быстрый способ сделать это?И стоит ли мне беспокоиться, что такое большое количество нажатий / падений ухудшит производительность?

Ответы [ 2 ]

4 голосов
/ 25 октября 2011

Это зависит от вашей конечной цели. Более поздние спецификации OpenGL позволяют использовать функции «создания геометрии». Вы можете загрузить все матрицы в буфер, а затем нарисовать все 50 тыс. С помощью одного вызова «draw instance» (OpenGL 3+). Если вы ищете временное исправление, по крайней мере, загрузите полигон в объект буфера вершин. Списки отображения очень старые и устарели.

Будут ли эти 50 000 полигонов двигаться независимо друг от друга? Вам придется смириться с некоторой формой "нажатия / выталкивания" (даже при том, что современные графы сцен не обязательно используют явный стек матриц). Если 50k полигонов статичны, вы можете предварительно скомпилировать всю сцену в one VBO. Это бы сделало бы очень быстрым.

3 голосов
/ 25 октября 2011

Если вы можете использовать последнюю версию OpenGL (> = 3.1, IIRC), вы можете посмотреть на glDrawArraysInstanced и / или glDrawElementsInstanced.Для более старых версий вы, вероятно, можете использовать glDrawArraysInstancedEXT / `glDrawElementsInstancedEXT, но они являются расширениями, поэтому вам придется обращаться к ним как таковым.

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

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