OpenGL - способ динамического отображения множества точек - PullRequest
0 голосов
/ 03 мая 2011

Я задаю вопрос по теме, над которой я сейчас работаю.

У меня есть представление OpenGL, в котором я хотел бы отображать точки. Пока что это то, с чем я могу справиться;)

Для каждой точки у меня есть свои координаты (X; Y; Z) и значение (беззнаковый символ). У меня есть цветовой массив, дающий связь между одним значением и цветом. Например, 255 - красный, 0 - синий и т. Д. ...

Я хочу отобразить эти точки в представлении OpenGL. Я хочу использовать пороговое значение, чтобы в зависимости от него я мог изменять значение прозрачности цвета в зависимости от значения одной точки. Я также хочу, чтобы производительность не ухудшилась, даже если у меня много очков (5 миллиардов в худшем случае, но 1–2 миллиона в стандартном случае).

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

Я открыт для любых предложений, и я хотел бы обсудить любые ваши идеи!

Ответы [ 4 ]

3 голосов
/ 03 мая 2011

Попытка отобразить миллиард точек или более обычно (простите за каламбур) бессмысленно.

Даже экран с очень высоким разрешением имеет всего несколько миллионов пикселей.Ничто из того, что вы можете сделать, не заставит его отображать больше точек, чем это.

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

3 голосов
/ 03 мая 2011

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

1 голос
/ 03 мая 2011

Если вам нужно что-то смоделировать для обновлений, вы должны рассмотреть возможность использования CUDA или OpenCL для полного запуска обновления на GPU.Это даст вам лучшую производительность.В противном случае вы можете использовать один VBO и обновлять его один раз за кадр из ЦП.Если это происходит слишком медленно, вы можете попробовать несколько буферов и распределить обновления по нескольким кадрам.

Для порога вы должны использовать равномерную переменную шейдера вместо изменения буфера вершин.Это позволяет вам установить значение для каждого кадра, которое затем может быть объединено с данными из буфера вершин (например, вы устанавливаете float minVal; и каждая вершина с некоторым атрибутом меньше, чем minVal, отбрасывается в геометрический шейдер.)1003 *

0 голосов
/ 03 мая 2011

Поместите все в одно VBO. Нарисуйте его как массив точек: glDrawArrays(GL_POINTS,0,num). Вычислить альфа в пиксельном шейдере (используя порог, переданный как равномерный).

Если вы хотите изменить небольшое подмножество точек - вы можете отобразить поддиапазон VBO. Если вам нужно часто обновлять большие детали - вы можете использовать Transform Feedback для использования графического процессора.

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