Самый быстрый способ рисовать мелкие частицы в OpenGL?

8

Быстрый вопрос: Какой самый быстрый способ визуализации большого массива частиц 4x4 / 8x8 в opengl? В настоящее время я трачу 2 треугольника на каждого, но я думаю, что он медленный, поэтому я действительно хотел бы знать, правильно ли я делаю это .....

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

Ответы:

6

Вы можете рисовать точки с OpenGL.

Вы хотите вызывать glDrawArrays () или glDrawElements () с GL_POINTS (вместо GL_TRIANGLE_STRIP или чем-то еще, что вы используете.)

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

Вы не можете текстурировать эти точки; они просто одного цвета.

notlesh
источник
Спасибо за подсказку. Вы случайно не знаете, смогу ли я сделать метод GL_POINT с шейдерами, чтобы я мог сопоставить текстуру с ними?
user1010005
1
Вы можете использовать с шейдерами, но есть только одна вершина для точки (в центре), поэтому вам может быть трудно придумать текс-координаты. stackoverflow.com/questions/5839095/… похоже, это немного говорит об этом ...
notlesh
Вы также можете установить точечный спрайт с помощью GL_POINTS.
Мик
1
@ user1010005 Чтобы текстурировать карту с GL_POINTS, вы можете заглянуть в GL_POINT_SPRITE_ARB. Кроме того, я почти уверен, что точки всегда занимают одинаковое количество пикселей на экране, независимо от того, насколько близко или далеко вы от них.
Kevintodisco
@ Ktodisco, вы можете передать размер точки в качестве атрибута. Я достиг приличного эффекта звезды, сделав это. чтобы изменить размер в вершинном шейдере, вы присваиваете переменную gl_PointSize
notlesh
3

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

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

kevintodisco
источник
1
Вероятно, это лучшее решение, чем GL_POINTS, но оно не будет работать для более старых реализаций OpenGL (и OpenGL ES).
notlesh
Звучит отлично, но я планирую перенести свою игру на платформу Android :(
user1010005
2
@ user1010005 Просто совет, вы должны упомянуть, что когда вы задаете вопрос, мы знаем, с какими ограничениями работать :)
kevintodisco
Я начинающий с opengl извините D:
user1010005
я бы ЛЮБЛЮ увидеть геометрию шейдеров, представленными в OpenGL ES. ) =
notlesh