Вы находитесь на странице: 1из 19

XYZ Media Арт Гайд: создание мастер-материала в Unreal Engine

ГАЙД: СОЗДАНИЕ МАСТЕР-МАТЕРИАЛА В


Darya_Krasnitskaya
D
12 0

UNREAL ENGINE
1598 12 0 12 9 февраля в 22:03

От 3D-художника, работавшего над Metro: Exodus.

Привет, это Игорь Емельянов, преподаватель курса Environment Art от XYZ. Я принимал участие в работе над
такими AAA-проектами, как Metro: Exodus, Call of Duty: Infinite Warfare и Plague Tale: Innocence.

Сегодня мы научимся создавать базовый смарт-материал в Unreal Engine.

Что такое мастер-материал?


Мастер-материал — это материал, который может быть сложно устроен, содержать в себе много разного
функционала и который мы можем оптимизировать путём разных функций в разных условиях.

Он позволяет не создавать в UE4 каждый раз материал с нуля (что само по себе неудобно), а получать новый,
изменяя условную заготовку. Такой подход удобен, когда нам нужно в короткие сроки изменить параметры
множества однотипных материалов в соответствии с ТЗ.

Подготовка

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

текстура для базового цвета (BaseColor),

текстура для нормалей (Normal map),

упакованная карта - окклюзий, рафнесса, металлика и высоты,


карты эмиссива, поверхностного рассеивания и масок. Заранее задать в этих картах параметры
компрессий.

Например, для карты нормалей компрессия у нас должна быть NormalMap, а для упакованной карты ОРМ
компрессия обычно ставится на Masks.

Создаём материальную функцию


Начнём мы с того, что создадим функцию материала (пкм – Materials&Texture – Material Function).

Называем функцию MF_ Layer_0 (Material Function Layer 0) — это будет наш нулевой или базовый слой.

Material Function (материальная функция) — это небольшие фрагменты, которые можно записать в функцию и
использовать между несколькими материалами (как подсказывает официальный сайт UE).

Например, в MF можно «положить» логику того, какая информация будет использоваться в материале, или то, как
будут смешиваться материалы. В нашем случае, нужно будет задать логику того, как основные слои нашего
мастер-материала будут лежать друг на друге и как материалы будут смешиваться друг с другом.

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

Теперь импортируем текстуру базового цвета (Base Color) и создаём параметр (пкм – Convent to Parameter).
Назовём его L0 – Base Color.

Название параметрам подбирайте по своему усмотрению, но обязательно следите за префиксами, которые


указывают на уровень слоя. Они помогают анриалу не перепутать всё при обработке информации.

Далее назначаем группу, в которой будут находиться параметры этого слоя 0 – Base Layer.

И у нас остаётся Sort Priority — исключительно визуальная штука, в которой мы будем сортировать параметры во
время создания инстансов. Она позволяет последовательно сгруппировать их, чтобы не запутаться. Я начинаю,
как правило, с индекса 11, на случай, если потом понадобится создать что-то ниже, так как не хочу уходить в
индексы ниже нуля (хотя в этом отношении ограничений нет).

Для удобства дальше я буду обозначать индексы с пометкой «sp».

Создав Base Color, мы можем задать функционал для редактирования параметров этой текстуры: цвет,
интенсивность и прочее.

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

Итак, Base Color содержит в себе следующие параметры:

1. Saturation (сатурация) – насыщенность; отвечает за то, будет ли наша текстура чёрно-белой или цветной.

2. Contrast (контраст) – в объяснении особо не нуждается, кто имел дело с фото-редакторами, понял, о чём речь.

3. Tint (тон) – параметр, который идёт у нас через Multiply и позволяет изменить тон материала, сделав его нужного
нам оттенка.

Для контраста и сатурации мы создаём параметры следующим образом: добавляем скаляр (скалярное значение)
конвертируем в параметр, задаём имя и группу и, если хотим, чтобы, к примеру, ползунок сатурации был под
текстурой базового цвета, назначаем sp12 (у BC он был 11, соответственно).

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

Например, для ползунка сатурации мы можем поставить значение по дефолту 0, минимальное значение ползунка
0, а максимальное поставить на 1.

Иногда стоит ставить дефолтное значение на 1, когда мы знаем, что при умножении на него текстура никак не
изменится. Например, это работает для интенсивности нормала, о котором мы поговорим чуть позже.
То же самое проделываем для контраста.

Затем создаём Tint, который представляет собой уже не скалярное значение, а вектор (цвет) — его так же
конвертируем в параметр.

Теперь мы можем добавить Switch — «переключатель», который позволяет включить или выключить
определённую часть логики. Полезная штука для начальной оптимизации.

У свитча есть Value (значение) — True/False и 2 входа. Мы можем подключить уже имеющуюся информацию к True
и создать для False цвет, который будет отображаться, если вдруг нам не понадобится использовать текстуру (L0 -
BC_Simple, sp15).

Важно, чтобы имена у переменных не повторялись один в один.

Теперь создаём переменную, которая будет отвечать за переключение свитчем параметра — StaticBoolParameter.
Называем её UseBaseColorTexture, группа всё та же, 0 — Base Layer. Если этот параметр True, то будет
использована текстура, и мы сможем что-то в ней менять; если False — используется только цвет. Устанавливаем
дефолтное значение True.

После того как закончили с Base Color, нам нужны UV-координаты, чтобы можно было изменять тайлинг или как-
то сдвигать тайловую текстуру.

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

Здесь у нас есть 4 канала, которые мы можем переименовать. Назначаем их следующим образом:
R – TileX; G – TileY; B – OffsetX; A – OffsetY

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

Теперь к этим текстурным координатам создаём 2 ноды AppendVector (добавить вектор), которые позволяют
получить на выходе, грубо говоря, двумерный вектор (из значения с точкой создать два значения с точкой).
Добавляем красный канал к зелёному для регулировки размера тайла в дальнейшем, и синий — через аппенд к
альфа каналу нашего вектора.

И соединяем офсет с текстурными координатами в такой последовательности: сначала добавляем оффсет, потом
умножаем на тайл.

Это очень удобно визуально: если офсет, например, 0,5, то мы точно знаем, что текстура сдвинута на половину
тайлинга. Если всё это будет в обратном порядке, то при работе с этими значениями будет легко запутаться.
Наконец подключаем результат группы Tile к юви-координатам текстуры Base Color – получившейся настройкой
можем теперь изменять тайл и офсет нашего BC.

Следующий шаг – Normal Map.

Мы можем редактировать интенсивность нормалки в движке, не выгружая её. Для этого добавляем текстуру
нормала, конвертим в параметр, задаём имя L0 — N, группу, и sp100 — нормалкам, чтобы настройки связанные с
нормалями были после настроек для базового цвета (если потребуется вставить ещё какие-то параметры до
настроек нормала, но после настроек базового цвета будет место для дополнительных настроек).

Точно так же подключаем UV-координаты к L0 — N, и теперь можем регулировать интенсивность нормала,


изменяя интенсивность каналов R и G. Собираем их в двумерный вектор (Append либо ComponentMask из R G) и
мультиплаим (умножаем) на скалярное значение, которое также конвертим в параметр и называем L0 –
NormalIntensity. Возвращаем синий канал и создаём ноду Normalize.

Так же как и с картой базового цвета — мы можем добавить свитч и простой вектор со значениями 0, 0, 1 для
нормала в случае, если нам не нужна карта нормалей.

И если нам нужно, чтобы переключатель был выше, чем текстурный семплер в sort priority, ему можно задать
значение ниже 100.

Переходим к запакованной карте ORMH.

В данном случае я использую дефолтный экспорт из пейнтера ORM (occlusion, roughness, metallic) с добавлением
H (height) — дополнительной карты высот в альфа канале.
Occlusion, roughness, metallic и height находятся вместе в 1 текстуре и могут быть упакованы как угодно, на каких угодно каналах.

По желанию мы можем менять интенсивность оклюжна и настроить контраст. Для этого добавляем ноду Linear
Interpolate, в её альфа-канал добавляем оклюжн (красный канал, в нашем случае) и создаём два параметра —
OcclusionMin и OcclusionMax, которые подключаем в A и B пины лерпа.

По своей сути эти две ноды работают, как уровни в PhotoShop:

если Max>1, то текстура светлеет

если Min<0, то текстура темнеет


Настраивая эти два параметра, мы можем менять, в том числе, контрастность текстуры (для этого также
существует своя нода контраста, но я лично предпочитаю этот сеттап).

Аналогичные настройки можем применить к roughness, metallic и height.

Если хотим, чтобы настройки карт ORM шли после всех предыдущих, назначаем sp200+ (так как 11 у нас был у
Base Color, а 100 у Normal Map).

Последняя — карта высот — отвечает за Displacement (рельеф). В случае с ним мы можем ввести настройку
интенсивности. Для этого создаём скаляр, умножаем результат предыдущего на него. (В целом мы можем
регулировать интенсивность дисплейсмента и ползунками мин\макс, но мне кажется такой вариант удобнее в
работе).

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

По тому же принципу можем использовать текстуру Emissive (свечение): мультиплаем её для тинта, можем
добавить сатурацию и контраст, но, как правило, это редко требуется. Чаще эмиссиву нужен тинт, чтобы
подкрутить оттенок. Если нам вообще не нужна эта текстура, чтобы не нагружать систему, создаём векторный
параметр Emissive цвета свечения.
Создаём статик свитч, подключаем имиссив с тинтом к True либо подключаем вместо тинта отдельный параметр
с другим названием (Например L0 - E_Simple, по принципу того, что мы делали с base color) и создаём

StaticBoolParametr (я назвал его UseImissiveTexture). Ставим ему дефолтное значение False.

В материалах может отдельно использоваться и Subsurface scattering (поверхностное рассеивание), который


тоже может быть как цветом, так и отдельной текстурой. По сути, информацию для него копируем от Base Color,
только переименовываем и задаем новые значения в sort priority.

Для прозрачных материалов можем добавить Opacity и OpacityMask, отвечающие за непроницаемость


материала. Opacity обычно хранится в альфа-канале, так что мы можем подключить его напрямую либо создать
так же группу параметров и подключить через неё.
После того, как мы добавили всё, что нам нужно, вызываем ноду MakeMaterialAttributes, подключаем к
OutputResult и всему, что сделали.

Создаём материал
Когда мы сделали наши функции, создаём обычный материал (назовём его M Master), в который перетаскиваем
нашу функцию MF_Layer_0. Выделяем финальную ноду материала M_Master, и здесь у нас есть галочка

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

Работа с MaterialInstanсe
Подытожим небольшой иллюстрацией удобства мастер-материала в работе.

Берём наш M_Master, создаём из него MaterialInstanсe. Если всё правильно, открывшиеся настройки на панели
справа будут сгруппированны и расположатся последовательно.

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

Пример: в созданном материале снимаем галочку UseBaseColorTexture, задаём «красный». Теперь мы хотим
задать Roughness: так же снимаем галочку с UseORM, и меняем одноимённый параметр. Получаем красный
глянцевый материал.
После этого мы можем создать из этого материала инстанс, в котором при тех же настройках все параметры
будут серые, так как мы ничего не меняли. И, допустим, мы можем задать другой цвет, оставив параметр
глянцевости получаем голубой глянцевый материал.

Самое интересное: теперь, если мы будем менять Roughness в красном материале, после применения этот же
параметр изменится в дочернем инстансе.
Как уже говорилось в начале статьи, это очень удобно в том случае, когда нам внезапно нужно изменить 1
параметр в нескольких материалах или в случае, когда настройки материалов зависят друг от друга.

Подробнее о курсе Игоря Environment Art, — для тех, кто хочет стать художниками по окружению, — здесь.

Нравится (12) В избранное (12)

Поделиться:

Нет комментариев

Войти Войди, чтобы оставить комментарий

Еще статьи Подписка


Твой E-mail
Aphego Арт

Как рисовать здания — советы для новичков Подписаться

Опытный CG-художник рассказывает, как упростить себе жизнь и не свихнуться,


пытаясь нарисовать дом, замок или целый город. Отборный контент без спама и воды
Эксклюзивные скидки на курсы

31 1 4 февраля в 19:18

Новое
Валентин Шакун Арт

PBR для новичков — материалы, пайплайны и текстурные карты Артемий Леонов

Всё о работе с физически корректной визуализацией от преподавателя курса Галерея. Фантастические миры J.C. Пака
«Процедурный трип» Антона Агеева.
5 0 27 февраля в 22:52

Никита Казимиров
17 0 17 февраля в 19:11
Галерея. Загадочные миры снов из LSD:
Dream Emulator
7 2 25 февраля в 18:41
Владимир Шумилов Арт

Интервью: Андрей Рябовичев, концепт-художник фильмов Юрий Кулагин

«Гарри Поттер», «Аладдин» и «Прометей» Полезное. Как анимировать пиксель-арт


с помощью 3D-моделей
«Если вы хороший специалист — вас легко возьмут в любую студию, включая
5 0 23 февраля в 13:07
Disney».

12 1 15 февраля в 22:36 Юрий Кулагин

Галерея. Как менялись самые


брутальные персонажи от первых артов
Никита Казимиров Арт до финальных моделей

Галерея. Загадочные миры снов из LSD: Dream Emulator 6 0 23 февраля в 11:48

LSD: Dream Emulator — одна из главных в истории игр-загадок. Она вышла ещё в 1998
году на PlayStation, но только в Японии, и сначала о ней быстро забыли. Однако в Юрий Кулагин
итоге игра стала культовой среди покл…
Галерея. Как The Elder Scrolls Online
старается не разочаровать фанатов
7 2 25 февраля в 18:41 8 0 22 февраля в 08:09

Artyom Kaleev
Валентин Шакун Арт
Галерея: концепт-арт отменённой Half-
Как работают над костюмами для CGI — дизайн одежды, Life 2: Episode Three
влияние анатомии и особенности студийной работы
4 0 20 февраля в 19:22

Вместе с Артёмом Гансиором разобрались в особенностях создания одежды для


персонажей CGI-трейлеров.
Валентин Шакун

Как работают над костюмами для CGI —


8 1 20 февраля в 18:25 дизайн одежды, влияние анатомии и
особенности студийной работы
8 1 20 февраля в 18:25
Nikita Korsun Арт

Спидпейнт, как упражнение для концепт-художника. Выжимка


Дарья Кулагина-Кравчук
стрима с Егором Гришиным
Видео: как делают чёрно-белые игры —
После прохождения курса Intro Скетчинг мне стала интересна тема спидпейнта, эстетика нуара и мрака
ведь это возможность сразу делать интересные работы за короткий срок, попутно
5 0 18 февраля в 23:11
набивая руку. И кстати пришёлся стрим по этой …

19 4 23 января в 02:26
SmackyPlay

Запекаем нормали на гриле


Артемий Леонов Арт 4 0 18 февраля в 19:43

Галерея. Фантастические миры J.C. Пака


Валентин Шакун
J.C. Чон-вон Пак — иллюстратор и концепт-художник, работавший над Gears 5,
Chorus, Everspace, Aion, Legend of the Cryptids и другими играми. В своё время его PBR для новичков — материалы,
технику назвал «безупречной» сам Сид Мид —… пайплайны и текстурные карты
17 0 17 февраля в 19:11

5 0 27 февраля в 22:52

Владимир Шумилов

Интервью: Андрей Рябовичев, концепт-


Юрий Кулагин Арт художник фильмов «Гарри Поттер»,
«Аладдин» и «Прометей»
Полезное. Как анимировать пиксель-арт с помощью 3D-
моделей 12 1 15 февраля в 22:36

Если вам очень нужно нарисовать анимацию для пиксель-арта, но не хватает


терпения всерьёз заняться стилизацией, запомните хитрость от пользоватя Reddit Artyom Kaleev
под ником Soyafire. Он сам признаёт, что далеко …
Галерея: концепт-арт The Elder Scrolls V:
5 0 23 февраля в 13:07 Skyrim
15 0 14 февраля в 20:33

Никита Казимиров Больше нового


Арт

Полезный сайт для 3D-художников с топологией разных


объектов

Начинающим 3D-художникам сперва предстоит освоиться с огромным


количеством тонкостей и потратить несколько месяцев хотя бы на приблизительное
понимание, как переносить объекты из реальности в редактор…

67 2 11 ноября 2020

Валентин Шакун Арт

Как рисовать органику — композиция, «кривые» и особенности


строения растений

Приёмы и хитрости рисования растительности.

23 0 14 февраля в 19:26

Показать еще

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

Геймдизайн hello@media-xyz.com
Кино

Арт

Игры

Разработка

Дизайн уровней

Обо всём

Вам также может понравиться