В этой статье Дзун Фун Дин в деталях разбирает свой проект «Экспария».

Оригинальный материал можно почитать тут.

Шейдеры для персонажей в UE4

Шейдеры для персонажей в UE4

Меня призывают Дзун Фун Дин. В 2010 году я занял первое место в конкурсе моделлинговых демо-рилов на премии CGSA (ее организует Autodesk, чтобы награждать студентов, занимающихся компьютерной графикой). Сейчас она называется The Rookies. Я занимаюсь 3D-графикой почти 10 лет. В самом начине я работал игровым художником в Rare UK, а также над серией рекламных материалов для игр к Xbox (Fable III и Halo Reach). Запоздалее я «переехал» в сферу видеоэффектов для кино и оказался в Double Negative London, где трудился художником-генералистом и художником по спецэффектам живых существ над фильмами вроде «Джон Картер», «Белоснежка и охотник» и «007: Координаты Скайфолл».

Но все это в прошедшем, и теперь я основатель и руководитель собственной студии – вьетнамской Thunder Cloud, основывающей высококачественные модели для студий-разработчиков, разбросанных по всему миру и бедствующих в аутсорсинге. Наша конечная цель – стать студией, мастерящей анимацию и синематики при помощи графических технологий, работающих в реальном поре. Именно поэтому сейчас я усердно работаю с UE4, попутно используя его для своих исследовательских проектов.

Вы, вероятно, ведаете, что в 2016 году сайт ArtStation запустил официальный конкурс «The Journey».

Меня эта тема весьма воодушевила. Я присоединился к конкурсу и планировал создать эпическую 3D-сцену. В цельном конкурс длился около 3 месяцев. Я думаю, этого поре достаточно, чтобы художник мог смастерить что-нибудь стоящее, трудясь над проектом в режиме «фул-тайм». Но, к несчастью, мне пришлось отвлечься на труд в Thunder Cloud, и к сроку я не успел. Либо 3 месяцев и вправду немного, либо мой проект был излишне амбициозным. Но недавно я все же решил его доделать, и поскольку сейчас это полностью мой проект, то я снова врубил амбиции на полную катушку.

Моя мишень – создать эпический CG-ролик на тему «путешествие». Главным персонажем будет девица по имени Экспария. Это производное от «explorer», что значит «исследователь» (имена всех моих дамских персонажей заканчиваются на «…ария»). Она пилот мехи, чья задача – исследовать для человечества новоиспеченные миры. Как можно видеть из концепт-артов, у всего этого есть небольшая предыстория: на орбите Земли показалась гигантская червоточина, окруженная странными инопланетными камнями, и это намекает, что это вряд ли природное явление. Червоточинка была создана кем-то и явно в дурных целях. Человечество решает послать флот, чтобы узнать, что находится по ту сторону этой «норы». Все мехи в этом флоте именуются «Камикадзе», и не просто так: это авангард, который вряд ли вернется. Пилотов обучили и военному, и научному делу. И нашему основному персонажу – улыбающейся Экспарии – не терпится поскорее отправиться исследовать новоиспеченные миры, но в то же время боязно из-за опасностей, с которыми она может столкнуться.

Финальным итогом этого проекта будет не просто статическая картинка, а махонькое видео с анимацией и эффектами – и все в UE4. Работая над этим проектом, я желаю прокачать себя и в знании технических деталей, и в создании прекрасной картинки. Там будут органические персонажи в одежде, роботы/мехи, внутренние помещения с твердым покрытием, фон в облике открытой локации и т.д. В общем, много такого, что поможет мне всерьез продвинуться в навыках, знании рабочего процесса и различных инструментов, используемых совместно с UE4. Кроме того, весь рабочий процесс строится кругом UE4.

И еще кое-что. Глядя на список челленжей выше, вы, вероятно, задаетесь проблемой: что есть главный элемент этого проекта? Это ее главный персонаж, а также потенциальная способность UE4 рендерить качественную картинку и анимации для последующего использования в производстве. Ранее я занимался преимущественно персонажами, поэтому одна из самых мощных сторон Thunder Cloud – как раз «персонажка». Так что «Экспария» служит для меня и студии оригинальным тренировочно-исследовательским проектом.

По-настоящему хороший 3D-художник должен и неплохо рисовать, и хорошо обращаться с 3D-инструментами. Я тренировался рисовать цифровое 2D и концепт-арты образцово в то же время, когда начал работать с 3D. Будучи 2D-художником, я могу быть независимее в плане идеи, замысла и цветов – меня не ограничивают технические возможности ПО для 3D. Что прикасается именно этого проекта, то здесь я хотел добиться весьма стилизованной «визуалки», где цифровая 2D-рисовка сочетается с небольшим «налетом» PBR-шейдеров.

Шейдеры для персонажей в UE4

Вот рисунок, какой я нарисовал одним из первых и использовал в качестве главного концепта при создании девицы. Кроме того, это главный референс для создания шейдеров и текстур. То есть мне пришлось хорошенько разобраться, на каких принципах строится 2D-рисование, чтобы итог выглядел как нарисованный и был привлекательным для зрителя, и в то же время использовать мои навыки в 3D, чтобы переместить это все на трехмерный «язык». Кроме того, я многому научился у иных 2D-художников – тому, как они интерпретируют/решают/«рендерят» определенные районы 2D-персонажа.

Шейдеры для персонажей в UE4

К примеру, на мой взгляд, глаз на 2D-рисунке выглядит гораздо природнее и интереснее, чем тот, что генерируется и рендерится на 3D-модели. Поэтому я, во-первых, научился писать в 2D и изучил фундаментальную структуру определенного 2D-стиля. Затем я начинов воспроизводить эту структуру и стилизованные элементы в 3D (в данном случае – в UE4).

Что прикасается всего проекта целиком, то возможность самому нарисовать 2D-концепт позволила мне предугадать, как будет глядеть финальная 3D-сцена. Он задает стандарт визуального качества, какой моя 3D-модель должна достичь. Это также помогло мне определить важность/приоритет различных элементов сцены, а также прикинуть, каким будет пролетарий процесс и сколько времени потребуется на создание проекта. К образцу, глядя на концепт-арт, понимаешь, что ключевые элементы – это девушка и ее робо-костюм, однако стенкам и полу ангара, какой ее окружает, тоже требуется определенный уровень детализации. Кроме того, в кадре есть гигантские космические корабли и отворённые пейзажи – это фон, который очень далеко и окутан туманом. Таким манером, это дает мне быстро оценить необходимый уровень детализации и то, как выстроить рабочий процесс, будь то создание хай-поли объекта и карты нормалей, обыкновенной модели с диффузной картой или даже использование мэт-пейнтинга (для дальнего горного ландшафта) и т.д.

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

У нас есть один главный «материнский» пайплайн для персонажей всех образов. Возможно, это прозвучит глупо, но сначала мы «примеряем» этот универсальный пайплайн к грядущему проекту, а затем потихоньку «раздеваем» его, убирая одни (ненужные) доли и добавляя другие (нужные). В итоге мы получаем наилучшим манером оптимизированный пайплайн, который подогнан под проект, но не нарушает всеобщую структуру. Благодаря этому команда делает работу весьма быстро, не путаясь в разных пайплайнах для разных проектов – ведь все они наследуют от одного «материнского» пайплайна.

Сам «материнский» пайплайн выглядит так:

А вот так выглядит его «разоблачённая» версия для вручную нарисованного персонажа с текстурами и маленьким числом полигонов:

А это версия для проекта  со стилизованными PBR-персонажами, где требуются лепка, большенное количество полигонов и запекание (как в Overwatch):

Что касается ПО, которое я и команда используем в Thunder Cloud, то на различных этапах пайплайна я использую разные инструменты, начиная от распространенных вроде Maya (мой основной инструмент для моделирования), Zbrush (главный для лепки), xNormal (для запекания) и Substance Painter (для PBR-масок) до не весьма популярных вроде BodyPaint 3D (для текстурирования), Crazybump (для создания текстурных карт) и нескольких инструментов Thunder Cloud, какие я написал сам, чтобы упростить создание персонажей. К примеру, инструмент для волос GMH2 – это как раз мое творение, и я использую его в «Экспарии», чтобы конвертировать 3D-сетки волос в текстуры волос. Немало подробно о GMH2 можно почитать тут.

Модель волос, над которой я тружусь в GMH2.6 (работа в процессе)

Для этого проекта использовались и иные инструменты, написанные мной:

Это менеджер запекания, который убыстряет процесс запекания из хай-поли в лоу-поли. Он может делать выборочное запекание, самодействующи отделять сетку для запекания ID-карты, автоматически генерировать «кейдж» (от англ. «cage»; и это сетка, используемая для запекания карты нормалей) и т.д. Кроме того, я ищу способ настроить коммуникацию между ним и xNormal –  для пакетного запекания.

Это экспорт-менеджер – махонький скрипт, помогающий экспортировать персонажа вместе с названием материала. Он позволяет мне скоро и просто переключаться между UE4 и Maya.

В этом проекте я усердствовал добиться очень «гладкого» PBR-стиля, который можно следить в Overwatch, Blade & Soul и т.д., а также в цифровых 2D-работах от художников вроде Mujiha, BdsPlace и т.п. Потому я не сильно углублялся в детальную лепку, а старался делать все как можно глаже и «незапятнаннее» – больше всего внимания я уделил большим и посредственным участкам вроде больших выпуклостей и краев, больших одежных складок и всеобщей форме частей тела вроде носа, глаз, губ и т.д.

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

Шейдеры для персонажей в UE4

Что прикасается лоу-поли модели, то я делаю также, как сейчас принято мастерить для топовых игр к некст-ген консолям. Я отвожу под самого персонажа где-то 50 тысяч треугольников, и еще 40-60 тысяч – под волосы. В всеобщем, для лоу-поли модели вполне достаточно. Я моделирую каждый объект как отдельную сетку – чтобы после было проще запекать. Кроме того, в конечном счете они будут использоваться для синематика, потому не должны быть слишком лоу-поли, но при этом – достаточно «легкими» для нормального рендера в UE4.

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

Таким образом, я постоянно видаю, во что превращается текстура, и могу быстро и просто контролировать последний результат. Я называю эту базовую текстуру «процедурной картой», потому что она целиком создается в Photoshop при помощи фильтров и простых масок, безо всякого рисования. Когда я доволен обликом, цветами и общей формой/объемом на процедурной карте, то обнаруживаю BodyPaint, при помощи которого начинаю доводить текстуру до финальной версии. Я тружусь в BodyPaint, потому что у нее лучше интерфейс и горячие клавиши, и она вяще похожа на Photoshop, чем любая другая программа для текстурирования. Кроме того, я могу легковесно переключаться между BodyPaint и Photoshop, работая над одним и тем же PSD-файлом.

Что прикасается стилизации, то мне кажется, что самой важной картой является диффузная – ее необходимо сделать хорошо в самую первую очередь. Сделав неплохие диффузные карты для всего, я экспортирую модель в UE4. Там я делаю сцене освещение и HDRI – для выявления дефектов и предпросмотра иных карт (неровностей, отражения, нормалей и т.д.).

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

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

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

Ниже – пошаговый разбор труды над этим материалом:

Базовый материал (шейдер SubSurface) с базовыми параметрами – как отправная точка.

Добавляем базовую текстуру.

Добавляем нод Fresnel и текстуру с затемненной кожей, чтобы с их поддержкой управлять градиентом, направленным от края силуэта к внутренней доли персонажа. Похожим образом делают затемнение 2D-иллюстраторы, а в 3D в качестве образца можно привести Street Fighter.

Кроме того, этот эффект можно регулировать при поддержки нодов «falloff» и «width».

Создаем нод с зеленым цветом, создаем нод Multiply, а затем подключаем его к диффузной текстуре и ноду с травяным цветом. Далее подключаем всю эту конструкцию к слоту Subsurface Color. В итоге у нас должен выйти эффект подповерхностного цвета.

Создаем нод Fresnel, чтобы смешать совместно два подповерхностных цвета и тем самым воссоздать едва заметный градиентный переход как на отправном концепт-арте.

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

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

Карта неровностей/отражений, а также несколько специально добавленных отражений.

На 2D-концепте в кой-каких местах много бликов и маленьких «искр» – почти как от материала для автомобильной краски – потому я беру текстуру с мелким шумом, а затем через ноды Blend_Overlay подключаю ее к картам неровностей/отражения и нормалей. В итоге, если более пристально всмотреться в эти блики, то на них будет веднеть небольшая детализация.

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

Этот граф похитрее прочих, и я создал его при поддержки нода Reflection Vector в UE4. Подключаем его к слоту UV на текстурном ноде и в итоге получаем что-то вроде сферической текстуры с отражениями.

Впрочем, после нескольких тестов открылось, что для правильной работы этого нода в качестве текстуры необходима кубическая карта. Процесс конвертации 2D-изображения в кубическую карту будет прост (это делается в Photoshop), но это нужно делать практически вручную. А если учесть, что вам придется немало раз сверяться с результатом, постоянно возвращаясь назад, то это занятие может потребовать груду времени. Поэтому я взял длинную плоскую 2D-текстуру с отражениями из Photoshop, применил ее на неосвещенную сферу, пристроил внутрь этой сферы куб, а затем получил на этом кубе рендер от сферы, какая его окружает. Таким образом, я просто чуть правил карту отражений в Photoshop, импортировал ее в UE4 и тут же превращал в кубическую карту. Затем подключил к этой карте отражений нод Blend_Screen, раскрашенную текстуру и нод Fresnel, тем самым получив отличную карту отражений, смешанную с раскрашенной текстурой.

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

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

Шейдеры для персонажей в UE4

Шейдеры для персонажей в UE4

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

Так, что касается подповерхностного градиента Fresnel Ramp (он описывается в разделе «Материалы» рослее) – было бы правильней, меняйся он в зависимости от направления света, как это выходит с настоящим подповерхностным рассеиванием. Но поскольку это очень «хрупкий» элемент, я стал на простом градиенте, основанном на нодах Fresnel. Вот только для персонажей, на каких падает много света, это может не сработать. Подповерхностный краска должен меняться в зависимости от направления света, а не ракурса. Но в моем случае этого довольно.

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

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

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

К примеру, если при труду над кожей переусердствовать с картой нормалей, модель начнет глядеть слишком 3D-шной.

В своих старых проектах я просто загружал в UE4 вручную нарисованные текстуры, добавлял немножко освещения и… все. Результат, разумеется, выглядел неважно. Вручную нарисованные текстуры выглядят неплохо и «излучают» свой неповторимый стиль лишь без освещения. Но стоит добавить света, и начинаются вящие проблемы, потому что на модель теперь влияет не только ее основная текстура. В моей сцене есть тени, яркие участки и отражения,  и если «врисовать» их в текстуру, они запросто потеряются, а сама базовая текстура будет выглядеть буквально нарисованной на персонаже.

Шейдеры для персонажей в UE4

Эта Чуда – один из моих старых проектов, когда я еще не сильно углублялся в то, как трудится UE4. Поэтому здесь все очень просто. Но работая над «Экспарией», я усердствовал, чтобы освещение/тени/отражения работали на модели как можно корректней. Особенно это прикасается элементов лица – глаз, носа и рта. Я могу потратить цельный день за правкой текстуры, редактированием модели, постоянными изменениями в шейдере, шаг за шагом – попросту чтобы все смотрелось как нужно.

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

Шейдеры для персонажей в UE4

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

Ниже – граф для шейдера глаз:

Вначале ресницы бывальщины нарисованы прямо на текстуре лица, но затем я поместил их в отдельную «листовую» сетку. Немало того, для финального результата я даже продублировал сетки для ресниц, чтобы придать этому элементу вяще объема. Я старался использовать для шейдера настройку Translucent (выставляется в Details > Material > Blend Mode), потому что ее скрадывающая (AA) альфа-маска гораздо лучше, чем у настройки Masked. Единственный недостача – приоритет сортировки, но поскольку глаз имеет аккуратную вогнутую конфигурацию, на сортировку в этом случае можно не обращать внимания. Еще одинешенек вариант – шейдер с прозрачностью, на который наложен эффект дизеринга. Он тоже дает неплохое сглаживание, но не подходит для тонких линий, а также полупрозрачных и подвигающихся поверхностей.

Во время лепки в Zbrush я оставил губы почти без детализации. Мне спокойнее добавлять детали позже, в Photoshop, т.к. благодаря этому я могу вольно пробовать разные типы деталей и тут же смотреть, что получилось. То же прикасается и деталей для кожи (к примеру, пор) – предпочитаю добавлять их на текстуру, а не во пора лепки.

В качестве оффтопа – иногда мне нужно анимировать одинешенек из элементов и отрендерить его анимацию, чтобы я мог в подробностях рассмотреть, уживаются ли внесенные изменения анимации/деформации с освещением/ракурсом. Это прикасается, к примеру, губ, открытия/закрытия глаза и т.д. Анимировать/деформировать эти предметы в UE4 довольно просто – я просто подготавливаю серию так называемых «блендшейпов» (от англ. «blend shape»; в Maya это различные варианты одной и той же сетки, обладающие одной топологией, но различными формами). Почему именно «блендшейпы»? Потому что они быстрее тестируются и их деформацией править гораздо проще, чем скелетной анимацией. Затем анимируем «блендшейпы» в Maya, экспортируем всю последовательность в UE4 и мастерим тестовый рендер.

[embedded content]

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

Шейдеры для персонажей в UE4

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

Поскольку сейчас я занимаюсь лишь «шлифовкой» и внешним обликом всего и вся, то стараюсь делать освещение как можно проще. В качестве базовой подмостки я использовал «блюпринт» (от англ. «blueprint»; это начинка сцены, т.е. список правил, по каким она работает) BP_lightStudio из стартового набора, поэтому вначале у меня бывальщины лишь один источник направленного света, солнечный свет и одинешенек купол в формате HRDI. То есть никаких лишних «прожекторов» (Spot Light), «лампочек» (Point Light) и т.д., чтобы в дальнейшем они не помешивали при решении проблем с тенями и отражениями.

Представительства сайта «80 level» в Twitter и VK.