19/04/2019

Разбор процесса создания синематика в UE4

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

Идея состояла в том, чтобы минимизировать работу при создании высококачественных кастомных мешей для синематиков, используя модовский round edge shader. В конце концов я понял, что из этого выйдет неплохой воркфлоу, так что пришлось копнуть глубже. Финальный результат, который вы видите на видео, —это придуманный мною меш, который создавался без разбивки на low poly и high poly, с использованием автоматической развертки, которую я немного доработал (потому что у меня есть совесть, и мне пришлось выставить некоторые ограничения своему раздолбайству, хоть тут и не пахнет оптимизацией или texel density).


Большая часть из того, что вы видите, кроме проводов и некоторых вещей, сделано с помощью boolean lowpoly geo в Modo и без каких-то дополнительных инструментов. Поскольку модовский булиан работает чисто, мне не приходилось чистить сетку после него, разве что — помогать триангулировать там, где Н-угольники были слишком сложны для автоматической триангуляции. Также я не оптимизировал вещи типа цилиндров, нарезки геометрии и тд. Я спокойно мог уменьшить полигонаж в половину — и визуально ничего бы не изменилось, но речь тут идет про скорость, а не про оптимизацию (до того момента, пока это не начинало влиять на скорость работы инструментов). Финальный полигонаж этого корабля составил что-то около 750к треугольников. Я мог бы добавить больше деталей с помощью карты нормалей, но решил этого не делать, хотя это могло бы быть довольно важным моментом, если бы вы использовали этот воркфлоу для других задач. Моделить ВСЁ геометрией, наверное, уже чересчур, это отнимает время и ресурсы, которые лучше потратить на что-то другое.

Пример сетки

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

Пример UV развертки. Не повторяйте этого дома, дети!

Так как идея состояла в том, чтобы отказаться от разбивки на highpoly и lowpoly, я решил запечь фаски, используя modo round edge shader. Оказалось, что, по какой-то причине, нельзя запечь round edge shader с меша на самого себя, так что я скопировал его, назначил новый материал со сглаживанием и перепек object space normal с оригинального меша на копию, после чего конвертировал его в tangetspace в Xnormal. Я сделал это, чтобы потом иметь возможность контролировать триангуляцию, иначе я мог бы запечь tangent space прямо в Modo. Ну и, конечно, я запек всё остальное, типа curvature, AO и тд. Всё очень просто и быстро. 

Слева направо: меш с материалами для создания масок (ID map) и для контроля round edge shader, меш со сглаживанием, меш с object space normal map

Для текстурирования этой сцены я использовал Quixels dDo. Поскольку мне нужно было затекстурить несколько объектов, я настроил базовый материал в dDo, который использовал для всей кабины. Я начал с окрашенного толстым слоем краски металла (вы же знаете меня, я должен покрасить всё жииирным слоем) с разными настройками по цвету для разных частей и базового голого металла. Добавил немного совсем слабеньких царапин на металл, но не хотелось увлекаться этим, потому что мне не нравилось то, как всё начинало выглядеть и в этом не было никакого смысла. Вместо этого я решил добавить слой грязи. Я применил эти материалы ко всему ассету с некоторыми маленькими настройками на разных частях, беря в учет их размер и расположение.

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

  
Автоматериалы и некоторые базовые декали

В общем и целом, сцена вышла довольно легкая, когда дело дошло до работы с шейдерами в Unreal Engine 4. Также я сделал всякие базовые вещи вроде разнотипных тайловых текстур для большей детальности (отдельный рафнес для голого металла, карта нормалей с детализацией для краски) и ползунки для настройки разных значений. Ничего особенного не происходило, кроме того, что я поднял texel density до безумных значений. Размер текстур вышел очень большой — 4к и 2к, в основном — просто потому, что я могу себе это позволить. Это не очень круто в плане оптимального использования памяти, но всё могло быть хуже и, в любом случае, я не сильно задумывался над этим на фоне тестирования воркфлоу. В теории, я мог бы сделать больше уникальных вещей и более уникальные типы поверхностей и тд, так как у меня были текстуры для этого, но всегда нужно понимать, когда хватит — и я хотел всё же закончить эту сцену. 

С экранами было много веселья. UI анимация для главного экрана была сделана исключительно талантливым UI дизайнером и моим другом Stellan Johansson (https://madebyritual.com/). Я импортировал эту анимацию в качестве видео, после чего добавил разных линий, шума, визуальных артефактов и применил offset чтобы дать глубины. Потом скопировал всё это и панель с кнопками на монитор поменьше. Пока делал синематик, понял, что чего-то не хватает, так что с помощью градиента и математики я настроил шейдер под стиль лучевых мониторов для момента, когда они стартуют.

Разный шум и линии на мониторе

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

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

Базовый свет на кабине от 4 главных источников

Я начал с довольно темной базы, потом добавил несколько статичных источников для потолка ангара и skylight для того, чтобы дать чуть-чуть синеватого свечения. Для первого кадра поменял экспозицию и задействовал углы с экстремально темными тенями. Основной свет в кабине исходит от мониторов; также я добавил вторичное освещение и подчеркнул всё контрастным светом от двух лампочек, которые находятся сверху. Большая часть света в кабине исходит именно от этих трех источников + драматический красный свет от панели в момент, когда она запускается.

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

Кадр с кастомным светом и без него

Раз уж я начал сходить с ума с освещением и эффектами (которые просто убивали фремрейт при использовании низкого FOV и высокого DOF), я прикинул, что могу сделать видео через сиквенсер (ага, 4к и 60 fps). Проблема состояла в том, что пока экран используется для записи видео, движок не просчитывает сиквенции в правильной скорости (известный баг), так что большая часть вещей смотрелась абсолютно неправильно. Я попробовал потанцевать с бубном, но, в итоге, ничего не помогло решить это, так что мне не оставалось ничего кроме как рендерить в риалтайме. Это, в свою очередь, потянуло за собой то, что мне пришлось заниматься оптимизацией, переключать некоторые источники света за кадром и менять некоторые настройки, чтобы привести в порядок самые тяжелые места. Мне удалось настроить всё так, чтобы иметь хороший фреймрейт в 1440р. Можно было пойти дальше, но мне в любом случае не удалось бы добиться 60 кадров в секунду, потому что только пост процессы съедали хорошую часть ресурсов. Также, во время финальной записи я немного дернул компьютер, но не перезаписывал этот момент еще раз. В любом случае, всё выглядело хорошо, свет в итоге вышел не очень тяжелым, а меш повлиял на общий просчет сцены не так уж и сильно, самое сильное влияние оказали кинематографичные настройки кадра (конкретно DOF).

Все звуки в видео были запущены через Unreal, так как я не хотел накладывать их отдельно и подумал, что это неплохой момент, чтобы научится немного работать с аудио. Так что я потратил немного времени на то, чтобы настроить их запуск в разных кадрах используя reverb volumes и тд.. Все звуки бесплатные, я взял их с одного сайта, после чего подрезал и подогнал под свои нужды. Вышел микс из всего, от звуков работы гидравлических механизмов до звука старого жесткого диска. Мне кажется, даже есть пара звуков от кофемашины и Wii.

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

Оригинальный материал
Перевод подготовлен в рамках проекта CgTranslate

Recent Posts

10 инсайдерских советов для художников, которые хотят попасть в игровую индустрию

13/05/2019
Суть этой статьи — дать знания, которые будут актуальны независимо от того, прошли ли вы курсы, выучились сами, либо уже работаете в индустрии.

3D рендеринг: отрисовка сцены

08/05/2019
Рассмотрим на практике, как отрисовывается сцена на GPU, используя знания, полученные в первой части статьи. Внутри — интерактивное демо, в котором можно “пощупать” кадр прямо в браузере.

Этапы создания окружения во время разработки игры

06/05/2019
Рассказываем о ключевых этапах создания окружения для игры ААА-класса и о том, какие ассеты обычно для этого используются.