Что такое Material Graph и как работает PBR-модель материалов?
Material Graph — нод-ориентированный редактор шейдеров в UE. PBR-модель описывает материал через Base Color, Metallic, Roughness, Normal и Specular; движок использует Disney-based physically based модель для корректного расчёта освещения.
Material Graph: общая концепция
Material Graph — визуальный редактор шейдеров в Unreal Engine. Каждый материал компилируется в HLSL-шейдер; граф — это лишь удобный способ собрать математику без ручного написания кода. Конечный результат подаётся на входы Material Output Node, который имеет слоты для всех PBR-параметров.
PBR-модель Unreal Engine
UE использует Disney Principled BRDF (адаптированный Epic): физически корректную модель отражения, где свет вычисляется через уравнение рендеринга с разделением на диффузный (Lambertian) и зеркальный (GGX Trowbridge-Reitz) компоненты.
Основные входы Material Output Node
- Base Color (RGB, 0–1) — альбедо поверхности. Для диэлектриков: цвет материала (дерево, камень, кожа). Для металлов: цвет отражения. Не должен содержать информацию об освещении.
- Metallic (0 или 1, бинарный) — 0 = диэлектрик, 1 = металл. Промежуточные значения допустимы только для смешанных поверхностей (ржавчина, окалина).
- Roughness (0–1) — микрорельеф поверхности. 0 = идеальное зеркало, 1 = матовая диффузная поверхность. Управляет шириной зеркального блика через параметр α = Roughness².
- Specular (0–1, по умолчанию 0.5) — F0 диэлектрика (индекс преломления). Менять нужно редко: 0.5 = ~4% отражения, что соответствует большинству пластиков/камней.
- Normal (RGB, tangent-space) — карта нормалей для микродетализации без добавления геометрии. Подаётся через ноду
Texture Sample+Normal Map. - Emissive Color (RGB, HDR) — самосвечение. При включённом Lumen становится источником GI.
- Ambient Occlusion (0–1) — затенение впадин; умножается на диффузный вклад.
- Opacity / Opacity Mask — прозрачность (только для Translucent/Masked Blend Mode).
Типичная структура графа (горная порода)
// Псевдокод порядка нод в Material Graph
// 1. Текстуры
TextureSample(T_Rock_BaseColor) --> Base Color
TextureSample(T_Rock_Normal) --> Normal (через UnpackNormalMap)
TextureSample(T_Rock_ORM) // ORM-атлас
.R --> Ambient Occlusion
.G --> Roughness
.B --> Metallic
// 2. Параметры (для Material Instances)
ScalarParameter("RoughnessMultiplier", 1.0) * Roughness --> Roughness
VectorParameter("Tint", 1,1,1) * Base Color --> Base Color
Material Instances и параметры
Вместо создания N копий материала создаётся один Master Material с нодами ScalarParameter и VectorParameter, а затем дочерние Material Instances, которые переопределяют только параметры. Это исключает перекомпиляцию шейдера при смене значений.
// Смена параметра Material Instance в C++
UMaterialInstanceDynamic* MID =
UMaterialInstanceDynamic::Create(BaseMaterial, this);
MeshComponent->SetMaterial(0, MID);
MID->SetScalarParameterValue(TEXT("Roughness"), 0.3f);
MID->SetVectorParameterValue(TEXT("Tint"), FLinearColor(1, 0.5f, 0));
Blend Mode и Shading Model
- Opaque — непрозрачный, самый дешёвый. Участвует в Lumen GI.
- Masked — бинарная прозрачность по Opacity Mask; подходит для листвы, решёток.
- Translucent — полупрозрачность; не поддерживает Deferred Lighting без специальных настроек.
- Shading Model: Default Lit, Unlit, Subsurface (кожа, воск), Clear Coat (лак), Hair, Eye — выбирается в свойствах материала.
Подводные камни
- Base Color не должен содержать тени — запечённые тени в текстуре нарушают физическую корректность и конфликтуют с динамическим GI (Lumen/SSGI).
- Metallic = 0.5 (серый) в большинстве случаев физически некорректен — используйте маску ржавчины/перехода, а не промежуточное значение для всей поверхности.
- Нода
Texture Sampleбез явного указания Sampler Type (Color/LinearColor/Normal) может дать неправильную гамма-коррекцию. Карты Normal/ORM/Roughness должны бытьLinearColor(без sRGB). - Слишком тёмный Base Color для металлов (ниже 50–70 sRGB) нарушает уравнение Fresnel и даёт неправдоподобно поглощающий металл.
- Emissive Color без ограничения: значения выше 1 правильные для HDR, но без Bloom и Exposure Compensation выглядят как белые пятна — всегда проверяйте в Scene с Tone Mapping.
- Material с Translucent Blend Mode по умолчанию не получает GI от Lumen — нужно включить
Translucency Type = Ray Tracingв свойствах материала (только HWRT). - Избыточное количество нод
Texture Sampleувеличивает число samplers; лимит на DX11 — 16 на шейдер. Используйте ORM-упаковку (O=R, G=Roughness, B=Metallic) вместо трёх отдельных текстур. - Изменение Blend Mode или Shading Model в Master Material перекомпилирует все дочерние Material Instances — делайте это на ранних этапах разработки.
Common mistakes
- Объяснять Material Graph и PBR только по синтаксису, без жизненного цикла и стоимости.
- Игнорировать ошибки, null/empty состояния, порядок инициализации или режим сборки.
- Давать пример, который работает в демо, но ломается при изменении владельца ресурса.
- Использовать макросы или specifier-и наугад и забывать про UObject GC.
What the interviewer is testing
- Кандидат формулирует точную модель для Material Graph и PBR, а не только определение.
- Пример компилируем, безопасен по lifetime и соответствует версии технологии.
- Названы trade-off, ограничения и диагностируемые симптомы ошибки.
- Понимает границу между C++ кодом, runtime/framework metadata и editor/UI слоем.