Я ищу самый быстрый способ создать по-настоящему простой эффект частиц, который будет чертовски спамить в игре ...
По сути, моя игра выглядит как игра vectrex, состоящая в основном из линий ... Я хочу сделать несколько небольших взрывов, которые будут действительно распространены.
Есть что-то более быстрое, чем просто перемещение по некоторым точкам и рендеринг с помощью GL_Point?
graphics
opengl
graphics-programming
повышающее устройство
источник
источник
Ответы:
Там действительно нет необходимости хранить память для каждой частицы и анимировать каждую частицу в отдельности. Вы можете сделать это процедурно, восстанавливая положение частицы во время рисования, используя классическое физическое уравнение. s = ut + 1 / 2.at ^ 2
Простой пример (без постоянного ускорения частиц):
Затем вы просто увеличиваете s.timeElapsed на каждой итерации цикла обновления.
Он также полностью поддается реализации на GPU, освобождая ваш процессор от необходимости выполнять какую-либо работу. Реализация gpu может выглядеть так:
Вершинный шейдер GPU затем восстанавливал бы положение частицы с помощью уравнения физики и передавал ему униформы / константы - так же, как это делала версия CPU.
Чтобы добавить некоторую дисперсию, вы можете использовать больше одновременных взрывов с немного отличающимися параметрами, анимируя цвета / альфа, выбирая разные начальные позиции. и т.п.
источник
Я сделал несколько тестов, и самый быстрый способ (не самый быстрый для кодирования) - это частицы из GL_LINE, которые знали свое положение и скорость, и использовали их в качестве точек при рендеринге (поэтому, чем быстрее движется частица, тем больше «линия») становится медленнее, становится точкой).
Эффект ДЕЙСТВИТЕЛЬНО классный (посмотрите видео о любой войне с геометрией, чтобы увидеть его), и ДЕЙСТВИТЕЛЬНО быстрый. Выбить дерьмо из четырехугольников (особенно потому, что из-за четырехугольников мне нужно вычислить двойное количество вершин)
Кроме того, это лучше, чем использование уже готовой системы частиц, потому что я хотел конкретного и быстрого эффекта, системы частиц обычно поддерживают множество функций с пропорциональным количеством накладных расходов.
источник
Обычно я думаю, что вы бы сделали частицы в виде квадратов с текстурой. Обращайтесь с ними как с двумерными спрайтами, и со временем они исчезают, уничтожая их, когда они невидимы. А еще лучше, используйте старые, когда создаете новые, чтобы не тратить память на эти вещи.
Если вы используете предварительно умноженную альфу в искусстве, вы можете легко поддерживать свет, огонь, дым и многое другое, кроме всего прочего, с помощью одного типа операции смешивания.
источник
В OpenGL ES 2.0, ES 1.X с расширением и OpenGL => 2.1 вы можете использовать GL_POINT_SPRITES. GL_POINT_SPRITES - это как четверка всегда перед камерой.
Во фрагментных шейдерах вы можете:
Вы можете использовать текстуру с альфа-каналом для рисования спрайтов шаров ...
Учебник для точечных спрайтов
источник
Большинство систем эффектов частиц, которые я видел, вместо того, чтобы рисовать огромное количество точек, рисуют относительно меньшее количество текстур рекламных щитов, где каждая текстура выглядит как взрыв. Если ваш художественный стиль действительно не мешает, вы, вероятно, будете счастливее идти по этому пути. Это позволит свести к минимуму количество частиц, необходимых для индивидуальной анимации и рендеринга, но при этом даст большой визуальный эффект
источник
Для удобного небольшого способа обработки появления / удаления / обновления частиц, при условии, что у вас есть простой массив частиц - Particles [MAX_PARTICLES]:
Отслеживать активные частицы (начиная с NumActiveParticles = 0)
Новые частицы всегда добавляются в конец массива:
Умный бит - При удалении «мертвой» частицы - меняйте ее на последнюю активную частицу и уменьшайте NumActiveParticles:
Это позволяет избежать любого поиска «неиспользованных частиц» при порождении и избежать сканирования через массив MAX_PARTICLES, если ни один из них не используется.
Обратите внимание, что это работает только в том случае, если порядок обновления / рендеринга не важен (как в случае со многими эффектами частиц, которые используют аддитивное смешивание) - так как этот метод удаления частиц переупорядочивает массив
источник
Я предполагаю, что самый быстрый способ - найти движок частиц и использовать его для своих эффектов. Вот некоторые из них:
источник