Академический Документы
Профессиональный Документы
Культура Документы
Гайд - создание мастер-материала в Unreal Engine · XYZ Media
Гайд - создание мастер-материала в Unreal Engine · XYZ Media
UNREAL ENGINE
1598 12 0 12 9 февраля в 22:03
Привет, это Игорь Емельянов, преподаватель курса Environment Art от XYZ. Я принимал участие в работе над
такими AAA-проектами, как Metro: Exodus, Call of Duty: Infinite Warfare и Plague Tale: Innocence.
Он позволяет не создавать в UE4 каждый раз материал с нуля (что само по себе неудобно), а получать новый,
изменяя условную заготовку. Такой подход удобен, когда нам нужно в короткие сроки изменить параметры
множества однотипных материалов в соответствии с ТЗ.
Подготовка
Для подготовки базового материала я бы рекомендовал сделать набор простых текстур с базовыми настройками:
Например, для карты нормалей компрессия у нас должна быть NormalMap, а для упакованной карты ОРМ
компрессия обычно ставится на Masks.
Называем функцию 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, на случай, если потом понадобится создать что-то ниже, так как не хочу уходить в
индексы ниже нуля (хотя в этом отношении ограничений нет).
Создав 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.
Мы можем редактировать интенсивность нормалки в движке, не выгружая её. Для этого добавляем текстуру
нормала, конвертим в параметр, задаём имя L0 — N, группу, и sp100 — нормалкам, чтобы настройки связанные с
нормалями были после настроек для базового цвета (если потребуется вставить ещё какие-то параметры до
настроек нормала, но после настроек базового цвета будет место для дополнительных настроек).
Так же как и с картой базового цвета — мы можем добавить свитч и простой вектор со значениями 0, 0, 1 для
нормала в случае, если нам не нужна карта нормалей.
И если нам нужно, чтобы переключатель был выше, чем текстурный семплер в sort priority, ему можно задать
значение ниже 100.
В данном случае я использую дефолтный экспорт из пейнтера ORM (occlusion, roughness, metallic) с добавлением
H (height) — дополнительной карты высот в альфа канале.
Occlusion, roughness, metallic и height находятся вместе в 1 текстуре и могут быть упакованы как угодно, на каких угодно каналах.
По желанию мы можем менять интенсивность оклюжна и настроить контраст. Для этого добавляем ноду Linear
Interpolate, в её альфа-канал добавляем оклюжн (красный канал, в нашем случае) и создаём два параметра —
OcclusionMin и OcclusionMax, которые подключаем в A и B пины лерпа.
Если хотим, чтобы настройки карт ORM шли после всех предыдущих, назначаем sp200+ (так как 11 у нас был у
Base Color, а 100 у Normal Map).
Последняя — карта высот — отвечает за Displacement (рельеф). В случае с ним мы можем ввести настройку
интенсивности. Для этого создаём скаляр, умножаем результат предыдущего на него. (В целом мы можем
регулировать интенсивность дисплейсмента и ползунками мин\макс, но мне кажется такой вариант удобнее в
работе).
Если же нам не понадобится карта ORM, мы можем использовать обычные значения из вектора, точно так же, как
мы делали с картой бейс колора и нормала. И добавить переключатели и вектор.
После этого для правильной работы дисплейсмента добавляем ноду VertexNormal и умножаем её на результат
свитча для дисплейсмента.
По тому же принципу можем использовать текстуру Emissive (свечение): мультиплаем её для тинта, можем
добавить сатурацию и контраст, но, как правило, это редко требуется. Чаще эмиссиву нужен тинт, чтобы
подкрутить оттенок. Если нам вообще не нужна эта текстура, чтобы не нагружать систему, создаём векторный
параметр Emissive цвета свечения.
Создаём статик свитч, подключаем имиссив с тинтом к True либо подключаем вместо тинта отдельный параметр
с другим названием (Например L0 - E_Simple, по принципу того, что мы делали с base color) и создаём
Создаём материал
Когда мы сделали наши функции, создаём обычный материал (назовём его M Master), в который перетаскиваем
нашу функцию MF_Layer_0. Выделяем финальную ноду материала M_Master, и здесь у нас есть галочка
UseMaterialAttributes. Подключаем её, сохраняем материал и теперь, если предыдущие шаги мы сделали
правильно, всё должно заработать.
Работа с MaterialInstanсe
Подытожим небольшой иллюстрацией удобства мастер-материала в работе.
Берём наш M_Master, создаём из него MaterialInstanсe. Если всё правильно, открывшиеся настройки на панели
справа будут сгруппированны и расположатся последовательно.
Далее мы можем создать несколько инстансов из базового материала/других инстансов материала и таким
образом менять несколько базовых параметров.
Пример: в созданном материале снимаем галочку UseBaseColorTexture, задаём «красный». Теперь мы хотим
задать Roughness: так же снимаем галочку с UseORM, и меняем одноимённый параметр. Получаем красный
глянцевый материал.
После этого мы можем создать из этого материала инстанс, в котором при тех же настройках все параметры
будут серые, так как мы ничего не меняли. И, допустим, мы можем задать другой цвет, оставив параметр
глянцевости получаем голубой глянцевый материал.
Самое интересное: теперь, если мы будем менять Roughness в красном материале, после применения этот же
параметр изменится в дочернем инстансе.
Как уже говорилось в начале статьи, это очень удобно в том случае, когда нам внезапно нужно изменить 1
параметр в нескольких материалах или в случае, когда настройки материалов зависят друг от друга.
Подробнее о курсе Игоря Environment Art, — для тех, кто хочет стать художниками по окружению, — здесь.
Поделиться:
Нет комментариев
31 1 4 февраля в 19:18
Новое
Валентин Шакун Арт
Всё о работе с физически корректной визуализацией от преподавателя курса Галерея. Фантастические миры J.C. Пака
«Процедурный трип» Антона Агеева.
5 0 27 февраля в 22:52
Никита Казимиров
17 0 17 февраля в 19:11
Галерея. Загадочные миры снов из LSD:
Dream Emulator
7 2 25 февраля в 18:41
Владимир Шумилов Арт
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
19 4 23 января в 02:26
SmackyPlay
5 0 27 февраля в 22:52
Владимир Шумилов
67 2 11 ноября 2020
23 0 14 февраля в 19:26
Показать еще
Мы в бета-версии
Нам очень важен любой фидбэк. Всплыли баги? Непонятно, куда нажимать? Есть идея, как улучшить сайт?
Пишите в форму обратной связи.
Написать
Геймдизайн hello@media-xyz.com
Кино
Арт
Игры
Разработка
Дизайн уровней
Обо всём