Найти в Дзене
Stronghold of gamedev

Как делают дождь в играх

Оглавление

Продолжая тему водических шалостей, а так же недавно начатый цикл писанины о реализации погодных условий, настала очередь простейшего, на первый взгляд, дождика.

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

Партиклы для чайников

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

-2

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

Описывая мимолетную жизнь частицы сложно сказать что-то новое, однако методы реализации дождя всё же разнятся, иногда в зависимости от его интенсивности. Так для ливня, например, можно выкрутить ползунок количества появляющихся частиц и увеличить скорость их падения.

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

Лужи и мокрые материалы

Обильное поливание чего-либо водой, обычно на объекте издевательств сказывается, что для нас важно - визуально.

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

-3

Кожа начнет блестеть - обычно достаточно выкрутить smothness (гладкость) поболее, однако если кому-то взбредет в голову увлажнять отдельные части кожи персонажа - можно процедурно изменять карту гладкости.

По такому же принципу можно работать с тканью - избирательное затемнение отдельных участков через проецирование на UV карту с последующим обсыханием. Особое внимание уделили этому в GTA V :

-4

Там, кроме мокрой одежды после плавания и дождя, на персонажах появляются пятна пота, вероятно, с помощью особой текстуры, этакий sweat map.

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

-5

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

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

К простейшему её проявлению можно отнести обыкновенное рандомное раскидывание лужек по площади, увеличение луж путём рандомного пиксельного разрастания по картам гладкости, однако самый занятный вариант я вижу в реализации подтоплений :

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

Фокусы шейдеров

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

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

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

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

Водная гладь, например, предположительно обязана визуализировать последствия падения на неё капель, но и здесь выход не один :

Взято с хабра
Взято с хабра

Воспользовавшись математикой, можно легко, с помощью тесселяции, реализовать объемные и волнистые круги на воде, а затем рисовать их под каплями.
Однако опять затратность этого процесса для тысяч капель велика, лучше избежать расчетов, тесселяции (она здесь вообще ни к чему) и точечной отрисовки, упаковав с десяток тайлов ряби в карту нормалей и рисуя их рандомно по всей площади поверхности.

-10
-11

Ну и напоследок пару слов о капельках стекающих. Именно непонятность их реализации погрузила меня в шейдерное безумие, не дозволив не написать об этом комплексно, заканчиваю на последней ноте.

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

-12

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

Лонгрид о снежке тут.