Графы материалов
Стандартных типов материалов хватает на большую часть того, что нужно проекту. Когда не хватает, материал можно собрать графом: соединить ноды, а редактор скомпилирует из них настоящий шейдер.
Тянитесь к нему, когда нужно то, чего фиксированный материал не выразит: ползущая текстура, растворение, голограмма, вода, цвет, меняющийся с углом обзора, колышущийся флаг.
Каждая нода со своими портами: справочник нод шейдера — 95 нод.
Встроенные типы — не отдельная система с прикрученным графом: standard, physical, toon и
остальные сами являются точками в этом же пространстве. Так что граф-материал — не гражданин
второго сорта: он идёт тем же путём, получает то же освещение и работает на мобильных.
Как устроен граф
Граф идёт от входов через математику к выходам.
| Категория | Что там живёт |
|---|---|
| input | UV, нормаль поверхности, время, позиция, текстуры, номер рисуемого экземпляра |
| const | фиксированные числа и цвета, которые вы вводите |
| math | арифметика и кривые над одиночными числами |
| vector | сборка, разборка, смешивание и преобразование векторов и цветов |
| light | слагаемые освещения, которые вы формируете сами |
| post | ноды, сэмплирующие отрендеренный кадр — см. экранные эффекты |
| output | то, как поверхность в итоге выглядит |
Выходы поверхности
Нода вывода — это то, чем ваш граф заканчивается, а её входы — физическое описание поверхности:
| Выход | Что означает |
|---|---|
baseColor | цвет поверхности |
metallic | 0 для диэлектрика, 1 для голого металла — промежуточное редко |
roughness | 0 — зеркально гладкая, 1 — полностью матовая |
normal | подайте свою нормаль, чтобы добавить детали поверхности |
emissive | свет, который поверхность излучает сама |
alpha | прозрачность |
clearcoat · clearcoatRoughness | слой лака сверху |
ior · transmission · thickness | преломление — для стекла и жидкостей |
Всё, что вы оставили неподключённым, сохраняет значение по умолчанию, и компилятор сворачивает это — выход, которым вы не пользуетесь, не стоит ничего.
Работа с инстансами
Две входные ноды существуют специально для
инстансированных объектов: instanceId даёт номер рисуемой
копии, а instanceColor — её оттенок.
Подайте instanceId в хеш — и каждая копия получит свой оттенок, размер или фазу анимации, за один
вызов отрисовки. Поле травы, где каждая травинка качается чуть иначе, стоит столько же, сколько
поле, где все качаются одинаково.
Обе читают разумные значения по умолчанию на обычном меше, так что граф с ними не сломается, оказавшись там, где инстансинга нет.
Экранные эффекты
Граф, сэмплирующий отрендеренный кадр, — это вообще не материал поверхности, а полноэкранный эффект, наложенный на всю сцену. Цветокоррекция, виньетки, размытия, строки развёртки.
Движок замечает это сам: используйте ноду, читающую кадр, — и граф станет эффектом, а не тем, что вешают на объект. Несколько эффектов на сцене выполняются в заданном вами порядке.
Текстуры и цветовое пространство
Нода текстуры сэмплирует ресурс-изображение. Цветные изображения декодируются за вас, так что математика работает на настоящих цветовых значениях.
Текстура, несущая числа, а не цвет, — карта roughness, маска, карта высот — должна быть помечена соответствующе, иначе к ней применят цветокоррекцию, и ваши значения окажутся едва заметно неправильными. Это самая частая причина фразы «моя карта roughness выглядит совсем не так».
У скриптов нет доступа к компоненту графа, поэтому задать параметр графа из кода нельзя.
Это ограничивает меньше, чем кажется, потому что обе вещи, которых обычно хотят, покрыты:
| Вам нужно | Как сделать |
|---|---|
| Что-то, анимирующееся само | используйте вход time внутри графа — пульсация, прокрутка, мерцание живут именно там |
| Что-то, управляемое состоянием игры | управляйте обычным слотом материала: скрипт может писать emissiveIntensity, color, opacity, roughness |
Так что маяк, пульсирующий вечно, — это граф, читающий time; а маяк, разгорающийся, когда игрок
набрал очки, — это скрипт, пишущий emissiveIntensity в стандартный материал.
Практические советы
Начинайте с пресета. Дублирование стандартного материала как графа даёт корректную, полную отправную точку. Сборка с пустого холста означает заново выводить освещение, которое выводить не требовалось.
Следите за тем, что добавляете. Граф выполняется для каждого пикселя каждого кадра. Выборка из текстуры дёшева, цикл — нет. Если после правки просел FPS, подозреваемый — последняя добавленная нода.
Сохраните его как ресурс — и все объекты, которые им пользуются, обновятся разом; это же означает одно место для правки, когда вид не тот.
Дальше: Частицы — огонь, дым, искры и пыль.