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

Демонстрация работы собранного шейдера.
Оба варианта имеют как свои плюсы, так и минусы, а именно, в первом случае удобно подключить генерируемый шум к Absolute World Position и избавиться от необходимости подгонять текстуру под UV модели так, чтобы она хорошо проигрывалась на швах объекта [поскольку создается волюметрический 3d нойз].
Однако нода Noise практически не имеет внешних параметров для контроля, что несколько ограничивает возможность создания разнообразных паттернов без внутренней настройки материала.
При использовании текстуры шума исчезает вопрос о многообразии форм создаваемых эффектов, поскольку Texture Sample можно преобразовать в параметр и менять карты нойза в реальном времени. Однако в данном случае нужно будет задуматься о том, как именно проецировать текстуру на 3д объект так, чтобы не получать никаких артефактов.
Демонстрация работы собранного шейдера.
Нодовая система шейдера — детали.
Нодовая система шейдера — детали.

Главные ноды, вокруг которой строится работа данного эффекта, — Noise, к которому подключен Panner.
В данном случае ко внутренним настройкам шума можно подойти с художественной точки зрения и выставить их в соответствии с личными эстетическими предпочтениями.
Для того, чтобы Noise распространялся по объектам вне зависимости от их UV развертки, но был привязан к модели, в инпут World Position приходит результат вычитания Object Position из Absolute World Position
Нодовая система шейдера — детали.
В первой половине кода создается маска, по которой впоследствии будет двигаться текстура блесток.
ScreenPosition — это нода, которая выводит UV-координаты для каждого пикселя в пространстве экрана в текущем кадре. Если применить ее к текстуре и накинуть получившийся материал на объект, то он будет проецироваться на экран, оставаясь таким же с любой точки обзора.
ScreenResolution задает разрешение видимой области окна просмотра. Если окно имеет размер 1920×1080 пикселей, нода вернет вектор (1920, 1080).
В связке с математическим выражением Divide и перемножением на Screen Position это позволяет контролировать и масштабировать размер «экранных координат» текстуры-маски, которая добавляется позже.
Во второй половине кода задается текстура блесток, к которой подключены контролирующие тайлинг параметры.
При перемножении результатов на выходе получается анимированный узор, который с помощью параметризации можно кастомизировать под собственные нужды.
Нодовая система шейдера — детали.
Данная часть нодовой системы позволяет добавить градиент относительно объекта вдоль оси Z, что осуществляется благодаря вычитанию Object Position из Absolute World Position.
Multiply устанавливает плавность перехода цвета, в то время как add задает смещение по оси Z [точка старта градиента].
Нодовая система шейдера — детали.
Далее все части шейдера собираются вместе. Выход Noise-a становится маской, по которой с помощью ноды Lerp смешивается базовый цвет / текстура модели и цвет анимированных узоров.
Результат работы по созданию блесток подключается к Emissive Color. Также по необходимости добавляются дополнительные модификаторы цвета, яркости, контрастности.
Демонстрация работы собранного шейдера.
Демонстрация работы собранного шейдера.
Для первого эксперимента в программе Substance Painter была заранее отрисована маска Opacity, которая хранилась в Alpha канале текстуры Base Color.
Также стоит отметить, что в данном эксперименте разберется работа с Overlay Material как одним из вариантов добавления различных эффектов объекту.


Созданный в Substance Painter-е паттерн для последующей анимации.
Нодовая система шейдера — детали.

В первой части нодовой системы генерируется анимированный шум, который используется для добавления небольших искажений, создания эффекта «дрожания» текстуры.
Motion_4WayChaos — это функция, которая создает сложный анимированный шум путем многоканального смешивания и движения текстуры в нескольких направлениях.
В отличие от остальных нод, чтобы ее вызвать, необходимо сначала добавить MaterialFunctionCall, а уже затем добавить 4WayChaos.
Нодовая система шейдера — детали.

Данный шум будет задавать деформацию текстуры. После этого можно добавить параметр для регулирования цвета и яркости.
В настройках материала стоит поменять Blend Mode на Translucent [это настройка материала, которая позволяет создавать полупрозрачные объекты с помощью Opacity маски], а Shading Mode на Unlit [так, материал будет светится самостоятельно, не реагируя на свет, тени или окружение].
Процесс добавления Overlay материала.
Важной особенностью данного материала является то, что он будет лежать поверх основных материалов модели, накладываясь на них и перекрывая.
Для этого в сцене нужно выбрать объект, к которому будет применена анимированная текстура, найти в поиске Details — Overlay — нажать «+» в Material Slots Overlay Material и в появившемся окне выбрать ранее созданный материал.
Демонстрация работы параметров шейдера.
В качестве второго примера будет разобран процесс создания покадровой анимации в пространстве UV 3d модели.
Для этого необходимо заранее подготовить анимацию: определиться с фреймрейтом и нарисовать нужные узоры.
Это можно сделать как в программах для создания текстур поверх модели [например, Substance Painter], так и нарисовать в графических редакторах по типу Photoshop, Krita и других [в данном случае будет чуть больше трудностей с тем, чтобы аккуратно расположить анимацию поверх швов модели, так как не будет наглядной визуализации в отличие от специализированных 3d программ].
Процесс создания Texture 2D Array.

Все кадры в Texture 2D Array хранятся в форме подобного списка, где в случае каких-либо несостыковок можно подгрузить необходимые фреймы в нужное место.
Нодовая система шейдера — детали.
Нода Time, помноженная на параметр «Frame Rate» будет задавать количество кадров в секунду — fps анимации [или же скорость (единица в секунду времени) помноженная на задаваемый коэффициент]. Результат пойдет в A-инпут ноды Fmod.
Fmod [Floating Point Modulo] — это математическая нода, которая возвращает остаток от деления первого числа [A] на второе число [B].
Данная нода полезна для «заворачивания» значений в определенный промежуток, так как они преобразуются в диапазон [0, B), что также подходит для создания циклично прокручивающихся анимаций.
Демонстрация работы кастомного frame rate-a.
Если визуализировать работу данной части кода с помощью DebugScalarValues, можно увидеть, как Fmod действительно ограничивает выходное значение в пределах от 0 до 23, что и является количеством имеющихся кадров анимации.
Таким образом, при значении fps — 12 вся анимация займет 2 секунды, а 24 — 1 секунду.
Нодовая система шейдера — детали.
Все, что осталось сделать, — подключить результат к UV необходимой текстуры.
Поскольку в примере анимированный паттерн подключается в Emissive Color, можно реализовать маску с помощью ноды Lerp, подключив ко второму инпуту черный цвет. Так, в местах, где маски нет, никакой текстуры не будет.
Осталось добавить некоторые параметры для внешнего контроля [например, регулирование яркости, цвета, семпла покадровой анимации и других] и эффект готов.
Демонстрация работы собранного шейдера.
В отличие от UV-анимации, которая манипулирует координатами текстуры, вертексная анимация фактически изменяет положение вершин меша в пространстве.
Это достигается через входное значение материала World Position Offset [WPO], которое применяется на уровне вертексов и позволяет смещать каждую вершину на основе математических функций.
Например, если мы выводим константу [0, 0, 10] в WPO, все вершины меша будут сдвинуты на 10 сантиметров вверх [в направлении Z].
Однако такой простой сдвиг редко используется на практике. Вместо этого применяются математические функции, связанные со временем, для создания сложных деформаций.
Демонстрация работы собранного шейдера.
Нодовая система шейдера — детали.
Данный эффект состоит из 2-3 [в зависимости от Blend Mode-a материала] основных частей: создание маски для WPO, шум добавляющий рельеф смещению, настройка Opacity для эффекта «растворения» при использовании Translucent материала, а также дополнительные параметры для контролирования цвета, яркости, контрастности и другие.
Нодовая система шейдера — детали.
Основная работа данной части нод завязана на использовании функции BoundingBoxBased_0-1_UVW и математического выражения Step.
BoundingBoxBased_0-1_UVW — это функция, которая создает равномерный градиент от 0 до 1 для каждого из трех направлений X, Y,Z на основе *Bounding Box и Absolute World Position, что также подходит для создания процедурных материалов.
Step — это математическая функция, которая создает резкий переход между двумя значениями на основе порога. Она мгновенно переключается из 0 в 1 при достижении определенного значения.
В данном случае Step создает резкий переход между областями, которые уже подверглись WPO и теми, которые еще нет.
Нодовая система шейдера — детали.
Данная часть нод создает анимированный шумовой паттерн для управления деформацией геометрии через World Position Offset.
Система начинается с масштабирования UV будущей текстуры параметрами, контролирующими плотность повторения паттерна. Эти координаты поступают в ноду Panner, которая анимирует их движение во времени. Скорость анимации регулируется параметром PannerStrength — при нулевом значении анимация не будет воспроизводиться.
Полученные данные перемножаются на B канал и подаются в WPO материала, создавая деформацию.
Нодовая система шейдера — детали.
Для корректной работы данной части нодовой системы стоит переключить Blend Mode материала на Translucent.
Все примененные в коде математические выражения позволяют создать линейный градиент, распространяющийся вдоль оси Z [благодаря Mask (B)] относительно объекта, а не мировых координат.
Выведенные параметры задают отступ начала эффекта, регулируют резкость границы и силу прозрачности.
Демонстрация работы собранного шейдера.
Нодовая система шейдера — детали.
SphereMask — нода, которая создает маску в форме сферы с плавными границами, используя расстояние между инпутами A и B.
Параметры Radius и Hardness управляют свойствами маски — радиусом сферы и резкостью перехода на границах.
В данном эксперименте центр деформации задается трехканальным вектором, соответствующим осям в 3д пространстве. Так, чтобы объект перемещался из базового положения, например, вверх, необходимо вписать нужное число в канал B.
Демонстрация работы собранного шейдера.
Помимо ноды Lerp маскировать объекты можно также с помощью ноды VertexColor.
VertexColor — это нода, которая предоставляет материалу доступ к данным, «запеченным» непосредственно в вершины меша.
Использование данной ноды открывает возможность управления визуальными свойствами материала в зависимости от того, в цвет какого канала раскрашен тот или иной вертекс 3d модели.
Например, для наглядной визуализации в следующем эксперименте будет проведена попытка ограничить область работы эффекта волшебного свечения [который был разобран ранее] на 3d объекте.
Нодовая система шейдера — детали.
Основным отличием прошлого шейдера от измененного является добавление двух вертексных масок на паттерн шума и на сверкающие частицы [Glitter Mask], а вместе с этим изменение структуры подключения некоторых составляющих шейдера.
Нодовая система шейдера — детали.
Перед тем как вынести сверкающие частицы в R канал Vertex Color была проведена линейная интерполяция по Noise маске, сделанной ранее, для того, чтобы блестки охватывали не всю модель, а исключительно получаемые после работы шума узоры.
Для того, чтобы паттерн шума отработал правильно, было принято решение 2 раза использовать Lerp вместе с Base Color-ом, чтобы в первом случае маска Noise не дала черных пятен, а во втором, чтобы задать цвет базового материала, еще не подвергнутого влиянию G канала с паттерном.
Процесс рисования Vertex Color маски.
Далее в окне проекта необходимо переключить Selection Mode [shift+1] на Mesh Paint Mode [shift+4].
В открывшемся окне нужно выбрать кисточку Paint, и тогда появятся дополнительные, необходимые для создания маски, настройки: Color Painting, Brush, Vertex Painting.
Главное окно, в котором будет происходить вся настройка дальнейшей работы — Color Painting. Здесь можно выбрать режим или же цвет [рисование / стирание], а также каналы, на которые будет распространяться влияние кисточки [RGBA].
Для оперативного переключения между режимом рисования и стирания, можно нажимать клавишу 'X'.
Процесс рисования Vertex Color маски.
Таким образом, для того, чтобы проявить эти два канала, нужно выбрать каждый из них в настройке кисти и обрисовать нужную модель в тех местах, где эффекты должны быть видны.
Важно отметить, что качество Vertex Paint-a сильно зависит от количества полигонов-вершин в 3d объекте.
Чем их больше — тем мягче и плавнее будет переход.
Демонстрация работы собранных шейдеров.
Благодаря системе Blueprint можно добиться эффекта динамического изменения маски или же рисования по поверхностям внутриигровых объектов в реальном времени, однако это требует более глубокого и всестороннего изучения возможностей UE5 и является темой для отдельного исследования.
Blend Node — это категория нод в Material Editor Unreal Engine, предназначенных для смешивания двух или более входных значений, текстур или цветов по определенным правилам.
Демонстрация готовых Blend нод-функций в Material Editor.
Демонстрация устройства некоторых Blend нод-функций.
В Unreal Engine существует система Material Layers, которая позволяет создавать модульные, многослойные материалы с независимым управлением каждого слоя через Material Instances. Это значительно расширяет возможности создания сложных, многокомпонентных шейдеров.
Процесс создания основных компонентов Material Layers.
Система Material Layers состоит из трех основных типов объектов:
— Material Layer — используется для создания слоя, который можно смешивать с другими слоями материала;
— Material Layer Blend — используется для создания маски для смешивания двух слоев;
— Master Material / Instance — материал, в котором будут собираться и смешиваться слои.
Пример сборки базового Material Layer.
Material Layer — это специальный тип материала в Unreal Engine, который работает как отдельный, независимый компонент внутри более сложного основного материала.
По своей структуре и способу создания он очень похож на обычный материал: у него есть свой граф, куда добавляются ноды для текстуры, цвета, шероховатости и других свойств поверхности.
Кастомный Material Layer Blend.
Material Layer Blend — это логика, по которой слои материалов смешиваются в MI. Помимо базовых смешиваний [к примеру, с помощью градиента] можно настроить кастомные MLB с динамически изменяющимися масками / параметрами.
Это смешивание может быть и текстурой, и вертексным цветом, процедурной функцией или комбинацией различных методов и определяет, в каких областях поверхности конкретный слой будет виден и с какой интенсивностью.
Основные ноды для создания базового Master Material-a.
При создании материала, в инстансе которого будут смешиваться ранее настроенные слои [Material Layer], первым делом необходимо включить Use Material Attributes.
Далее основная работа по настройке мастер материала будет проходить в Material Attribute Layers. Нужно добавить необходимое количество слоев. По умолчанию Background или же базовый слой-подложка сразу включен.
1 — Пустой, базовый Material Instance — Layer Parameters; 2 — Настроенный Material Instance.
Демонстрация работы параметров шейдера, собранного с помощью Material Layers.
Substrate также предоставляет многослойный, модульный подход к созданию материалов и открывает возможности для создания более сложных и реалистичных шейдеров с подповерхностным рассеиванием [Subsurface Scattering], анизотропией и другими сложными оптическими явлениями, которые ранее требовали обходных решений.
Демонстрация работы собранного с помощью Substrate-a шейдера.
Настройки проекта для работы Substrate материалов.
Для того, чтобы появилась возможность создать Substrate материал, необходимо в настройках проекта активировать:
После необходимо будет перезапустить проект и изменения вступят в силу.


Изменение ноды при добавлении компонента Substrate Material-a.
При создании нового шейдера граф будет похож на обыкновенный материал, однако стоит только добавить Substrate Slub или иной компонент сабстрейт материалов и подключить его к Front Material, как нода вывода поменяется.
Slub в контексте данных материалов — это базовый блок или буквально «плита» [от англ. slub], которая описывает один слой или компонент материала с определёнными физическими и оптическими свойствами.
Это фундаментальная единица системы, из которых затем с помощью различных наложений составляются сложные материалы.
Нодовая система шейдера — детали.
Создавая логику слоев с помощью Substrate Slab BSDF [или иных компонентов Substrate-a] и объединяя их с помощью Substrate Vertical Layer или иных blend-функций можно добиться самых различных эффектов с еще большим уровнем проработки и детализации относительно обычного пайплайна создания шейдера.
Однако стоит обратить внимание на то, что данный тип настройки шейдеров гораздо сильнее нагружает систему в отличие от базовых материалов.
Демонстрация работы собранного с помощью Substrate-a шейдера.
«Sun Dancer», фрагмент из аниматика.
Например, в нарративной структуре аниматика присутствуют сцены, визуализирующие процесс нанесения на тело главного героя сакральных узоров в рамках подготовки к ритуалу Солнцестояния.
Реализация данной художественной задачи требует разработки специализированного шейдера, способного передать не только форму и расположение узора, но и задать скорость и время его проявления, а также назначить особый материал по маске, сочетающий в себе сверкающие золотистые переливы.
Так, материал будет представлять собой синтез двух основных рассмотренных техник: покадровая отрисовка паттерна, проявляющаяся вслед за движением кисточки в соответствии с UV-координатами модели и настройка уникального сверкающего материала для самой краски вместе с блестящими частицами, который будет проявляться только в определенных частях отрисованной маски.
«Sun Dancer», фрагмент из аниматика.
Еще один пример применения в ВКР результатов, полученных в ходе экспериментов, — визуализация пограничных состояний главного героя, его субъективное восприятие мира и окружения в моменты помутнения рассудка и приступов паники с помощью деформации на основе World Position Offset.
Данный метод позволит осуществлять модификацию геометрии окружающих объектов в реальном времени, что послужит мощным инструментом для отражения субъективной картины мира.