OpenGL ES 2.0 Лучший путь для простых систем частиц

Я пытаюсь создать очень упрощенную систему частиц для приложения Android с использованием OpenGL ES 2.0. В основном это только для линейно движущихся облаков на заднем плане. Моей первой мыслью перед тем, как начать это, было работать с точечными спрайтами, и это то, что я пытался сделать. Мне было довольно сложно заставить это работать, но помимо этих проблем, действительно ли точечные спрайты подходят для этого?

Я прочитал довольно много противоречивых вещей о них в своих поисках, чтобы решить свои ошибки, и я не хочу тратить много своего времени на то, чтобы все работало правильно, если это не то решение, которое я должен искать в первое место. Люди публикуют с ними всевозможные проблемы, такие как отсечение и даже падение производительности по сравнению с простым использованием треугольников. Я хотел бы, чтобы опытные пользователи понимали, где точечные спрайты подходят и когда их следует использовать, в том числе в таких ситуациях, как моя, когда они будут не более чем несколькими десятками «частиц» на экране самое большее.


person Shamrock    schedule 08.09.2011    source источник


Ответы (2)


Имейте в виду, что существуют жесткие ограничения на размер точечных спрайтов, и чем больше размер, тем ниже производительность. Если ваша цель состоит в том, чтобы иметь только 12 «частиц», я думаю, вы должны визуализировать их в виде четырехугольников. С другой стороны, если ваша цель состоит в том, чтобы иметь 12 облаков, состоящих из многих-многих «облачных частиц», каждая из которых придает им анимированный эффект, тогда да, вам следует использовать точечные спрайты.

Узким местом будет скорость заполнения, тем более, что вы, вероятно, будете использовать смешивание.

Если у вас 100+ облаков, вопрос использовать точечные спрайты или нет становится более актуальным. Чтобы их анимировать, нужно либо отправлять новый буфер в opengl каждый кадр (метод 1), либо рендерить каждое облако в отдельном вызове с другой матрицей преобразования (метод 2). Последний, скорее всего, будет самым медленным, но первый требует от вас отправки 4 новых вершин на облако (при условии индексированного рендеринга) по сравнению с всего 1 новой вершиной на облако, если вы использовали точечные спрайты (метод 3).

На этом этапе очень легко приблизительно рассчитать, что будет самым быстрым. Метод 2 означает, что 16*4*num_clouds байт данных передается на графический процессор в каждом кадре, метод 1 — d*4*num_clouds, а метод 3 — d*num_clouds, где d равно 2 или 3 в зависимости от того, нужно ли вам z.

Стоит также отметить, что методы 1 и 3 отправляют данные одним пакетом, а метод 2 отправляет 16*4 байта за раз.

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

РЕДАКТИРОВАТЬ: На самом деле, что бы вы сделали в случае многих частиц, это установить единое время и иметь скорость для облаков в качестве статических атрибутов, а затем анимировать их в шейдере, умножая скорость на время и делая убедитесь, что они обернуты вокруг края, если это необходимо. Таким образом, вам нужно будет передавать только 4 байта на кадр для полностью анимированной облачной сцены.

person Emil Romanus    schedule 08.09.2011
comment
Похоже, что точечные спрайты по-прежнему подходят для меня, поэтому я полагаю, что буду сражаться и попытаюсь заставить их работать. Большое спасибо за эту полезную информацию. Однако у меня есть еще одна проблема с ними. Я читал, что некоторые устройства вообще их не отображают, и мне было интересно, была ли это проблема со старыми телефонами Android (при использовании OpenGL ES 1.1), а не с более современными телефонами, такими как те, на которых будет работать мое приложение? - person Shamrock; 08.09.2011

Я рекомендую вам прочитать статью о частицах «3D-программирование iPhone».

Название этой книги включает «iPhone», но эта книга объясняет OpenGL ES 1.1/2.0 в целом. Таким образом, вы можете использовать знания из этой книги для Android или Android NDK.

person Kazuki Sakamoto    schedule 08.09.2011
comment
Спасибо за ссылку, Кадзуки, так как я сейчас изучаю OpenGL ES 2.0, похоже, это будет полезно для меня. :) - person Shamrock; 08.09.2011