Перейти к основному содержимому

Графы материалов

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

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

Каждая нода со своими портами: справочник нод шейдера — 95 нод.

Любой материал и так граф

Встроенные типы — не отдельная система с прикрученным графом: standard, physical, toon и остальные сами являются точками в этом же пространстве. Так что граф-материал — не гражданин второго сорта: он идёт тем же путём, получает то же освещение и работает на мобильных.

Как устроен граф

Граф идёт от входов через математику к выходам.

КатегорияЧто там живёт
inputUV, нормаль поверхности, время, позиция, текстуры, номер рисуемого экземпляра
constфиксированные числа и цвета, которые вы вводите
mathарифметика и кривые над одиночными числами
vectorсборка, разборка, смешивание и преобразование векторов и цветов
lightслагаемые освещения, которые вы формируете сами
postноды, сэмплирующие отрендеренный кадр — см. экранные эффекты
outputто, как поверхность в итоге выглядит

Выходы поверхности

Нода вывода — это то, чем ваш граф заканчивается, а её входы — физическое описание поверхности:

ВыходЧто означает
baseColorцвет поверхности
metallic0 для диэлектрика, 1 для голого металла — промежуточное редко
roughness0 — зеркально гладкая, 1 — полностью матовая
normalподайте свою нормаль, чтобы добавить детали поверхности
emissiveсвет, который поверхность излучает сама
alphaпрозрачность
clearcoat · clearcoatRoughnessслой лака сверху
ior · transmission · thicknessпреломление — для стекла и жидкостей

Всё, что вы оставили неподключённым, сохраняет значение по умолчанию, и компилятор сворачивает это — выход, которым вы не пользуетесь, не стоит ничего.

Работа с инстансами

Две входные ноды существуют специально для инстансированных объектов: instanceId даёт номер рисуемой копии, а instanceColor — её оттенок.

Именно это перестаёт превращать тысячу объектов в один

Подайте instanceId в хеш — и каждая копия получит свой оттенок, размер или фазу анимации, за один вызов отрисовки. Поле травы, где каждая травинка качается чуть иначе, стоит столько же, сколько поле, где все качаются одинаково.

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

Экранные эффекты

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

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

Текстуры и цветовое пространство

Нода текстуры сэмплирует ресурс-изображение. Цветные изображения декодируются за вас, так что математика работает на настоящих цветовых значениях.

Помечайте текстуры с данными как данные

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

Скрипт не может дотянуться внутрь графа

У скриптов нет доступа к компоненту графа, поэтому задать параметр графа из кода нельзя.

Это ограничивает меньше, чем кажется, потому что обе вещи, которых обычно хотят, покрыты:

Вам нужноКак сделать
Что-то, анимирующееся самоиспользуйте вход time внутри графа — пульсация, прокрутка, мерцание живут именно там
Что-то, управляемое состоянием игрыуправляйте обычным слотом материала: скрипт может писать emissiveIntensity, color, opacity, roughness

Так что маяк, пульсирующий вечно, — это граф, читающий time; а маяк, разгорающийся, когда игрок набрал очки, — это скрипт, пишущий emissiveIntensity в стандартный материал.

Практические советы

Начинайте с пресета. Дублирование стандартного материала как графа даёт корректную, полную отправную точку. Сборка с пустого холста означает заново выводить освещение, которое выводить не требовалось.

Следите за тем, что добавляете. Граф выполняется для каждого пикселя каждого кадра. Выборка из текстуры дёшева, цикл — нет. Если после правки просел FPS, подозреваемый — последняя добавленная нода.

Сохраните его как ресурс — и все объекты, которые им пользуются, обновятся разом; это же означает одно место для правки, когда вид не тот.


Дальше: Частицы — огонь, дым, искры и пыль.