Как мы шейдеры для нашего хоррора делали

Привет! Мы только что анонсировали нашу игру Blueman в Steam. Раскрывать детали геймплея будем позже, но никто не мешает нам рассказать о том, с чего всё начиналось.

Из старых архивов. Цель была просто накидать всё в сцене без общего дизайна.

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

Добавляйте в вишлист! 😊

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

Идея

Рассказ будет вестись от лица нашего художника.
Изначальный визуальный концепт игры был вдохновлён миссией в Левиафане из DMC 3, а именно — декорациями внутренностей. Лично меня эта миссия сильно пугала в детстве. Основной кор игры уже существовал, и пока наш разработчик воплощал первый прототип, я думал, как натянуть тот визуал на кор.

Скриншот из  Devil May Cry 3, Миссия 8. Извините за шакальное качество 🤷‍♂
Скриншот из  Devil May Cry 3, Миссия 8. Извините за шакальное качество 🤷‍♂

На создание 3D-ассетов всегда уходит много времени. И неважно, AAAА-студия вы или делаете игру в одиночку в стиле PS1. Поэтому я решил использовать процедурное создание визуала. Текстуры и маски делал в Substance Designer, базовые меши — в Blender, а в Unity собирал всё это и концептил шейдеры в Shader Graph (далее SG). Хочется отметить, что проект сразу начали делать на HDRP, так как я неплохо его освоил.

Реализация

Декоративные светильники, анимированные шейдером

Шейдеры обычно пишут кодом или концептят в нодовом редакторе типа SG или Amplify, а потом "чистят" сгенерированный код. Но в случае с HDRP работа с шейдерным кодом — пытка для любого графического программиста. Поэтому все шейдеры, включая текущие, делаются в SG с поправкой на оптимизацию.

Реализация анимации светильника
Реализация анимации светильника

Начал я с шейдера качающейся лампы. В нём нет ничего хитрого: я просто замаскировал "край" лампы и вращал его вокруг пивота. Вращение происходит на основе шума для придания живости. Красота формируется через PBR и эффекты типа SSS (Subsurface Scattering), но это уже заслуга Unity — мне нужно было только всё настроить. А вот моделить пришлось вручную: просто сгенерированный материал мяса здесь не подошёл.

Скульптил в ZBrush, текстурил в Substance Painter
Скульптил в ZBrush, текстурил в Substance Painter

Многие наверняка видели в хоррорах глаза, следящие за игроком. Обычно их делают в виде картин. Я решил пойти дальше и сделать 3D-версию 🤣. Тут всё сложнее, чем с лампой, потому что нужно отслеживать позицию игрока (таргет), передавать её в шейдер и уже там двигать UV глазного яблока и сам меш для имитации слежения. По похожему принципу были анимированы щупальца.😁

На таргете работает простой скрипт, который передаёт позицию в шейдер (Shader.SetGlobalVector)

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

В самой игре они должны вылизать из "мяса"

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

На самом деле это плоскость 😁

Из хитростей у мяса: возможность "скульптить" форму с помощью Vertex Color и PolyBrush под окружающую геометрию. Сам материал полностью процедурно сгенерирован в Substance Designer. По сути, это просто плоскость с тесселяцией

Исходный меш абсолютно статичен. Вся магия в шейдерах🪄 

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

Заключение

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

Спасибо за внимание! ❤

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

14
1
5 комментариев

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

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

3

Спасибо, что подметил) Да, нужно было бы придумать какие-нибудь декали-подложки для перехода, или вертекс пеинт по стенам) Но до такой проработки не дошло)

2

Крутяк! Успехов вам!

1

Спасибо) Будем стараться)

1

Как любитель время от времени поиграть в хорроры, не зацепило, хотя интересно есть ли в игре еще что-то кроме стен и полов)