На некоторых локациях в моде будет идти дождь. Это заставило меня задуматься о реализации различных эффектов.
Для дождя было решено сделать следующие эффекты: собственно сам дождь (падающие с неба капли), разные эффекты при ударе капель о поверхность, стекающие капли на окнах.
С каплями дождя проблем почти не было. Подправив уже имеющуюся систему частиц, удалось создать неплохой дождь, который был гораздо лучше стандартного (который делался с помощью брашевой энтити). Вокруг игрока падало больше капель, можно было регулировать дальность отрисовки капель, их скорость, их реакцию на разный ветер. Также эти капли не проходили сквозь объекты, что тоже было несомненным плюсом.
Эффекты при ударе капель... Здесь было решено отказаться от стандартных. Они смотрелись не очень красиво и дополнительное большое частиц в кадре не лучшим образом сказывалось на производительности. Поэтому был сделан простой, но красивый эффект - круги на поверхностях. Для этого потребовалось сделать анимированную карту нормалей для поверхностей, которые были под дождем. Например, текстура асфальта. Очень трудно было сделать анимированную часть. Нужно было ее зациклить, а также затайлить. В итоге я сделал этот эффект в 3д редакторе. Эти круги были сделаны с помощью торов, меняющих свой размер. Они появлялись в разных местах, проигрывали свою анимацию уменьшения и исчезали. Таким образом удалось создать некое подобие карты высот для асфальта под дождем. Фоном для торов была плоскость с текстурой, где в в роли диффузной карты использовалась карта высот базовой поверхности.
Торы были белыми, имитируя круги от падающих капель.
Затем с помощью фотошопа и плагина каждый кадр анимации был инвертирован в карту нормалей. Кадров было 80 штук и каждый раз в ручную пересохранять каждый файл - дело не самое приятное. для автоматизации процесса использовалась функция фотошопа под названием Actions. суть ее заключается в том, что вы один раз записываете все действия, и затем повторяете их нажатием одной кнопки для всех остальных файлов.
Далее с помощью утилиты vtex я собрал все кадры в один анимированный файл формата vtf.
Теперь предстояло создать материал для нашего асфальта. Здесь все очень просто. Мне нужен был смешанный материал, т.е. использующий 2 диффузки которые можно смешивать. Vmt вышел такой:
"WorldVertexTransition"
{
"$basetexture" "имя_текстуры_асфальта"
"$basetexture2" "имя_текстуры_асфальта"
"$bumpmap" "имя_анимированной_нормали" (для открытых мест)
"$bumpmap2" "имя_статичной_нормали" (для мест под навесами и крупными предметами)
"$surfaceprop" "concrete"
"$envmapcontrast" 1
"$envmapsaturation" 1
"$envmaptint" "[ .3 .3 .3 ]"
"$envmap" "env_cubemap"
"%keywords" "MR"
"Proxies"
{
"AnimatedOffsetTexture"
{
"animatedtexturevar" "$bumpmap"
"animatedtextureframenumvar" "$bumpframe"
"animatedtextureframerate" 40.00
}
}
}
Затем я создал простенькую карту для теста получившейся текстуры. Вот результат проделанных махинаций:
Асфальт блестит, капли падают, круги появляются и исчезают. На мой взгляд вышло довольно неплохо. Да, сравнивать это с аналогичным эффектом в современных играх не стоит. Там все гораздо качественней, красивее. Но даже такой результат на движке 10-летней давности вполне неплох.
Стекающая по стеклу вода. Этот эффект был нужен для локаций закрытых. Чтобы изнутри было видно, как текут капли воды по стеклу и искажают фон. Сделать этот эффект было очень просто. Для этого я сделал черную текстуру в фотошопе. Накидав белых точек разного размера я размыл их по вертикали. Чтобы в итоге получились короткие белые размытые полоски.
С помощью плагина, сделал из этой текстуры карту нормалей.
Далее создание материала. Суть заключается в том, что это будет материал, который умеет искажать фон за собой на основе карты нормалей - то есть refract. А сама карта нормалей будет двигаться вниз, имитируя стекание капель воды по поверхности стекла. Вот содержание материала:
"Refract"
{
"$refractamount" "0.05"
"$bluramount" "0"
"$REFRACTTINT" "{255 255 255}"
"$scale" "[0.4 0.4]"
"$normalmap" "new/rain_n"
"$surfaceprop" "glass"
"Proxies"
{
"TextureScroll"
{
"texturescrollvar" "$bumptransform"
"texturescrollrate" .05 (скорость движения)
"texturescrollangle" 90.00 (угол направления движения)
}
}
}
И вот результат:
Конечно такие эффекты более явно видны в движении, но даже на статичной картинке видны капли, которые искажают фон за собой.
Возможно где-то я поступил нелогично и сделал много лишних действий. Возможно существуют программы, которые генерируют карты высот\нормалей для таких эффектов. Может проще было найти анимированную гифку и ее накладывать на текстуры. Но способ описанный выше тоже имеет право на существование.
На этом наверно все. Если кто-то возьмет на вооружение данный метод создания эффектов, буду только рад.