Рендеринг тысяч движущихся квадроциклов

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

Я рассмотрел 2 варианта, но так как я не эксперт по OpenGL, я не знаю, что лучше.

  1. Используйте VBO для визуализации их всех.
    Плюсы: быстрее, чем немедленный режим.
    Минусы: (я не знаю много о VBO, но) из того, что я собираю, координаты квадов должны храниться в некотором буфере в ОЗУ... и все эти координаты должны вычисляться ЦП. Поэтому для частицы P1(x,y) мне нужно будет вычислить 4 другие координаты (P2(x-1,y-1), P3(x-1,y+1), P4(x+1,y+1), P5(x+1,y-1)) - это много работы для процессора!

  2. Используйте список отображения: сначала создайте крошечный список отображения для одного квадратного квадрата. Затем, чтобы сделать каждую частицу, pushMatrix, glTranslate, callList, popMatrix,
    Плюсы: мне не нужно вычислять 4 координаты вручную - это делает glTranlate.
    Предположительно списки отображения быстрее, чем VBO.
    Минусы: они быстрее, чем VBO, если они содержат только один квад?

Напоминаю: я называю OpenGL из Java, так что нет плавного способа преобразования Java-массивов в массивы GPU (все должно быть сохранено в промежуточных FloatBuffers перед передачей).

2 ответа

Решение

Списки отображения предназначены для статической геометрии. Рендеринг только одного квадратора, изменение трансформации, промывка и повторение ужасно неэффективны.

Обновление VBO лучше, но все же не оптимально.

Вы должны посмотреть на рендеринг экземпляров. Вот учебник:

http://ogldev.atspace.co.uk/www/tutorial33/tutorial33.html

В случае простых четырехугольников, использующих геометрический шейдер, превращение простого GL_POINTS в два GL_TRIANGLES также поможет.

Для моделирования частиц я думаю, что вам нужно преобразовать обратную связь, вот хорошая демонстрация с некоторым кодом того, как это сделать http://prideout.net/blog/?tag=opengl-transform-feedback

Другие вопросы по тегам