Я думаю, что вы должны думать об эффекте как "вычислить карту, где находится вода" + ", сгенерировать нормальный вектор из этой карты и использовать его, чтобы сместить поиск текстуры фона".
Разбивая то, что делает ваш пример с шадертой, он просто вычисляет «след», чтобы показать, где происходит очищение:
Рассчитывает нормали круговых капель дождя,
и использует эту карту нормалей для смещения текстурного поиска до искусственного преломления.
Если вы хотите, чтобы следы выполнялись с помощью пост-обработки в шейдере, вам просто нужно создать форму «следа» в шейдере, используя некоторую алгебру. Например, в следующей функции я наложил «шаткий путь» и конус на голову и хвост, чтобы получить
float trailDrop(vec2 uv, vec2 id, float t) {
// wobbly path
float wobble = 0.5 + 0.5
* cos(120.0 * uv.y)
* sin(50.0 * uv.y);
float v = 1.0 - 10.0 * abs(uv.x - 0.5 + 0.2 * wobble);
// head
v *= clamp(30.0 * uv.y, 0.0, 1.0);
v *= clamp( uv.y + 7.0 * t - 0.6, 0.0, 1.0);
// tail
v *= clamp(1.0 - uv.y - pow(t, 2.0), 0.0, 1.0);
return clamp(v * 10.0, 0.0, 1.0);
}
Вот грубый POC в шадертой - https://www.shadertoy.com/view/XlBfz1, демонстрирующий создание набора троп троп дождевой капли. Он выглядит зернистым при небольших разрешениях из-за разрешения производных, но должен выглядеть лучше, если вы его полноэкранный.
Изменить: Добавлен пример с наложенными каплями дождя
Оставлено в качестве упражнения для читателя:
1) Добавьте маленькие круглые капли. Для вдохновения посмотрите на StaticDrops
функцию в вашем оригинальном примере с шадертой.
2) Добавьте в качественные нормальные расчеты. Как следует из #define CHEAP_NORMALS
варианта в вашем исходном примере с шейдертой, встроенный dFdx является приближением низкой точности, и вы можете получить лучшие результаты, вручную вычисляя производные (за счет вычисления функции 3 раза).
3) Рандомизация расстояния между столбцами. Вы можете расширить столбцы, а затем изменить uv.x - 0.5 + 0.2 * wobble
бит, чтобы добавить случайное смещение по оси x. Вы также, вероятно, захотите еще раз вынуть страницу из исходного примера и наложить несколько слоев потоков разного размера друг на друга, чтобы получить менее однородный вид.
Вы можете сделать этот эффект, выполнив следующие действия:
частица
RenderTextuer
Вы можете сохранить результат с помощью RenderTexture. это пример многопроходности в шадертой:
https://www.shadertoy.com/view/ltccRl
Я создал камеру для рендеринга частиц в RenderTexture:
GrabPassing
Вы можете получить пропуск для применения искажения
Я объяснил это в этом посте:
Как я могу воспроизвести эффект искажения частиц Quantum Break?
пятно
с помощью альфа-цвета в течение жизни у нас есть простое размытие
чтобы получить лучший результат, лучше использовать простое размытие, но как нам добиться размытия?
Сверточная матрица
При обработке изображений ядро, матрица свертки или маска представляют собой небольшую матрицу. Он используется для размытия, повышения резкости, тиснения, обнаружения краев и многого другого. Это достигается путем свертки между ядром и образом.
для более подробной информации, пожалуйста, перейдите по этой ссылке
Boxblur
Репетиция
Вы можете использовать Rendertexture для сохранения предыдущего кадра. Так что вы можете захватить предыдущий кадр, а затем размыть. повторяя это, вы достигаете размытия.
Обычный
Вывод
Финальный шейдер:
без использования альфа-цвета в течение жизни:
используя альфа в цвете над Lifetime:
Источник доступен:
https://github.com/smkplus/RainDrop
Есть больше!
также вы можете сделать рябь
Полезные ссылки
https://80.lv/articles/breakdown-animated-raindrop-material-in-ue4/
https://seblagarde.wordpress.com/2013/01/03/water-drop-2b-dynamic-rain-and-its-effects/
источник
На самом деле был вопрос об этом много лет назад, но он вообще не относится к Unity (к сожалению). Если вы посмотрите на слайд 57 связанной презентации, они упоминают подход на основе сетки.
На Physics SE есть несколько взаимосвязанный вопрос, который может показаться вам интересным. Ссылка на droplet.pdf в связанном вопросе не работает, но она все еще находится на Wayback Machine. Это входит в некоторую математику воды, бегущей с нескольких типов поверхностей. Например, капли предпочитают путешествовать по путям, ранее использовавшимся в предыдущих каплях дождя (см. С. 926).
Вы могли бы, вероятно, просто смоделировать головы и хвосты каждой «капли дождя» и позволить ей немного зигзагать. Когда сталкиваются два вытянутых капли дождя, я полагаю, вы могли бы объединить их в более крупную и быстро движущуюся каплю дождя. Объем воды остается прежним. Он просто перемещается и формируется силами гравитации, адгезии к стеклу и сцепления.
источник