PBR для новичков — материалы, пайплайны и текстурные карты
Всё о работе с физически корректной визуализацией от преподавателя курса «Процедурный трип» Антона Агеева.
В июне на нашем YouTube-канале прошёл стрим с Антоном Агеевым, который уже больше семи лет занимается текстурами в игровой индустрии и успел поработать с Nival, Playrix и Game Insight. Антон рассказал, что такое PBR, разобрал параметры материалов, основные пайплайны работы и дополнительные текстуры.
На стриме он работал в Substance Painter и Marmoset Toolbag, но все принципы применимы и в других утилитах. Ниже пересказываем самые важные моменты стрима.
Что такое PBR
PBR расшифровывается как Physically Based Rendering — физически корректная визуализация. То есть, рендеринг материалов происходит с учётом законов физики. Основное преимущество материалов с этой технологией в том, что их можно использовать и в программах для рендеринга, и в игровых и неигровых движках — от одной утилиты к другой пайплайн материала не меняется.
Применяя одни и те же текстуры [PBR] в разных движках, вы будете получать немного разный результат, но если они правильно откалиброваны, то их суть будет оставаться неизменной и они будут выглядеть хорошо и в Unity, и в Unreal Engine, и в любом не-real time рендере с трассировкой.Антон Агеев
Антон Агеев
Типы материалов
Существует два основных типа материалов: диэлектрики и металлы. Их отличие во взаимодействии с освещением состоит в том, что металлы не пропускают внутрь себя свет.
У диэлектриков есть диффузное отражение, то есть лучи света проходят внутрь материала, рассеиваются, и после этого часть света поглощается, а часть выходит наружу. А ещё у диэлектриков белый блик.
Металлы не пропускают свет, а отражают его, частично или полностью, в результате чего получается цветной блик. Диэлектрики тоже отражают свет, но в гораздо меньшем количестве, чем металлы.
При падении света на материалы обоих типов действует эффект Френеля. Согласно ему степень отражений зависит от угла падения света на поверхность. Чем острее угол — тем больше света отразится. Отражающая же способность диэлектриков равна количеству света, которое отражает материал при освещении под прямым углом.
Закон сохранения энергии
В реальности по закону сохранения энергии количество отражённого света не может превысить количество поглощённого. В Marmoset Toolbag есть специальный чекбокс Conserve Energy, который «следит» за выполнением этого закона. Если он включён и сумма зеркальных и диффузных отражений равна 1 или больше, то диффузные отражения начинают затухать. А если зеркальные отражения равны 1, то диффузные отражения вообще перестают на что-то влиять. То есть сохраняется «реалистичность» материала.
Такая ситуация, то есть высокий показатель зеркальных отражений и отсутствие диффузных, характерна для металлов.
Когда вы настраиваете металлы, цвет диффузных отражений нужно убирать.
Параметры материала:
Albedo (диффузный цвет). Это сила и цвет диффузных отражений. У металлов их нет, поэтому Albedo у них чёрный. В текстуре Albedo в PBR, в отличие от пастгена, не должно быть запечённого освещения, бликов и теней. Цвет должен выглядеть так, будто взят с поверхности, которая обращена к камере под прямым углом и освещена 100% белым рассеянным светом. В Albedo лучше избегать ахроматических и «открытых» цветов, корректный диапазон для этого параметра — 50-245 в sRGB.
Reflectivity (отражающая способность). Это определяющий параметр при достижения достоверности любого материала, лучше всего брать его из готовых источников (например, в Substance Painter есть заготовки металлов).
Диапазон корректных значений для диэлектриков — 2-14%. 8-14% отражают редкие материалы вроде рубина или алмаза, а у большинства других показатель находится в диапазоне 4-6%. Диапазон металлов — 60-100%. 100% отражают некоторые чистые металлы, но они встречаются редко, так что лучше держаться в пределах 96%.
Как только Reflectivity падает ниже 60%, тут же должен подключаться цвет Albedo, потому что материалов, которые просто поглощают столько света и ничего не отдают назад, не существует.
Антон Агеев
Чистых материалов с коэффициентом отражений 14-60% почти не бывает. Такое значение может получиться только при сильном загрязнении или окислении. Также Reflectivity металлов в большинстве случаев никогда не меняется.
Microsurface (шероховатость/микрорельеф/глянцевость поверхности). Этот параметр указывает, насколько гладкой или шероховатой является поверхность вашего материала.
Очень часто новички путают Reflectivity и Microsurface, потому что им кажется, что если отражения чёткие, то материал отражает хорошо, а если размытые, то материал отражает плохо, хотя процент отражений никак не меняется. Гладкие поверхности просто отражают свет под правильными углами, а матовые — с большим количеством искажений.
Антон Агеев
Пример влияния рельефа на отражения
В работе с Microsurface тоже лучше избегать крайних значений. Для большинства материалов корректным диапазоном будет 0,1-0,9.
Пайплайны материалов
Существует два основных пайплайна, которые основаны на базовых параметрах: Specular/Gloss и Metallic/Roughness. Под пайплайном здесь имеется в виду не порядок действий при работе, а набор текстур материала.
Specular/Gloss. В этом пайплайне используется три основных текстуры: Diffuse, Specular и Glossiness.
С одной стороны, это простой для понимания пайплайн, с другой — сложный для настройки.
Антон Агеев
Параметр Diffuse отвечает за силу и цвет диффузных отражений. Specular — за силу и цвет зеркальных. Проверить правильность этого параметра относительно материала можно с помощью специальных таблиц, где за Specular отвечает цвет напротив буквы S. А параметр Glossiness отвечает за то насколько гладкая и шероховатая поверхность материала.
Калибровочная таблица от Quixel
Metallic/Roughness. Этот пайплайн, по словам Антона, сложнее для понимания, но проще для применения. За параметр Albedo в нём отвечает текстура BaseColor, за Reflectivity отвечает Metallic, а за Microsurface — текстура Roughness. Условно, Roughness и Glossiness — это инвертированные текстуры, то есть низкое значение первой соответствует высокому значению второй и наоборот.
Когда параметр Metallic равен 1, то текстура BaseColor отвечает за отражающую способность материала и работает аналогично параметру Specular из Specular/Gloss. Если же он равен 0, то BaseColor отвечает за силу и цвет диффузных отражений, то есть материал отражает свет как диэлектрик.
В данной системе мы не можем настроить числовое значение отражающей способности для диэлектриков, потому что, когда BaseColor отвечает за диффузное отражение, нет «крутилки», которая отвечает за процент отражения. Но на глаз отличить разницу этого показателя у диэлектрика сложно, поэтому в пайплайне отказались от этой настройки в угоду оптимизации — отражающая сила в нём заблокирована на 4% и её нельзя изменить.
Антон Агеев
Также, по словам Антона, многие считают, что Metallic не может быть равен промежуточному значению, но на самом деле «лок» на 0 или 1 обычно продиктован техническими ограничениями.
Правильность выставленных параметров в Substance Painter можно отследить с помощью фильтра PBR Validate. Его нужно применить поверх всего, что есть в документе — тогда некорректные с физической точки зрения зоны будут окрашены в красный цвет.
Разнообразие текстур. Часть 1: пятна в color channel и roughness channel
Что делает текстуру красивой? Чем отличаются реалистичные материалы от неестественных? Мы продолжаем разбирать основные шаги на пути к созданию качественных текстур ААА-уровня, поговорим о паттернах, контрасте, об основных ошибках при текстурировании, а в конце оставим ссылку на чеклист для проверки своих материалов.
В прошлой статье мы остановились на том, что разбили модель по базовым цветам. Теперь мы понимаем, где и с чем нужно работать.
Приступим к проработке детализации: начнем с создания дополнительных оттенков. Если посмотреть на любой предмет и проанализировать его цвет, можно заметить, что материалов с монотонной цветовой заливкой практически не существует.
Кирпич издалека кажется оранжевым, но, если присмотреться, видно, что цветовая палитра богаче. Где-то он чернее, где-то светлее, где-то более насыщенный, а где-то менее. Соответственно, мы не можем использовать в работе только один цвет.
На шлеме это не настолько заметно, но всё равно прослеживается.
Итак, сам процесс работы следующий — добавляем один оттенок темнее базового, и один светлее, для наложения используем маску. Более светлым оттенком можно окрасить углы, а стыки — затемнить. Комбинация интересной гранжи и заливочной маски поможет создать хаотичные пятна по всему шлему. Заливочный слой, в отличии от генераторов, работает без привязки к запеченным ранее картам и добавляет детали случайным образом.
При выборе гранжей ориентируйся по названиям. Обычно по имени становится ясно, для чего карта подойдет лучше всего. Осознанно выбирай паттерны для нанесения — лучше потратить несколько минут, перебирая варианты, и найти самый подходящий, чем юзать первый попавшийся на глаза.
Гранжи, как и остальные материалы в Substance Painter, можно создавать/покупать и добавлять отдельно к базовой библиотеке. Полистай Gumroad и Artstation перед началом работы — вдруг там найдутся интересные паттерны грязи, ржавчины или подтеков.
Говоря о разнообразии оттенков, иногда можно добавлять неочевидные цветовые пятна. К примеру, на синем мусорном баке можно нарисовать красные/коричневые/желтые подтеки. Они могли появиться из-за разлитой краски или протекшего мусорного мешка. Главное — не переборщить. Такие элементы должны не бросаться в глаза, а играть роль легких отсылок, которые дополняют идею, не забирая на себя внимание зрителя. Не забывай и о разнообразии в roughness канале. Старайся поддерживать цветовые пятна с помощью бликов. Если на пластик попала какая-то грязь, свет будет отражаться иначе, чем от чистой поверхности. Итак, с оттенками разобрались. О следах износа и уникальных пятнах мы расскажем в следующей статье. Stay tuned.
Финальный вариант шлема: https://www.artstation.com/artwork/OoGwGv
Хочешь получить бесплатный урок курса «3D PRO. Game Environment Pipelines»? Оставляй заявку: https://render.ru/ru/course/19296
400 0 850 4
Мда. это статья или туториал? Как по мне, по информативности не тянет ни на то, ни на другое. Отбросив лишнюю воду и рассказ про артстейшн с его штампами, остаётся: «в реальном мире цвет не монотонен на всех обьектах. Надо варьировать. Тёмненьким в углах и швах, светленьким на гранях. Но можно поиграться и на ровных плоскостях» Всёёёё. А о роухнесс вообще шикарно, вся информация по этой тем это «И не забывайте о рохнес». Просто какой-то бомбинг этими недотуторами, которые по хорошему можно было штук по 20 объединить в один и получился бы среднестатистический материал как из нулевых. У меня где-то урок валялся, по шейдингу в Вирей по фотореференсу. Там человек полтора часа только про плавность блика объяснял, и как кривыми подгонять под фотореф. Но вы не забывайте про рохнес, ребята)
Как сделать текстуру roughness
В этой статье мы разберемся, как настраивать материалы в короне (которая рендер, а не болезнь ♂️). Никаких сложных материалов и карт я сейчас показывать не буду — перенесем это в отдельные посты.
Материалы — одна из тех сложных тем, которую легче понять самому, чем объяснить кому-нибудь, но я попробую (а раньше, во времена v-ray вообще жопа была с материалами).
Вот небольшая навигация по посту:
- Что такое PBR
- Настраиваем кирпич
- Что значат отдельные параметры материалов
- Развертки
- Готовые материалы
После обновления Corona Render до версии 7, появился новый материал — CoronaPhysicalMtl. Логика его настройки несколько меняется.
Далее в тексте вся информация представлена о CoronaLegaсyMtl.
♂️ Что такое PBR и вообще
Сейчас в большинстве рендер-движков используется принцип PBR, что это такое читаем здесь, а для тех кто прям закопаться хочет — здесь и здесь. Если кратко — это набор картинок, которые указывают, где свет на модели должен сильнее отражаться (прям вам в глаз). Ещё этот набор не обязательно должен состоять из изображений, это могут быть числовые значения и параметрические карты.

Обычно набор карт такой:
- Diffuse — задаёт цвет объекта, на карте не должно быть теней и бликов (карта только про цвет);
- Reflection — задаёт, силу отражений на объекте;
- Reflection Glossiness — задаёт шероховатость обьекта и, следовательно, степень размытости отражений;
- Bump и/или Normal — добавляет мелкие рельефные детали, но не изменяет геометрию модели;
- Displacement — добавляет рельефные детали и изменяет геометрию модели — это карта высот, указывающая где объект будет больше выпирать относительно своего первоначального состояния;
Настраиваем материал кирпича
Если вы хотите настроить материал какой-нибудь другой поверхности — без проблем, просто скачайте себе другие текстуры с любого сайта или сборника, процесс не будет сильно отличаться. Например, на сайте texturehaven.com полно бесплатных текстур разных поверхностей.
Первым делом идём и скачиваем набор карт для материала кирпича, например здесь. Все карты нам не нужны, достаточно скачать Diffuse, Displacement, Normal и Roughness.

Все доступные материалы и карты можно создать несколькими способами:

- Нажать правой кнопкой мыши в области редактирования материалов;
- Вытащить из столбика слева;
- Вытащить из слота материала (кружочек на плашке материала).
Теперь открываем окно настройки материалов в максе (можно просто нажать “M” на клавиатуре) и создаём пустой материал CoronaMtl перетаскиванием его из списка доступных в область редактирования (ищем во вкладке Materials, в подвкладке Corona).

Ок. Материал создали, теперь нужно провести небольшую первоначальную настройку материала — включить отражения. Хз почему, но почему то в CoronaMtl они выключены по-умолчанию. Просто крутим параметр Reflection level на 1,0.

Далее нужно подключить текстуры, которые мы скачали ранее, к материалу. Добавляем текстуры — создаём карту CoronaBitmap и указываем путь к текстуре (ищем CoronaBitmap во вкладке Maps, в подвкладке Corona). Можно использовать и обычный Bitmap, но разработчики короны говорят, что их карта работает лучше и быстрее, да и крутилок там побольше на будущее.

Теперь присоединяем карты в нужные слоты материала — тянем от кружочка карты линию до кружочка материала.
В слот Diffuse вставляется карта, задающая цвет материала, она может называться Diffuse, Albedo или Base Color. (разные источники по-разному называют текстуры).
В слот Reflection color вставляется карта, задающая силу отражения, она может называться Reflection, Specular, Metallic.
В слот Reflection glossiness вставляется карта, задающая размытость отражений/шероховатость материала. Она может называться Glossines или Roughness. При использовании в короне карты Roughness её нужно инвертировать — добавляем карту Output и ставим галочку “Invert” или отмечаем эту же галочку в настройках самой CoronaBitmap.
Инверсия нужна для правильной работы карты — дело в том, что Roughness задаёт шероховатости на поверхности объекта и её логика в том, что чем белее карта, тем более шероховатая должна быть область; а принцип карты reflection и reflection glossines заключается в том, что чем белее карта/цвет, тем больше света отражается от объекта в этом месте и тем более четкое отражение должно быть соответственно (глянцевость крч.). А т.к. шероховатость это противоположность глянцевости нужно карту инвертировать. (Поэтому если вы скачаете где-нибудь карту Glossines или Specular — инвертировать не нужно будет, всё уже ок.)
Если у вас одна карта, отвечающая за отражения, можно попробовать вставить её и в слот Reflection color и в слот Reflection glossiness.
В слот Bump вставляется карта, задающая плоский рельеф материала. Она может называться Bump или Normal (или может быть сразу оба варианта). Карта Normal должна быть подключена в слот Bump через еще одну карту — CoronaNormal с включенной галочкой “Add gamma to input”. В слот Additional bump можно вставить карту Bump, если она у вас есть.
В слот Displacement вставляется карта, задающая настоящий, объемный рельеф. Она может называться Displacement или Height.

Если мы посмотрим, что у нас получается, то увидим, что кирпич какой-то плоский. Т.е. рельеф вроде-бы есть, но он как на стрёмных обоях из двухтысячных с текстурой кирпича. Чтобы исправить это крутим до приемлемого значения параметр “Max level” в разделе “Displacement” настроек материала.

Получился норм кирпич.
♂️ А можно ли сделать материал, не используя текстуры?
Всё, что мы делали выше, получилось легко и просто, благодаря тому, что все нужные карты у нас уже были. А что делать, если нужно настроить какой-нибудь простенький материал без текстур, чтоб просто был определенного цвета и блестел/не блестел так, как нам нужно? А для всего этого нужно задать определенные циферки в настройках материала! Давайте разбираться, какие цифры на что влияют.

Далее рассмотрим каждый параметр отдельно
Цвет объекта
Diffuse — влияет на цвет объекта. Можно вставить карту или просто настроить цвет. А можно вообще выключить, указав 0,0 в разделе Diffuse level (обычно ноль задают у металлов и стекла).

А что делать, если текстура, которую вы скачали, в одном цвете, а вам нужно покрасить его в другой или обесцветить? Если вы не хотите открывать ФШ или хотите сразу видеть результат, можно сделать это прям в максе и есть несколько способов. Давайте рассмотрим на примере материала ткани т.к. у них обычно сложный Diffuse и у них чаще всего меняют цвет.
Способ 1. Подключаем карту Diffuse через еще одну карту Color Corretion и крутим параметр Hue Shift для изменения оттенка и другие параметры для изменения яркости/контрастности.

Способ 2. Обесцвечиваем исходную карту Diffuse и красим её в любой цвет. Для этого оставляем Color Correction как в первом способе, но выкручиваем Saturation на -100 (если карта стала слишком темной, то можно еще увеличить Brightness) и добавляем еще две карты как на скриншоте снизу — RGB Multiply и CoronaColor. В CoronaColor задаём нужный цвет и всё!

Также важно отметить, что не бывает абсолютно белого и абсолютно черного цвета. Для черных объектов рекомендую минимальный уровень RGB = 5, а для белых максимальный RGB = 150-180.
Отражения
Reflection level — влияет на силу отражения, можно просто задать число от 0 до 1 и в дополнение к нему вставить карту или цвет — чем белее, тем больше отражает.
Если в этот слот вставить карту с цветом, то отражение будет иметь оттенок, обычно это используется для настройки материалов цветных металлов (золото, медь и т.д.).

Reflection glossiness — влияет на размытость изображения, можно вставить карту или просто настроить число от 0 до 1 — чем белее, тем более четкое будет отражение.

Reflection Frensel IOR — также влияет на силу отражения — чем больше число, тем сильнее отражение. В большинстве случаев оставляем как есть, можно увеличивать в металлических материалах и материале зеркала.

Преломление и прозрачность
Refraction level — используется для создания стеклянных материалов, материалов жидкостей и др. прозрачных материалов. Это не просто прозрачность — это степень преломления света материалом. Если наложить материал с refraction level = 1 на сферу, то свет, проходя через неё, будет менять свое направление.

Refraction glossiness — влияет на размытость проходящего через материал света — чем меньше число (или чем чернее карта), тем мутнее будут внутренности материала.

Refraction IOR — коэффициент преломления света — влияет на степень искажения света, при преломлении внутри объекта.

Opacity — обычная прозрачность объекта. Чем белее карта (или ближе к 1 число), тем более непрозрачным будет объект.

Рельеф
Displacement — как мы выяснили выше, эта функция выдавливает настоящую геометрию из объекта, может сделать плоскую стену объемной. Min level задает минимальное отклонение от изначальных границ объекта (это насколько выдавятся черные части карты, которую вы засунете в слот displacement), max level задает максимальное отклонение (для белых частей карты displacement).
Очень ресурсоёмкая функция, сильно увеличивает время рендера. Не используйте её где попало, используйте только когда прям действительно нужно.

Bump — карта, которая создаёт рельеф на поверхности объекта, не меняя его геометрию. По-сравнению с displacement эта карта создаёт только видимость рельефа, на самом деле никакие дополнительные полигоны не создаются и не выдавливаются, много ресурсов не использует и не замедляет рендер.
В слот bump можно вставлять карты в оттенках серого, где черный цвет — наибольшее заглубление рельефа, а белый — выпирание соответственно. Также сюда можно вставлять специальные карты нормалей с помощью CoronaNormal, как мы рассматривали на примере материала кирпича.
Силу бампа можно задать цифрой от 0 до 100 в соответствующем разделе в самом низу настроек материала.

Вы, наверное, заметили, что в настройках материала есть еще куча всяких параметров. О некоторых из них я расскажу в будущих постах.
Размер текстуры / UVW mapping / Развертка
Выше мы рассмотрели настройки материалов и какие текстуры в какой слот нужно кидать, но есть еще один не менее важный аспект — макс должен как то понять, куда должна ложиться текстура на объекте и какого размера она должна быть.
Представим, что вы замоделили некий объект, наложили на него материал дерева, включили рендер и… Получилась какая-то хрень:

Для решения этого вопроса существует такая вещь как развертка. Грубо говоря, это развернутая на плоскость поверхность 3D-объекта. Развертку можно создавать несколькими, различающимися по точности способами.
Способ 1 (самый простой). Наложить на объект модификатор UVW Map с параметром “Mapping” — Box и задать размер текстуры в единицах измерения вашего проекта.

Если после наложения модификатора текстура ориентирована не в ту сторону, в которую вам нужно (обычно такое бывает именно с материалом дерева), модификатор можно повернуть так, как вам нужно — выбираем во вкладке модификатора Gizmo и крутим.

Если вам нужно повернуть ориентацию древесных волокон на какой-то отдельной части объекта (а такое тоже часто бывает, например, при моделировании корпусной мебели) — накладываете модификатор Edit Poly, выбираете в нём нужные части объекта.

Далее, не снимая выделения, накладываем еще один модификатор — UVW Xform. В параметрах модификатора задаём “Rotation” = 90. Таким образом мы повернули текстуру на выделенных элементах объекта на 90 градусов.

В этом способе размер текстуры задаётся в параметрах модификатора UVW Map.
Способ 2. Второй способ почти идентичен первому. Единственное отличие — размер текстуры будет задаваться в самой текстуре, а не модификаторе UVW Map. У такого варианта есть свои преимущества — например, если у вас на один объект наложено несколько материалов (например на стенах в интерьере такое часто бывает) — при использовании этого способа удобнее будет настраивать размер текстур.
Просто на этапе наложения модификатора UVW Map жмем галочку “Real-World Map Size”. А размер текстуры настраиваем в параметрах самой текстуры CoronaBitmap (тоже нажав там галочку “Real-World Map Size”.

В итоге получается то-же самое, что и в первом способе, просто так удобнее управлять размером текстур в объекте с разными материалами на нескольких элементах.
Способ 3. Подключить текстуру через карту CoronaTriplanar. Помогает в тех случаях, когда нужно наложить абстрактную текстуру на объект без развертки. Работает без каких-либо модификаторов. Крутить ориентацию текстуры на отдельных элементах неудобно (нужно создавать отдельный материал).

Способ 4. Сделать развертку модели, но это уже тема для отдельного поста ♂️.
♂️ Готовые материалы

Если вы дочитали до этой части поста (вау, эти посты кто-то читает!) и вы всё равно-не понимаете/нет времени, как настроить нужный материал, у меня для вас хорошая новость — в короне есть большая встроенная библиотека материалов с удобными превью.

Просто открываете библиотеку, выбираете нужный материал, перетаскиваете его в область редактирования или сразу на объект.

Только там есть не все нужные материалы, иногда всё-таки нужно настраивать что-то самому.
Если хотите глубже разобраться, попробуйте посмотреть какие-нибудь видеоуроки. Например этот. Еще очень помогает почитать официальную документацию, но она на английском языке.
Текстурирование, или что нужно знать, чтобы стать Художником по поверхностям. Часть 3. PBR и материалы
В прошлой части тутора мы разобрали принцип работы масок, что такое «текстура», и что абсолютно для всего используются каналы — параметры пикселя. Теперь рассмотрим всеми любимый PBR И соберем текстуры для создания мокрого грязного асфальта.
В этом уроке я буду очень много ссылаться на другие туторы и источники информации, чтобы максимально сократить объем самого тутора. Большая часть ссылок будет предоставлена в начале тутора, поэтому, если вы не понимаете чего-то из этого тутора — перейдите по ссылкам и почитайте информацию там. Когда будете готовы — возвращайтесь к тутору и продолжайте познавать азы художника по поверхностям. Если какие-то ссылки будут не доступны, пжлста, сообщите мне об этом в личку или в комментариях. Я обязательно поправлю это недоразумение.
Также, если что-то совсем будет не понятно — очень прошу сообщить об этом, чтобы я мог раскрыть эту тему более подробно.
Часть 1. Пиксель здесь
Часть 2. Маски и текстуры здесь
Часть 3. PBR и Материалы — вы ее читаете.
Часть 4. Модели, нормали и развертка здесь.
Часть 5. Система материалов здесь.
PBR
Расшифровывается эта аббревиатура так: Physically Based Rendering. Что в переводе значит «Основанный на физике рендер».
Как мы все знаем, мы не могли бы видеть ни один объект, если бы объекты не отражали свет, который на них падает. Все это работает очень просто — луч света падает на стол, отражается и попадает вам на сетчатку глаза.
В зависимости от поверхности, от ее состояния (отражает ли оно, как зеркало, или имеет шероховатость, есть ли капли грязи / воды / кофе на поверхности) вам в глаз приходит уже видоизмененный луч (скажем так). Причем, луч — это не совсем правильно, так как уже известно, что свет — это еще и волна. Но это уже слишком глубоко для нас, и здесь я могу ошибаться.
А суть остается неизменной — то, как мы видим объекты, выстраивается из того, как свет отражается от поверхности. И стандарт PBR описывает то, какие параметры должны учитываться, чтобы свет выглядел максимально кинематографично.
Расписывать о том, по каким правилам конструируется свет, как он отражается и отражается ли вообще, я не стану. Про то, как работает на уровне физики свет есть куча статей:
- Статья по основам от создателей Substance Painter / Designer здесь. И ее перевод от 2015 года здесь . Ссылка на вторую часть перевода есть на той же странице.
- Статья от Google по их разработке PBR (те же яйки, только в профиль с другими формулами) здесь.
- Статья от MrShoor, который рассмотрел PBR на низкоуровневом программировании шейдеров здесь.
Параметры. Или как настраивается PBR.
Мы рассмотрим PBR с точки зрения общей концепции и на уровне работы с каждым параметром отдельно через каналы пикселей.
Из прошлой части тутора помним, что PBR на самом деле создается через суммирование параметров (вдаваться в формулы не стоит). То есть, PBR состоит из набора параметров:
- Color (Base Color / Albedo).
- Metallic.
- Specular.
- Roughness.
- Glossiness.
- Ambient Occlusion (далее AO).
- Height.
- Normal map.
- Color использует 3 канала — RGB, чтобы формировать цвет пикселя.
- Normal map использует 3 канала, чтобы сымитировать наклон поверхности. Каждый канал отвечает за наклон по вертикали, горизонтали и глубину соответственно.
Оффтоп. Normal Map.
Что касается Normal Map, то ее техническая реализация (какие каналы за какой наклон отвечают) разнится от настроек рендера. Так, например, в Unreal Engine 4 Зеленый канал отвечает за отрицательное значение наклона по вертикали, а в Unity за положительное.
Более подробную информацию можно прочитать здесь.
Еще есть огромная всеобъемлющая статья о том, как запекать Normal Map и как с ней вообще работать, на сайте render.ru здесь.
Ссылка на форум обсуждения карт нормалей и высот (параметр Height) здесь.
И википедийное описание рельефного текстурирования здесь.
Теперь стоит отметить, что рендер (отображение), основанный на физике, имеет несколько различных реализаций. Все они схожи между собой и пользуются все теми же каналами пикселей для корректировки конечного результата. Обычно разделяют 2 типа реализации:

В первом типе учитываются параметры Color-Metal-Roughness, во втором — Diffuse-Specular-Glossiness.
Оба типа реализации используют одинаково 3 параметра — АО, Normal map, Height.
Оффтоп о том, какой стандарт будем использовать мы
Мы будем использовать первый вариант, так как в дальнейшем перенесем наше обучение на Unreal Engine 4, а этот движок использует первый вариант комбинаций + имеет дополнительно параметр Specular, что лишний раз показывает, что PBR — это условность.
Причем, в современном PBR параметр Height (высота) смешивается и прячется в Normal Map. По факту, проще выразить неровность через одну карту Normal Map, чем высчитывать еще и глубину/высоту пикселя, или что-то еще в дополнительных каналах. Все проще, чем кажется, и мудрить с десятками параметров лучше не стоит.
Хотя при создании текстур в Substance Painter параметр Height и вынесен отдельно, при запекании текстур он вшивается в карту нормали (все еще можно его выделить в отдельный канал, если захотеть).

Итого, конечный результат картинки состоит из наложения параметров в одном пикселе:

Давайте рассмотрим теперь то, как это работает в Substance Painter. Для этого мы снова создаем новый проект с обычным плейном и стандартными настройками (о них я рассказывал во второй части туторов). И создадим новый слой заливки:

Теперь рассмотрим стандартную текстуру нормалей из набора Substance Painter «Niche Rectangle Top Wide», которая располагается под тегом Hard Surface:

Далее мы перенесем эту карту нормалей в параметр слоя Base Color (из предыдущего урока мы должны помнить, как это делать). Так выглядит карта нормалей, если воспринимать ее, как изображение (изображение выше). Но теперь удалим ее из параметра BaseColor (мы это сделали для общего ознакомления), нажав на крестик в параметре:

И перенесем ее в параметр Normal:
Ваш конечный результат сразу обновился. Теперь, если зажать Alt и ЛКМ — можно крутить камерой и смотреть на плейн под разными углами. Свет, отраженный от пикселей, начнет переливаться, создавая иллюзию глубины. Как будто на плейне действительно есть какие-то впадины и выпуклости. Все это заметно под углом от 90 до 140-150 градусов. И чем больше угол наклона, тем больше становится понятно, что это расчет видеокарты, который определяет, как должен отражать свет каждый пиксель, чтобы создавать эту иллюзию. В качестве исходных значений мы передаем в видеокарту 3 параметра в виде каналов пикселя (иначе говоря, текстуру Normal map):

Теперь давайте извращаться. Удалим из параметра Normal эту карту и укажем ее в канале Metallic. Канал у Metallic один, а карта нормалей имеет 3 канала, соответственно, вставляя карту нормалей в этот параметр, Substance Painter обрежет 2 лишних канала (предполагаю, что GB) и оставит только один для расчетов:


В конечном результате видно теперь, что больше нет никаких выпуклостей и впадин, но сама поверхность стала походить на какую-то металлическую плату. Вы так же можете посмотреть, как будет выглядеть параметр Metallic один, без остальных параметров (BaseColor и прочих), переключив режим отображения на 1 канал Metallic (если вы ничего не меняли, то во вьюпорте справа сверху есть возможность переключения отображения):

Выбираем металлик и получаем следующий результат:

Как видим, это один канал в градациях серого, который определяет, какие пиксели должны выглядеть как металл, какие — как нечто среднее, а какие — не металл. 0 — не металлический. 1 — металлический.
Аналогично и с каналом Roughness — любая текстура подойдет для работы с ним. В зависит от того, какой конечный результат вам потребуется. Можете попробовать самостоятельно воткнуть в канал Roughness любую доступную вам текстуру и посмотреть на результат.
Сложные материалы
Под словом «материал», обычно подразумевается коллекция готовых параметров, совокупность которых дает кинематографичный результат — материал (иначе говоря, фактуру, поверхность).
Возьмем, к примеру, вот это кожаное кресло:

Визуально, кресло состоит из 3 материалов:
- Кожа.
- Металлические клепки.
- Пластиковые (возможно, деревянные) ножки.
- Color. (например, кожа — это близкий к черному цвет с крапинками трещин, а клепки — это золотистый цвет с какими-то пятнами грязи ).
- Metallic (в коже практически равен 0, а в клепках близок к 1).
- Roughness (в коже он ближе к 1, а в клепках ближе к 0).
- Normal Map (В коже карта нормалей отображает трещинки и их глубину, а в клепках — технические углубления/выступления).
- AO (в коже будет отображать корректность затенения трещин, а в клепках — углублений).

Подведем промежуточный итог:
Сейчас мы знаем:
- Принцип работы PBR. И как им управлять через каналы.
- Как работают все параметры, и как мы можем на них влиять через текстуры.
- Принцип построения сложных материалов.
- Как смешивать материалы с помощью масок.
Практика
А что нам нужно для того, чтобы собрать мокрый грязный асфальт со следами шин?
Для начала нам нужно определиться с количеством материалов, которые будут использоваться в нашем туторе:
- Асфальт.
- Грязь.
- Следы шин (проще говоря, резина).
Где брать материалы?
Встал вопрос — где брать эти материалы? Можно немного помучиться и создать коллекцию параметров для каждого материала вручную. Например, найти изображение асфальта. Обрезать его до квадрата и сделать его в качестве BaseColor. Потом, через специальные программы (например, xNormal) по этому изображению создать карту нормали. Через карту нормали отрегулировать Metallic и Roughness (можно и по BaseColor). В итоге, потратить несколько часов на создание идеального материала асфальта, выверяя корректные параметры для металла и шероховатости.
А можно сделать все проще.
Как я уже сказал выше, большинство материалов уже заготовлены давно за вас. Ваша задача лишь найти готовые решения, которые отвечают вашим требованиям, скачать их и установить. Если вы пользуетесь Substance Painter, то у компании allegorithmic (теперь уже у Adobe) есть специализированное хранилище готовых материалов, которые можно скачать. Доступ к ним есть как платный, так и бесплатный.
Если вы пользуетесь Quixel, то в этой программе уже заложены сотни различных материалов, и вам достаточно лишь указать их и начать работать с масками. Что, кстати, очень удобно для новичков, поэтому, если вы только начали осваивать текстурирование и еще не готовы работать с генерацией материалов — рекомендую начать с Quixel. Принцип тот же, другая обертка. Туторы по программе есть в интернете.
Вот здесь (Ссылка) можно скачать текстуры для материалов, которые мы будем использовать в нашей практике.
Наша цель сейчас не создавать очень качественные текстуры, а познакомиться с тем, как можно с помощью параметров PBR и масок создать нечто интересное. Поэтому на данном этапе мы не будем пользоваться генераторами масок или грязи, а все будем делать вручную, чтобы понять суть. Когда вы понимаете суть, основу всего этого, вы сможете пользоваться генераторами куда более качественно, чем просто начнете их выкручивать в надежде получить идеальную маску / материал.
Если вы уже посмотрели файлы, то, наверное, обратили внимание на маску для шин. Она подготовлена отдельно, так как я не смогу ее сгенерировать на ходу в Substance Painter, поэтому я воспользовался рисунком шин, найденным в интернете и подготовил его через Photoshop для работы в Substance Painter:

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

В проекте создадим 3 папки под каждый материал и проименуем их, чтобы не путаться:

В нашем случае очень важна иерархия папок (да и не только в нашем, а всегда важна). Иерархия определяет уровень материала, иначе говоря — что на чем лежит. Асфальт в нашем примере — это дно. На нем остаются следы от шин. А вот грязь может быть и на следах шин, и на асфальте. Поэтому грязь будет выше всех.
Теперь давайте сразу спрячем все, что должно быть спрятано, и оставим только асфальт. То есть, создадим черные маски на папках Rubber и Dirt:

Теперь создадим в каждой папке по 1-ому слою. А точнее, создадим слои и распределим их в папки. Не забываем о нейминге, чтобы потом не путаться (не смотря на то, что визуально не совсем понятно, что слои в папках — поверьте, они в папках):

Все новые слои имеют базовые средние параметры. Поэтому Base Color серый, нормаль не отображает выпуклостей, а Metallic и Roughness не создают впечатления какого-либо материала.
И сейчас нам нужно это исправить, указав в каждый параметр соответствующую текстуру (на примере асфальта):

Ваша задача сейчас распределить все текстуры материалов в нужные параметры слоев. После того, как вы все это проделаете, назначим маску для резины и создадим эффект следов. Так как у нас уже есть черная маска у папки, то нам нужно просто подключить файл со следами колесиков к этой маске. Для этого кликаем ПКМ по маске и выбираем Add Fill:

И в параметрах GrayScale указываем маску:

В результате на асфальте появятся следы резины, но их будет достаточно сложно разглядеть, так как это все таки PBR и кинематографичность (. ). Чтобы их увидеть, нужно Plane повернуть под определенным углом:

Сейчас эти два слоя (асфальт и резина) находятся на одном уровне. Но мы-то знаем, что резина находится НА асфальте, а значит, слой с резиной должен быть физически выше. И вот теперь мы воспользуемся тем самым параметром Height.
Найдите его в параметрах слоя Rubber и выкрутите его на максимум, чтобы прочувствовать, как он работает. Покрутите камерой, чтобы увидеть, как свет начал обрабатывать пиксели, которые вы настроили своими руками. Прочувствуйте свою мощь! =)
Ну а теперь выровняйте параметр на 0.1, чтобы это было не так явно и более правдоподобно:

Мы могли бы выкрутить в -0.1, чтобы у нас проявились ямки, как после машин на грязи, но это асфальт, и он не проваливается так легко.
Теперь настроим грязь. Исходя из реальности, можно предположить, что грязь должна забиваться в трещины асфальта в первую очередь. Но у нас нет маски, чтобы мы могли проявить слой грязи в трещинах. Однако решение есть — мы можем взять BaseColor асфальта и на его основе сделать маску для грязи.
Как это работает? Если посмотреть на BaseColor асфальта, то можно обратить внимание, что чем темнее пиксель, тем больше он похож на трещину. То есть, в этом изображении все темное — это трещины, а все светлое — это поверхность. И если мы хотим воспользоваться изображением, как маской, то нам достаточно было бы инвертировать цвета (темное сделать светлым и наоборот) пикселей, и у нас получилась маска для грязи.
Для этого отключим отображение слоя с асфальтом (нажав на глазик у папки с асфальтом), чтобы было проще воспринимать то, что мы делаем.
Далее, укажем, что в маске грязи должен быть файл и присоединим к ней файл Asphalt_BaseColor:

Как я и писал выше — светлым был асфальт, а темным — трещины. Соответственно, на больших поверхностях начала проявляться грязь, а в трещинах доминирует базовый серый цвет (базовые параметры / фон).
Теперь наша задача заставить эту текстуру восприниматься иначе — инвертировать цвета и усилить их, чтобы маска проявила грязь в трещинах. Проще всего это сделать с помощью дополнительного эффекта «Уровни» (Levels). Добавляем к маске дополнительный фильтр «Levels» так же, как мы добавляли Fill (ПКМ — Add Levels). И выкручиваем параметры примерно, как на картинке ниже:

И нажимаем на кнопку ниже «Invert» для инвертирования уровней интенсивности канала:

Теперь грязь располагается именно там, где нам нужно — в трещинах асфальта:

Включаем асфальт и присматриваемся к нашим трудам:

Но это слишком просто. Поэтому, давайте теперь добавим на наш асфальт оранжевую разметку. Для этого нам необходимо будет:

- Создать новую папку и назвать ее Road_Line.
- Добавить черную маску папке.
- Добавить в папку новый слой и назвать его Layer_RoadLine.
- У слоя в параметрах BaseColor указать оранжевый цвет напрямую:
Вы так же можете отрегулировать параметры Metallic и Roughness на свой вкус, чтобы создать реалистичную краску. Я не стал этого делать, чтобы сократить время тутора.
Теперь, вспоминая правила иерархии слоев, расположим папку с дорожной линией между асфальтом и резиной:

Настало время ручного рисования. Выделите маску папки RoadLine и начертите на плейне полосу разметки. У меня получился примерно такой результат:

Теперь стоит добавить еще одну маску на сам слой с краской, чтобы создать ощущение отвалившейся краски. Для этого мы не будем создавать папку, а создадим маску прямо на слое и добавим любую стандартную маску Substance Painter. Чтобы сделать это — добавьте маску, а потом добавьте заливку (ПКМ по маске и Add Fill). В заливке укажите Текстуру Dirt 4, которая находится под тегом Procedural:

И смотрим результат:

Не забываем, что у слоя с краской нужно указать высоту. Предлагаю указать 0.05 — среднее между резиной и асфальтом.
Будьте внимательны, так как для этого нужно выделить именно слой, а не маску. Указать вручную значение можно, кликнув по цифре справа сверху от ползунка.
Ну и какой асфальт без воды?
Для этого создайте самостоятельно папку вместе со слоем. Пока НЕ добавляйте никаких масок.
Установите папку в иерархии на самый верх. Ведь вода же сверху, правильно? У слоя выкрутите на максимум Metallic и на минимум Roughness. Далее укажите высоту воды, равную 0.15.
И теперь отключите канал Color, нажав на кнопку, выделенную синей рамочкой:

Что произошло? Произошло смешение все нижних слоев согласно маскам и слоя с водой. Но у воды теперь нет канала цвета, а значит, она не может красить в нужные ей цвета пиксели. За то все другие каналы влияют на пиксели текстуры, и асфальт стал максимально мокрым и неприятным, как будто и вовсе не асфальт =)

Теперь домашнее задание: наложите маски так, чтобы асфальт был не полностью мокрым, а с небольшими лужами. Помните, что лужи не имеют неровностей на поверхности — подумайте, как нужно смешать слои так, чтобы лужи были гладкими. И что для этого нужно еще сделать? Я уверен, вы справитесь =)
В этом туторе мы разобрали то, как создавать текстуры. В целом, правильно применяя параметры, вы уже можете начинать текстурировать и даже смело можете назвать себя джуниор-художником по текстурам.
Мы узнали, как работает PBR.
Параметры в PBR необязательно должны быть уникальны. Это все еще обычные параметры, которые мы можем указывать через каналы пикселей.
Одни и те же текстуры мы можем использовать по разному. Это дает нам преимущество — нам не нужно загружать память лишними файлами с большим количеством пикселей, а достаточно загрузить один файл и подсказать программе, как его рассчитать.
Мы познакомились с материалами и тем, как они собираются. Теперь вы знаете, что не обязательно быть супер-крутым фотошоп-мастером, а достаточно найти готовые параметры, чтобы программа смогла из них представить корректно материал.
В следующих частях мы затронем такие темы, как развертка, плотность текселя (и что такое тексель), и подойдем, наконец, к самому интересному — созданию собственных шейдеров в UE4.
Программы Quixel и Substance Painter
Я всегда рекомендую новичкам, которые занимаются именно созданием текстур из материалов (не самих материалов), начать работать с Quixel. Поскольку эта программа умеет уже сотню готовых пресетов, которые очень легко контролируются и настраиваются, а через маски можно добиваться того же результата, что и у нас на практике через Substance Painter.
Что касается Substance Painter, то его сила начинает проявляться, когда в работу включается третья программа Substance Designer. Designer позволяет создавать свои материалы путем генерации нужных нам поверхностей. Дизайнер крут тем, что вы можете создать «умные материалы», которые будут иметь настройки внутренних масок, которые будут контролировать количество и качество внутренних материалов. То есть, «умные материалы» в данном случае — это контейнер, который содержит в себе несколько материалов и предустановленные маски, которые регулируются формулами и алгоритмами, которые художник прописывает в Designer.
Потом этот контейнер экспортируется в Painter, где происходит его тонкая настройка. Например, наш мокрый асфальт мы создали в Painter. Но могли бы собрать в Designer и подключить кучу дополнительных настроек, которые бы позволили нам изменять результат налету, в одном месте, а не переключаться среди кучи масок, как в Painter.
О PBR и переводе этой аббревиатуры
Очень часто PBR переводят, как физически корректный рендер. Я же считаю, что здесь важен точный перевод, потому что переводы типа «Физически корректный» в корне не верны, так как рендер в данном случае именно основан на физике, но не обязан быть корректным по отношению к физике. Вы можете сделать металл = 1, и шероховатость, равную 1, и включить дополнительно кучу других параметров, и это уже будет не корректный с точки зрения физики материал, а основанный когда-то на нем и переделанный вами в свой собственный набор параметров. То есть, создавая материалы на основе PBR, вы можете абсолютно полностью игнорировать законы физики и создать материал, который будет уникальным в своем роде.
Например, рисованные в своей стилистике камни. Как физически корректно мы должны отображать выдуманный материал, который не существует в природе?
- Работа с 3D-графикой
- Разработка игр