GameDev
June 14, 2020

Как создают снег в играх

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

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

Снегопад

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

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

X-MEN с сеги

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

Для сотворения снега системе частиц нужно :

  • олицетворением частицы может быть не только маленький белый кружочек, но и спрайт снежинки или даже её модель.
  • Но системе всё равно, это просто визуализация бесконечного количества частиц.
  • направление движения определяется не столько логикой и гравитацией, но руками творца. Частицы можно закрутить хоть в вихрь, но в обычном падении используются динамичные переменные вектора, например (0.2, -1, 0.2) - это неспешное падение (y) с легким ветерком по диагонали (x,z).
  • количество частиц зависит от вида частиц и предположительной погоды. Здесь уж точно всё просто : больше значение - хуже погода.

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

Снежный пласт

Если в случае снегопада для 2D можно было просто выпилить ось глубины, то для сотворения легкого снежного покрова методы разнятся реализацией, но не логикой.

Если локация заснежена изначально и таковой будет оставаться, логичнее, конечно, сразу обрисовать на ней снежок. В 2D варианте это будет снежный тайлсет, в 3D, если без наворотов, набор текстур в материал.

1 из 2

Набор спрайтов со снежным покровом

Но эта вся статичность довольно скучна. Другое дело когда снег осыпает окружение динамично. Для 2D единый способ найти сложно, ибо положения камер разнятся, но вот в 3D всё более стандартизировано.

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

С видео Brackeys

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

Конечно это очень занятно, но встречается совсем не часто в отличии от следов, что в приоритете создания как минимум от очевидной потребности в их существовании.

В старенькой Metal Gear Solid их реализовали декалями - отдельными объектами, будто прилипающими к поверхности (декали это не только следы от ботинок, но и следы от пуль).

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

1 из 2

Слепок следа стопы в режиме скульптинга и запекание нормали

У метода немало плюсов, но так же немало и минусов.

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

Альтернатива всё же есть, она закрывает эти минусы, но раскрывает новые. О ней можно догадаться со следующего пункта.

Сугробы

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

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

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

Read Dead Redemption 2 - обладатель самой реалистичной природы на сей день

Итак, в чем суть :

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

Пользуясь vertex displacement (что в переводе с эльфийского "смещение вершин"), шейдер поднимает всю геометрию повыше, но лишь визуально; она повторяет любые изгибы террейна и выглядит будто взаправду ровным слоем везде выпал снег.

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