OpenGL ES 2.0 - лучший маршрут для простых систем частиц - PullRequest
3 голосов
/ 08 сентября 2011

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

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

Ответы [ 2 ]

4 голосов
/ 08 сентября 2011

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

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

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

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

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

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

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

0 голосов
/ 08 сентября 2011

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

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

...