Создание подводных каустик в реальном времени
Привет, меня зовут Тимоти Коул и я художник Unreal Engine. В колледже изучал создание 3D-графики для компьютерных игр, но моей настоящей страстью всегда был кинематограф, так что я постарался попробовать себя в обеих областях. Моя карьера началась в студии анимации в Сиднее, где я создавал ролики и трейлеры на базе Unreal. Там я увлекся захватом движений в реальном времени, что привело меня к сотрудничеству с Гаем Норрисом (постановщиком трюков "Безумный Макс: Дорога ярости"). Недавно я закончил работу над "Люди Икс: Темный Феникс". Я возглавляю разработку превизуализаций в реальном времени на базе Unreal, на основе которых располагается виртуальная камера, так что режиссер и оператор могут воссоздать сцену до того, как будут построены настоящие декорации. К тому же, я занимаю должность ведущего специалиста по Unreal Engine в ряде VR-проектов компании SpectreVR.
Вода
Думаю, для всего, что создается на базе игрового движка, полноценная симуляция жидкости и точность в воссоздании физики всегда будут слишком дорогим удовольствием. Так что главная сложность в том, чтобы расположить элементы таким образом, чтобы результат получился максимально близким к первоисточнику. Сначала изучите хорошенько различные варианты того, что вы хотите визуализировать, но и выберите что-то одно — то, что станет вашим "героем". Иногда, если стараться ориентироваться в цвете или текстуре на разные изображения, то в итоге легко запутаться, и результат не будет похож ни на что. Так что всегда выбирайте основное изображение, к которому вы будете стремиться.
Для этого проекта я создал доску на Pinterest, чтобы собирать там источники, а моим "героем" стало фото Шона Говарда (instagram: @sean.howard).
Что касается материалов в реальном времени, я стараюсь использовать непрозрачные материалы вместо того, чтобы полагаться на полупрозрачность. Полупрозрачность дорого обходится и не реагирует на освещение столь же хорошо, как это делают непрозрачные материалы. Но с водой раз на раз не приходится. Если игрок располагается по одну сторону от поверхности (неважно — над водой или под ней), можно использовать непрозрачные материалы. Если же есть возможность заходить в воду и выходить из нее, скорее всего, придется работать с полупрозрачностью.
В этой сцене единственный полупрозрачный материал используется для частиц у поверхности, но даже для них установлено аддиктивное смешение.
Наслоение
Весь секрет — в слоях. Я разделил сцену на отдельные элементы: поверхность воды, источник света и объемные частицы.
Для поверхности воды я использую отражающий материал воды с панорамированием на плоскости. Он и правда непрозрачный, поскольку меня волнует только то, что происходит под водой. Если посмотрите на образец, заметите, что поверхность на удивление непрозрачна, если смотреть из-под воды! Поверх я разместил пульсирующие частицы, которые искажают поверхность и придают ей более реалистичный вид. Они же используются и по краям, чтобы имитировать расходящиеся круги.
Перейдем к позиционированию света.
Освещение
Освещение в итоге превратилось в достаточно сложную систему, но для начала давайте посмотрим на образец и попробуем разобрать его на элементы.
В первую очередь, это градиент от поверхности к глубине — от прозрачного к темно-синему. Что касается каустик, они сфокусированы у поверхности и становятся более рассеянными по мере погружения.
Кстати, для некоторых источников света тени отключены полностью, а для некоторых параметр масштаба разрешения теней составляет 0,2. Это помогает создать мягкие подводные тени, а также решает проблемы с производительностью.
Я также использую новую функцию по работе с объемными объектами UE4 — экспоненциальную высоту тумана. В этом проекте я не стал сильно менять настройки тумана. Разве что установил плотность 0,5, поменял внутренний цвет на черный и включил объемность.
Я начал с применения к каустикам функции света. По сути это панорамированная текстура в двух масштабах, деформирующаяся в UV-пространстве под влиянием шума Перлина. Эти два слоя смешиваются друг с другом по синусу. А затем умножаются на свет с параметром непрозрачности 0,8.
И результат применяется к прожектору. Каустики должны быть более заметны у поверхности, так что я установил довольно короткий период затухания. Началось все с белого света, но поскольку мне хотелось имитировать спектр, я схитрил и разделил свет на три с легким смещением относительно друг друга. К каждому из них была применена та же функция, но использовался разный цвет: красный, зеленый и голубой.
У второго прожектора сверху затухание больше, поэтому его свет проникает глубже. Он также окрашен в синий, поскольку это основной свет, отвечающий за рассеивание в воде. Тени для этого слоя отключены. Этот свет использует экземпляр той же функции материала, хотя я изменил MipBias текстур, чтобы они стали размытыми. Если хотите, можете использовать другую текстуру или даже отдельно размыть ее в PhotoShop или Substance, но, на мой взгляд, такая небольшая хитрость эффективнее и дешевле. После запекания этот свет стал источником также и ненаправленного освещения.
Следующий слой — глубокое освещение с наибольшим разбросом и затуханием для всех источников. Я также поднял сумму вклада этого света до 10.
Наконец, я добавил верхний белый свет, чтобы немного нейтрализовать цвета и усилить источник света.
Вот так выглядят все слои вместе:
Движение
Я еще новичок в мире физики Unreal, к тому же физический движок был изрядно обновлен в последней версии, так что я фактически изучал его в рамках этого проекта. Текущая версия использует невидимые ускорители, приводящие объекты в движение. Я отключил гравитацию и ослабил отклик, чтобы усилить ощущение плавучести. Кроме того, я использовал данные захвата движений и смешал их с физикой. Думаю, именно этого способа я и буду придерживаться в итоге, потому что он обеспечивает более стабильную симуляцию. GPU-частицы в объеме имеют специальные поля скоростей, которые создают иллюзию водной массы.
Можно ли использовать такой метод при работе в реальном времени?
Определенно. Все создавалось с учетом масштабируемости, а использование подхода с расслоением облегчает последующую оптимизацию. Например, вы можете использовать лишь один или два уровня освещения и/или отключить тени, и вот уже у вас все хорошо и на слабых компьютерах. RGB-разделение основной каустики можно запросто заменить одним белым светом.