Как я могу добиться хорошего эффекта огня с помощью альфа-смешивания и частиц?

41

Используя следующий параметр для эффекта частиц OpenGL:

SRC: GL_SRC_ALPHA
DST: GL_ONE

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

Затем я использовал альфа-смешение:

SRC: GL_SRC_ALPHA
DST: GL_ONE_MINUS_SRC_ALPHA

Это позволяет использовать другие фоны, не влияя на цвет частиц, но сами частицы выглядят тусклыми по сравнению с аддитивной смесью. Как я могу добиться хорошего эффекта огня с помощью альфа-смешивания и частиц?

Добавка:

Добавка на черном Добавка на синем

Альфа:

Альфа на черном Альфа на синем

ОБНОВИТЬ:

Следуя совету Дэвида ниже, я создал отдельную текстуру, а затем использовал добавочную смесь для эффекта частиц, прежде чем рисовать на текстуре. Проблема в том, что рисование на текстуре альфа = 0 приводило к тому, что перед моей картой мира появлялись только цветные части частицы, поскольку обычно у вас черный фон. Хитрость заключалась в том, чтобы использовать две текстуры. Я создал черную текстуру, а затем нарисовал на ней частицы. Затем я удалил альфа-слой частиц с этой текстуры, эффективно удаляя весь окружающий сплошной черный цвет и затухая частично видимыми частицами, оставляя при этом нижележащий черный цвет, как и следовало ожидать при создании аддитивных частиц на черном фоне. Короче, изнурительный процесс, но я в итоге добрался

Обычная добавка и моя версия

Вот ветка, где я разместил свой процесс: http://www.cocos2d-iphone.org/forum/topic/28707?replies=8#post-141528

Видео: http://www.youtube.com/watch?v=JptGbEO3b5E

Арам Кочарян
источник

Ответы:

17

Я признаю, что не знаю какого-либо идеального решения этой проблемы, поэтому я опишу обходной путь, с которым вам может быть или не быть комфортно:

  1. Рендеринг всех частиц с помощью аддитивного смешивания на отдельную текстуру (или визуализацию цели) с прозрачным фоном .
  2. Визуализируйте эту текстуру (или цель визуализации) поверх вашей сцены, используя альфа-смешение .

Я попробовал это в Фотошопе, и вот что я получил - он не идеален, но, по крайней мере, лучше сохраняет исходные цвета:

введите описание изображения здесь

Вот оригинальная текстура без аддитивного смешивания частиц:

введите описание изображения здесь

Дэвид Гувея
источник
Будет ли это разделять их на две текстуры и будет так, как если бы у меня была текстура аддитивной смеси, нарисованная на фоне?
Арам Кочарян
@AramKocharyan Я на самом деле не пробовал это лично, кроме как в Photoshop, где результаты казались разумными. Но я думаю, что это должно выглядеть как ваша первая картинка, но с заменой всех черных на ваш цвет фона. Другими словами, частицы складываются вместе, что приводит к большой подсветке в середине взрыва, но не с фоном. Затем результирующий взрыв вставляется поверх вашего фона без добавления, что сохраняет первоначальный вид.
Дэвид Гувея
Спасибо, что имеет смысл, это как обычное наложение в Photoshop по сравнению с наложением, но оно выглядит как изображение с наложением поверх фонового слоя. Я попробую и дам вам знать.
Арам Кочарян
@AramKocharyan Я опубликую результаты, полученные в фотошопе, через несколько минут, чтобы вы могли сравнить.
Дэвид Гувея
5
Просто добавьте это - эта техника может вызвать проблемы с производительностью ...
notlesh
9

Посмотрите на предварительно умноженную альфу.

http://blogs.msdn.com/b/shawnhar/archive/2009/11/07/premultiplied-alpha-and-image-composition.aspx

Тили
источник
2
Это единственный правильный ответ в этой теме. К сожалению, это так кратко, но каждый должен действительно прочитать это. Предварительно умноженное альфа - это способ сочетания аддитивного и альфа-смешивания, а также множество других преимуществ.
Джейк Макартур
4

Как отметил Дэвид Гувейя, не существует удовлетворительной замены аддитивного смешивания на ярких фонах. Лучший результат, который я обнаружил (для которого не требуется что-то вроде рендеринга в буфер), это использование следующего blendmode GL:

SRC: GL_ONE
DST: GL_ONE_MINUS_SRC_ALPHA

Это не так хорошо, как смешивание добавок, но намного лучше, чем GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA. Если вы немного измените начальные и конечные значения альфа-канала и цвета, вы можете получить результаты, действительно близкие к аддитивному смешиванию.

режимы смешивания частиц

На рисунке выше GL_SRC_ALPHA, GL_ONEслева, в середине GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHAи справа вы можете увидеть режим смешивания, который я бы предложил для этой настройки.

bummzack
источник
Я согласен, что для полного контроля над цветом этот метод прекрасно работает.
Арам Кочарян
Просто для того, чтобы заметить, я заметил, что с помощью этого метода лучший способ потушить огонь - уменьшить его до нулевого размера, так как уменьшение альфа приводит к его исчезновению до белого.
Арам Кочарян
3

Вы пробовали использовать оба? Слой на несколько частиц с альфа-смешением, которые должны получить ваши цвета так, как вы хотите, а затем вернуться с некоторым аддитивным смешиванием, чтобы получить хороший основной момент, который вы ищете.

notlesh
источник
Это может быть мой следующий вариант, хотя я хочу свести частицы к минимуму. Надеюсь, я смогу наполовину и то, и другое.
Арам Кочарян
3

Ну, во-первых, изображения частиц, которые вы используете, имеют черный фон, в результате чего на втором изображении появляются темные полосы. Не делай этого; то есть не рисуйте форму частицы на цветовых каналах. Вместо этого изображение должно быть сплошным цветом и определять только форму в альфа-канале.

Это значительно улучшит внешний вид альфа-прозрачности. Затем вы можете еще больше улучшить внешний вид общего эффекта, изменяя цвет частиц в течение всего срока их службы. Например, базовое изображение очень яркое, что дает вам центральную ярко-желтую область. Затем оттените частицы красновато-оранжевого цвета и увеличьте оттенок со временем. Таким образом, частицы будут темнеть, когда они выходят из центра.

jhocking
источник
Да, текстура - только белая кисть с альфа-каналом, меняющимся от центра.
Арам Кочарян
да, если это правда, то мне странно, что на вашем скриншоте альфа-прозрачности есть темные ореолы вокруг частиц.
Джокинг
Да, я не уверен, почему они сформировались вокруг альфа-смешения. Но то, что я имею сейчас, кажется, хорошо.
Арам Кочарян
Смотрите youtube.com/watch?v=JptGbEO3b5E
Арам Кочарян
Это выглядит довольно хорошо, вы должны включить это в свой вопрос обновления.
Джокинг