← Модуль 5/PBR-рендеринг
EN
Модуль 5 · HD-эра и инди (2005–2012)

PBR — физически корректный рендеринг

Тихая революция эпохи, невидимая на скриншоте: материалы перестали «подкручивать на глаз под конкретный свет» и стали физически осмысленными — один и тот же металл/кожа/пластик выглядит правильно под любым освещением. За этим — микрофасетная модель, Френель и закон сохранения энергии.
~18 мин🏠 лаба🔬 графика + математика
Суть за 30 секунд
До PBR художник вручную крутил diffuse/specular/ambient под конкретную сцену; перенёс объект в другой свет — выглядит неправильно, и работа разных художников не стыковалась. PBR-инсайт (формализован в Disney, SIGGRAPH 2012, Брент Бёрли): параметры материала должны быть физически осмысленными — albedo (базовый цвет), roughness (0 зеркало → 1 матовость), metallic (0 диэлектрик → 1 металл), — и тогда один материал верен под HDR, GI, трассировкой, без перетюнинга. Под капотом: поверхность = миллионы микрозеркал (микрофасеты), их разброс задаёт roughness; Френель делает всё зеркальным на скользящем угле; энергия сохраняется (отражено ≤ получено). Следствие — материалы стали переносимыми библиотеками (Megascans, Substance), и маленькая студия получила ААА-картинку из коробки. UE4 принёс PBR в 2014, Unity — в 2015, к 2017 это стандарт везде.

Механизм: почему «физически осмысленные» параметры всё изменили

Проблема до PBR. Материал описывали ad hoc числами: diffuse-цвет, сила бликов, ambient-добавка — и подгоняли на глаз под свет конкретного уровня. Три беды: (1) перенёс объект в другое освещение — блик и яркость поплыли; (2) материалы разных художников не стыковались (каждый тюнил по-своему); (3) ничего нельзя переиспользовать как библиотеку. По сути — «храни сырьё, а не модель» наоборот: куча несвязных подкрученных значений вместо одного физического описания.

Инсайт. Опиши материал тем, что не зависит от сцены — его физикой. Тогда рендер сам посчитает, как он выглядит под любым светом. Стандартный набор (metallic-roughness workflow):

Микрофасеты — откуда берётся roughness

Шероховатая поверхность вблизи — это мириады крошечных идеальных зеркал (микрофасетов) со случайным наклоном. Roughness — это разброс их ориентаций. Гладкая поверхность: все микрозеркала смотрят почти одинаково → отражённый свет летит узким пучком → острый блик. Шершавая: наклоны разбросаны → свет рассеивается широким конусом → блик размывается и тускнеет. Никакого «нарисованного» блика — он выводится из статистики микрорельефа.

Френель — почему всё на скользящем угле зеркало

Доля отражённого света растёт к скользящим углам: смотри в воду прямо вниз — видишь дно (отражается ~2–4%); посмотри вдоль глади к горизонту — она зеркало (отражается ~100%). Это эффект Френеля, и в реал-тайме его берут приближением Шлика:

F(θ)= F0+ (1−F0) (1−cosθ)5

где F0 — отражательность в лоб (нормальное падение), θ — угол между взглядом и нормалью. Тут и прячется metallic: у диэлектриков F0 ≈ 0.04 (бесцветные 4%) плюс диффузный albedo; у металлов F0 = их цветной albedo (золото ≈ {1.0, 0.76, 0.34}) и диффуза нет. Поэтому «metallic» переключает, куда уходит albedo: в диффуз (диэлектрик) или в цвет блика (металл).

Сохранение энергии — почему PBR не «светится»

Поверхность не может отразить больше света, чем получила. Старые материалы это нарушали (диффуз + блик могли давать >100%) — отсюда «пластилиновый» или «светящийся» вид. PBR делит бюджет: чем больше уходит в зеркальное отражение (по Френелю), тем меньше остаётся диффузу, и сумма ≤ 1. Это и делает картинку «настоящей» под любым светом, а не только под тем, под который крутили.

Числовой пример — Френель воды

Диэлектрик, F0 = 0.04. В лоб (cos θ = 1): F = 0.04 + 0.96·(1−1)⁵ = 0.04 — отражается 4%, видишь сквозь. На скользящем (cos θ → 0): F = 0.04 + 0.96·1⁵ = 1.0 — отражается 100%, чистое зеркало. Один параметр, ноль ручной подкрутки — и вода правильно ведёт себя и в луже под ногами, и у горизонта. Тот же закон рисует «рим» (светящийся контур) на любом объекте: на краю силуэта угол скользящий → Френель → подсветка кромки.

🕹 В какие игры поиграть — и что заметить

PBR коварен тем, что он невидим: это не эффект, а консистентность. Поэтому замечать надо тонкое: правильно ли читаются металл/пластик/кожа в одной сцене, и как на скользящем угле всё становится зеркальным. От витрины PBR к контрасту с до-PBR.

The Order: 1886 2015 · ранняя витрина PBR

Ready at Dawn сделали игру-демонстрацию материалов: латунь, вороненая сталь, лак, ткань, кожа — каждый материал физически отдельный и верен под кинематографичным светом. Один из первых ААА-проектов «end-to-end PBR».

🎮 Сыграй: наведись на металлические детали оружия и на тканевые/кожаные — заметь, что блик у металла цветной и узкий, у кожи широкий и тусклый, и это не нарисовано, а одинаково работает при смене освещения по ходу сцены.

Horizon Zero Dawn / Forbidden West Decima · металл-роботы vs органика

Идеальный стенд: машины из полированного и шершавого металла рядом с травой, кожей, тканью и кожей Элой. Один и тот же материал корпуса робота верно читается в полдень, в пыльной буре и ночью у костра — это и есть «масштабирование по свету» PBR.

🎮 Сыграй: поверни камеру так, чтобы солнце скользнуло вдоль мокрой/металлической поверхности — увидишь, как блик вспыхивает на скользящем угле (Френель), а в лоб поверхность тусклее. Сравни робота-металл и ткань: разная ширина блика = разный roughness.

Star Wars Battlefront 2015 · Frostbite · фотограмметрия + PBR

DICE отсканировали реальные поверхности (фотограмметрия) и завели их как PBR-материалы — поэтому камень, металл и снег выглядят «как настоящие» под любым светом. Витрина того, как PBR + сканы дают фотореализм без ручного тюнинга.

🎮 Сыграй: найди контраст с до-PBR игрой (Half-Life 2, 2004): там блики «подрисованы» и под другим светом металл выглядит как крашеный пластик. Переключись на любую игру после ~2016 — разница в «честности» материала под движущимся светом бьёт в глаза.

Хардкор · теория: микрофасетный BRDF Кука–Торренса целикомможно пропустить

Зеркальная часть PBR — это микрофасетный BRDF Кука–Торренса: сколько света приходит с направления l и уходит в v. Три множителя, делённые на нормировку:

fspec= D·F·G 4(n·l)(n·v)
  • D — распределение нормалей (NDF). Какая доля микрофасетов смотрит точно на полувектор h (между l и v) — то есть отражает свет ровно в глаз. Это и есть форма блика, и ей рулит roughness. Индустриальный стандарт — GGX / Trowbridge–Reitz (длинные «хвосты» — реалистичнее, чем у старого Blinn–Phong):
D= α2 π((n·h)2(α2−1)+1)2

где α=roughness2 (возведение в квадрат даёт перцептивно линейный ползунок). При α→0 функция вырождается в пик на n=h — острый блик.

  • F — Френель (Шлик, см. выше) — какая доля реально отражается под текущим углом; для металлов цветной F0.
  • G — геометрия (затенение/маскирование). На скользящих углах микрофасеты загораживают друг друга — G гасит переотражение, иначе на гранях вылезает нефизичная пересветка. Зависит от roughness и углов (Smith-аппроксимация).

Диффузная часть — простой Ламберт fdiff=albedo/π, домноженная на (1−metallic) (у металла диффуза нет) и на остаток энергии после зеркального бюджета. Итог: один и тот же код считает и зеркало, и пыль — меняются только α, F0 и metallic.

Хардкор · инженерия: текстурный workflow, каналы и где это считаетсяможно пропустить

На практике параметры — это текстуры, по одной на канал, и художник красит их в Substance Painter / на готовых сканах (Megascans):

  • Base Color (albedo) — RGB, без теней и бликов (их добавит рендер).
  • Roughness — один канал (grayscale): царапины, потёртости, мокрые пятна = локально разный roughness.
  • Metallic — один канал, обычно почти бинарный (маска «где металл»).
  • Normal map — мелкий рельеф без геометрии (см. «индекс вместо данных»: детали в текстуре, а не в полигонах).
  • + AO, height, иногда переход на specular-glossiness workflow (альтернатива metallic-roughness).

Считается это в шейдере на каждый пиксель, обычно в deferred-конвейере: сначала геометрия пишет albedo/normal/roughness/metallic в G-буферы, потом свет считается по пикселям из них — стоимость растёт от числа источников света, а не от числа объектов. Именно это сочетание (PBR-материалы + deferred + HDR + тонмаппинг) и дало «современную картинку». Бизнес-следствие: материалы стали переносимыми библиотеками — Quixel Megascans, Adobe Substance, — и студия из трёх человек берёт ААА-материалы с полки, потому что PBR делает их композируемыми.

Аналогия
До-PBR материал — это фотография объекта при одном освещении: перевесил лампу — и фальшь видна (тени и блики «вшиты» неправильно). PBR-материал — это рецепт вещества: «шероховатость 0.3, металл, базовый цвет латунь». Рецепт не зависит от кухни — свет (повар) приготовит правильно при любой лампе. А микрофасеты — это матовое vs глянцевое стекло: то же стекло, но шершавое рассеивает отражение в мутное пятно, гладкое даёт чёткое зеркало; «шероховатость» — это и есть, насколько мелко исцарапана поверхность.
Почему это важно
PBR — образец того, как замена ad-hoc параметров физической моделью разом чинит перенос, композируемость и масштабирование. Художники перестали тюнить под сцену, материалы стали библиотеками, инди получили ААА-картинку с полки. Для инженера ценность даже не в графике: это чистый кейс «правильная параметризация важнее количества ручек» — выбери оси, совпадающие с реальностью, и всё нижестоящее (перенос между условиями, переиспользование, обобщение) становится бесплатным.
🔁 За пределами игр — куда это переносится
Урок — это физически обоснованная параметризация вместо подгонки на глаз: выбери оси, инвариантные к условиям, и получишь перенос и переиспользование даром.

ML / AI (твой домен): BRDF — это аналитический, дифференцируемый prior, и это прямо мост в современный рендер-ML. Дифференцируемый рендеринг и NeRF / 3D Gaussian Splatting подставляют физическую модель отражения (часто тот же микрофасетный BRDF) внутрь обучения и оптимизируют материалы/свет градиентом — «inverse rendering». Это спор physics-based prior vs полностью выученная функция: вшитый BRDF = меньше данных, гарантированная обобщаемость на новый свет (ровно как PBR переносится между сценами), как у физически-информированных сетей (PINN). А «физически осмысленные оси вместо кучи ручек» = хороший дизайн признаков/латента: дизентанглмент (отдельно albedo / освещение / геометрия) обобщается, запутанные параметры — нет. Энергосбережение BRDF ⇄ нормировка/ограничения, удерживающие выход в валидном диапазоне.

Графика / симуляция: единая физическая модель материала переносится между растеризацией, трассировкой и path-tracing без переавторинга — один ассет, любой рендер.

Инженерия в целом: параметризуй систему по инвариантам (физические единицы, безразмерные числа), а не по удобным сейчас числам — тогда конфиг переносится между средами; «захардкодил под прод» = до-PBR материал, который ломается при смене условий.

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

🏠 Лаба — покрути PBR-сферу
Интерактивная лаба без кода: освещённая сфера, считаемая микрофасетным BRDF прямо в браузере. Тяни ползунки roughness и metallic, меняй цвет и угол света — и смотри, как острый блик расплывается в тусклое пятно, как металл убивает диффуз и красит блик, и как на кромке вспыхивает Френель. Открыть лабу →

Лучший момент: поставь roughness в 0 и крути metallic 0→1 — увидишь, как диэлектрик (диффузный шар с белым бликом) превращается в полированный цветной металл без диффуза. Потом тяни roughness 0→1 — острый блик размазывается в матовую поверхность.

🔧 Запусти и поковыряй — на домашнем компе
Во что играть — выше (🕹). Здесь — потрогать PBR-материалы в редакторе.
🔧 Поковырять (debug) ~40 мин, Substance / Blender / движок
В любом PBR-редакторе (Blender + Principled BSDF, или материал в Godot/Unity/Unreal) заведи сферу и покрути roughness и metallic вживую под одним HDRI-светом. Поставь metallic=1, roughness=0 → зеркало; roughness=1 → матовый металл. Затем НЕ меняя материал, поменяй HDRI (другое окружение) — заметь, что материал остаётся правдоподобным без перетюнинга. Это и есть «масштабирование по свету».
🧪 Потестить (глазами художника) ~15 мин
Открой бесплатный Megascans/ambientCG-материал и разбери его по каналам: где albedo, где roughness-маска (потёртости/мокрое), где normal. Затем «сломай энергосбережение»: задери и albedo, и блик — увидишь «светящийся пластилин». Это то, что PBR запрещает по построению.
Чеклист: увидел, как roughness/metallic меняют блик; убедился, что материал держится при смене HDRI; разобрал реальный материал по каналам; воспроизвёл «не-физичный» вид нарушением энергии.
Связи
основа
Движки — UE4 (2014) и Unity (2015) сделали PBR стандартом из коробки; движок и решает, какие материалы ты вообще авторишь.
основа
Железо-ограничения — normal map и текстурные каналы PBR — это «индекс вместо данных»: детали в текстуре, а не в геометрии.
смежное
3D-конвейер — PBR-шейдинг живёт в конце конвейера (на пикселях после растеризации), обычно в deferred-проходе по G-буферам.
Вопросы пытливого ума
Если PBR «физически корректный», почему он всё ещё приближение (Шлик, GGX), а не настоящая оптика?
Потому что цель — правдоподобие в реал-тайме на бюджете в миллисекунды, а не симуляция Максвелла. Шлик — дешёвая аппроксимация формул Френеля (ошибка незаметна глазу), GGX — удобная модель распределения микрофасетов с хорошими хвостами. «Физически основанный» значит «уважает законы (энергосбережение, Френель, микрофасеты) и параметризован величинами реального мира», а не «решает уравнение переноса излучения точно». Это инженерный компромисс «достаточно физики, чтобы переносилось», как fixed-point был «достаточно точности дёшево».
Почему metallic — почти бинарный? Разве не бывает «полуметаллов»?
Оптически вещество либо проводник (металл: свободные электроны → нет диффузного пропускания, цветное зеркальное F0), либо диэлектрик (изолятор: есть диффуз, бесцветный ~4% блик). Середины в природе почти нет — «полуметаллический» вид (крашеный металл, ржавчина, пыль на стали) это смесь на уровне текстуры: одни тексели металл, другие диэлектрик, а не материал с metallic=0.5. Поэтому канал metallic — это, по сути, маска, а не плавный регулятор.
Зачем roughness возводят в квадрат (α = roughness²)?
Ради перцептивной линейности ползунка. Визуальное изменение блика нелинейно по «настоящему» параметру шероховатости α: у малых значений крошечный сдвиг сильно меняет картинку, у больших — почти нет. Возведение в квадрат растягивает чувствительную зону так, что движение ползунка roughness ощущается равномерным по всему диапазону. Чистый UX поверх физики — как гамма-коррекция для яркости.
Почему до-PBR металл выглядел «крашеным пластиком» под другим светом?
Потому что блик был запечён под конкретную лампу, а не выведен из материала. Художник ставил specular-цвет и силу так, чтобы выглядело верно в данной сцене; физика (Френель на скользящем угле, цветное зеркало металла, сохранение энергии) не соблюдалась. Перенеси объект в другое освещение — блик не там и не той силы, диффуз не гасится в пользу зеркала, и мозг читает «неметалл». PBR убирает ручную запеканку: блик всегда следует из albedo/roughness/metallic и текущего света.
PBR обещает «один материал под любым светом» — где он всё-таки врёт?
На том, что прямой BRDF не покрывает: непрямой свет (нужны IBL / GI / трассировка — иначе металл в тени «мёртвый»), подповерхностное рассеивание (кожа, воск, мрамор — свет уходит внутрь, отдельная модель SSS), многократные отражения между микрофасетами (теряется энергия на шершавом металле — лечат multiscatter-компенсацией), тонкоплёночная интерференция (мыльный пузырь, бензин). PBR честен для «обычных» поверхностей; экзотика требует расширений. Знать границу модели важнее, чем верить в её универсальность.
Что почитать