Каков наиболее эффективный способ управления большим набором строк в OpenGL? - PullRequest
6 голосов
/ 02 декабря 2008

Я работаю над простой программой CAD, которая использует OpenGL для обработки экранного рендеринга. Каждая фигура, нарисованная на экране, построена полностью из простых отрезков, поэтому даже простой рисунок обрабатывает тысячи отдельных линий.

Каков наилучший способ сообщить об изменениях в этом наборе строк между моим приложением и OpenGL? Есть ли способ обновить только определенное подмножество строк в буферах OpenGL?

Я ищу концептуальный ответ здесь. Не нужно вдаваться в реальный исходный код, просто некоторые рекомендации по структуре данных и коммуникации.

Ответы [ 4 ]

8 голосов
/ 02 декабря 2008

Вы можете использовать простой подход, такой как использование списка отображения (glNewList / glEndList)

Другой вариант, который немного сложнее, - использовать объекты буфера вершин (VBOs - GL_ARB_vertex_buffer_object). У них есть преимущество в том, что они могут быть изменены динамически, тогда как список отображения не может.

Они в основном упаковывают все ваши данные / преобразования и выполняются на GPU (при условии, что вы используете аппаратное ускорение), что приводит к более высокой производительности.

7 голосов
/ 02 декабря 2008

Vertex Buffer Объекты, вероятно, то, что вы хотите. После загрузки исходного набора данных вы можете вносить изменения в существующие фрагменты с помощью glBufferSubData().

Если вы добавите дополнительные линейные сегменты и переполните размер буфера, вам, конечно, придется создать новый буфер, но это ничем не отличается от необходимости выделять новый, больший фрагмент памяти в C, когда что-то растет.

РЕДАКТИРОВАТЬ: пара заметок в списках отображения, и почему бы не использовать их:

  1. В OpenGL 3.0 списки отображения устарели, поэтому их использование несовместимо с предыдущими версиями 3.0 (реализации 2.1, конечно, будут на некоторое время, поэтому, в зависимости от вашей целевой аудитории, это может не быть проблемой)
  2. Всякий раз, когда вы что-то меняете, вам приходится перестраивать весь список отображения, который не отвечает всей цели списков отображения, если что-то часто меняется.
2 голосов
/ 09 декабря 2008

Мое предложение - попробовать использовать граф сцены, некую иерархическую структуру данных для линий / кривых. Если у вас огромные модели, это повлияет на производительность, если у вас будет простой список строк. Используя граф / древовидную структуру, вы можете легко проверить, какие элементы видны, а какие нет, используя ограничивающие объемы. Также с помощью графа сцены вы можете легко применить преобразование и повторно использовать геометрию.

2 голосов
/ 02 декабря 2008

Не уверен, что вы уже делаете это, но стоит упомянуть, что вы должны попытаться использовать GL_LINE_STRIP вместо отдельных GL_LINES, если это возможно, чтобы уменьшить количество данных вершин, отправляемых на карту.

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