Как расшифровывается pbr в компьютерной графике

Обновлено: 06.07.2024

Да хватит путать автора. pbr появился изначально для игр и для расчета шейдера в реальном времени. То что корона использует алгоритмы такие же, только для глосси. И что? К чему эти уточнения тут? Только больше запутать можно. Захочет автор копнуть глубже, почитает.

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

Ну не так же. Тот же Energy preservation - это тоже особенность PBR но прикрутили его сильно раньше к тому же вирею например.

Да хватит путать автора. pbr появился изначально для игр и для расчета шейдера в реальном времени. То что корона использует алгоритмы такие же, только для глосси. И что? К чему эти уточнения тут? Только больше запутать можно. Захочет автор копнуть глубже, почитает.

Автор сам себя путает. Он прочитал где-то модную аббревиатуру PBR и впитал что это типа круто и вообще магия и всё теперь будет круто легко и просто, а погуглить нормально инфу про то что это такое откуда взялось и как работает не удосужился.

Может быть глупость напишу, но хочу разобраться, я так понимаю отрендеренную картинку используя pbr материал мне в максе не получить, тогда вообще зачем засунули туда этот директикс шейдер? Напрашивается ответ для того чтобы кинуть этот шейдер в тот же Unreal? Но ведь настроить материал можно и в анриале. В общем зачем засунули эту приблуду для игр в макс, если по факту готового изображения не будет? Тот же Energy preservation - это тоже особенность PBR но прикрутили его сильно раньше к тому же вирею например.

а подскажи хоть один рендерер без сохранения энергии. чтобы при 100% рефракте еще и дуффуз был.

. даже не знаю, стоит ли тут что то писать, или какахами забросают.. Воздержусь, пожалуй.

Если что, Revered и Skorpionchik ближе к правде, чем остальные.

. даже не знаю, стоит ли тут что то писать, или какахами забросают.. Воздержусь, пожалуй. а подскажи хоть один рендерер без сохранения энергии. чтобы при 100% рефракте еще и дуффуз был.

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

.. даже не знаю, стоит ли тут что то писать, или какахами забросают.. Воздержусь, пожалуй.

Да что тут писать, всё разжевано в моем блоге про корону, а до этого ещё кучей людей. Вирей аналогично настраивается - рефлект на максимум, крутим ИОР + глосси.

Сабстанс прекрасно конвертит карты под корону, если юзать не встроенный пресет, а с форума от Dubcat (это тоже есть в блоге). Мой пресловутый щекотун на превью отрендерен короной, в крутилке, естественно - с мармосета - разницы нет ,что металнесс воркфлоу, что короновский.

директикс шейдер - даже не знаю ,что это, и где автор это нашёл)

. а, главное не забывайте черно-белые карты из сабстанса загружать в гамме 1, а не 2,2. Может поэтому кому-то кажется, что сабстанс криво экспортирует?

директикс шейдер - даже не знаю ,что это, и где автор это нашёл)

В максе есть. Он же позволяет моделить для игровых движков, наверное есть оригиналы которые тут же и шейдят :))) Для юнити вроде чёто такое канало.

это рендерер?))) не очень пример.

А ,кстати, в максе ещё есть специальная карта - Substance. В неё можно прям класть шейдер из сабстанс дизайнера. Только я не в курсе чем её рендерить. Скорее всего, айреем, как и в сабстансе.

d97b9a2a7cdcb7631e1bf4301efebca4.jpg

Тут вопще не надо думать куда какую текстуру тыкать.

т.е вся суть pbr в корректном соотношении диффуза и рефлекта, никаких алгоритмов. ни каких алгоритмов - "Energy Conservation (Again)"? вся шумиха вокруг удачного брдф'а. DoCentttt, оно вроде как чем хочешь рендерится и пресеты дефолтные в максе есть.

Сарказм моуд ОН? :))))

Обьективно - да, ща ПБРом модно величать всё любое что обзавелось микрофасетками. Но это как бы. ну мода. По факту пбр это комплекс разных условий.

чем они более точные?) те же текстуры рисованные в тех же слотах.

Сорри, с телефона промазал(

Чёт я вообще не понимаю почему при упоминании pbr все сразу съезжают на реалтайм-движки?

Потому что это реалтайм движок

Если просто PBR это технология представления материала.

PBR материал по сути это несколько текстурных карт Diffuse, Normal , Smootness, Metallnes,AO

PBR представление материалов бывают несколько видов (можете зайти в Substance painter посмотреть)

PBR изначально делался для игр потому как игровому движку легче работать с запеченной текстурой чем в реалтайме обрабатывать сложные шейдерные маневры

Почему сейчас о нем так заговорили . Дело в том что сейчас сильно скакнули технологии VR и все ломанулись не только делать рендеры но и портировать в VR .Что согласитесь круто взять свою комнатку закинуть ее в движек АХАЛАЙ МАХАЛАЙ и ты ходишь внутри комнатри и радуешься что вот оно как живое

Direct X материал так же как и Psically base материал появившийся в 2017 максе не просто так были придуманы. Autodest вовсю продвигает свой движек для VR -Stingray для этого нужно было как то срестить VRay и ему подобные шейдеры с PBR представлением шейдеров . Вообщем эти материалы кривые костыли для их скрещивания

Сразу предвижу вопрос .Что будет если Vray материал с сотрей фаллофов нойзов и еще какой то ерунды кинуть в Stingray . будет ли так же выглядеть. Ответ НЕТ! Кое что будет типа цвета текстурок на каналах отражения и еще кое что , но это все. Вообщем пока сами Vray и Corona не напишут какой то экспортер или еще какую приблуду Бубен можно из рук не выпускать. Вернее даже еще крепче держаться за него.

А да. Vray и т.д запросто проглатывают текстурки от PBR матерала. вот только в своем проекте комнаты вам будет достаточно долго делать эти самые текстуры (долго это от 15 мин) так что скорее всего оно вам нафиг не надо. Если вы конечно не делаете комнату в стиле хоррор с потеками и дырявым полом там субстанс вам в помощ.


Как известно, расшифровка звучит как Physically Based Rendering (англ. Физически обоснованный\корректный рендеринг). В около профессиональной среде PBR тема обросла мифами, суевериями и прочей чепухой, а дискуссии на тематических форумах стали напоминать анекдот:

Чукча приезжает домой из партийной школы в Москве и хвалится другому: — Я узнал! Оказывается, Карл Маркс и Фридрих Энгельс - не муж и жена, а четыре разных человека! Другой ему в ответ: — Это что! Вот я знаю получше - Слава КПСС - ВООБЩЕ НЕ ЧЕЛОВЕК. "

Истоки PBR

Для общей эрудиции достаточно знать следующее, что первые публикации, так или иначе затрагивающие тему PBR, появились 80-х годах. В этих публикациях разбираются алгоритмы для визуализации прозрачных и отражающих поверхностей, алгоритмы трассировки теней: An Improved Illumination Model for Shaded Display

Корнеллский университет


Большой вклад в создание «моста» между реальным миром и виртуальным - внёс Корнеллский университет (Cornell University). На кафедре компьютерной графики которого и по сей день ведутся многочисленные исследования свойств поверхности у реальных материалов, которые потом имплементируются в CG пространстве. Отправной точкой, с которой начинается долгий путь PBR из лабораторий в пользовательский софт, можно считать статью опубликованную группой ученых с кафедры компьютерной графики Корнеллского университета в 1997. В этой работе закладываются основы PBR: A Framework for Realistic Image Synthesis

Термин PBR

Термин PBR в те времена еще не употреблялся. Этот термин был популяризован в книге — Physically Based Rendering. From Theory to Implementation (англ. Физически обоснованный (корректный) рендеринг. От теории к реализации.), впервые изданной в 2004 году. Книга изобилует формулами, примерами, реализациями тех или иных BRDF моделей и возможно будет достаточно скучна на рядовых пользователей, но мой интерес был подогрет тем фактом, что за этот труд авторы Matt Pharr, Greg Humphreys, и Pat Hanrahan получили Оскара в 2014.

Да, да — существует отдельная церемония Оскара, основанная в 1995 году, для научно-технических достижений в области киноиндустрии, на которой награждаются «серые кардиналы» CG индустрии, которых в детстве часто называли - ботан, задрот, кнопкодав и т.д., тремя годами позже Оскара получит и Владимир Койлазов (ака Vlado) разработчик рендер системы V-ray. Уже за свой вклад в развитие CG киноиндустрии.

Относительно недавно (15 октября 2018 года), появилась бесплатная онлайн версия книги. На официальном сайте доступно третье, дополненное издание. В предисловии книги сказано, что в ней есть все, чтобы создать свою физически корректную рендер систему. Бегло пролистав работу мне стало понятно за что был дан Оскар. Без преувеличения можно назвать этот труд библией в мире CG и физически корректного рендеринга. Кому интересно более глубокое погружение – читайте книгу: Physically Based Rendering. From Theory to Implementation

Что важно знать, я имею ввиду пользователя любой актуальной рендер системы, не важно будь это V-ray, Corona, Redshift, Arnold, FStorm – все обозначенные движки, это всего лишь «калькуляторы», которые занимаются вычислением математических задач. Для ускорения вычислений допускается аппроксимация исходных данных (приближение, упрощение) и интерполяция результатов (сглаживание, усреднение) – именно в области оптимизации вычислительных алгоритмов ведутся основные баталии среди рендер систем. В основе же любой рендер системы используются одни и те же формулы, выведенные учеными. Поэтому говорить, что одна рендер система физически корректна, а другая нет — более чем глупо, просто они различаются по алгоритмам и задачам, которые ставили перед собой разработчики софта.

Дак что такое PBR?

PBR это не шейдер и не текстура или какой-то отдельно взятый рендер движок — это в первую очередь принципы и основы современной компьютерной графики, кто-то называет это философией. В любом случае PBR это физически обоснованная точка зрения на то, как должен реализовываться тот или иной шейдер или освещение в вашей сцене, а вот инструменты и пути для реализации PBR принципов могут быть разными. В своей практике к принципам PBR я чаще обращаюсь при настройке шейдеров, поскольку прочие аспекты, связанные PBR, уже интегрированы в софт и их использование естественно и очевидно. Я имею ввиду встроенные алгоритмы расчета GI - Global Illumination (англ. Глобальное освещение) и стандартные источники света. Тут нет необходимости «изобретать велосипед» или глубоко погружаться в теорию глобального освещения, важно просто соблюдать рекомендации от разработчиков софта. А вот шейдинг, достаточно многогранная и интересная тема, особенно в контексте PBR.

Продолжаем серию уроков о том, как стать художником по поверхностям.

Hello there! Моё имя Денис Кузнецов. Я - программист =)

  • Часть 1. Пиксель.Здесь.
  • Часть 2. Маски и текстуры.Здесь.
  • Часть 3. PBR и материалы. Вы ее читаете.
  • Часть 4. Модели, нормали и развертка.Здесь.
  • Часть 5. Система материалов.Здесь.
  • Часть 6. Погружение в систему материалов.Здесь.

Итак, котятки, погнали! =)

Расшифровывается эта аббревиатура так: Physically Based Rendering. Что в переводе значит «Основанный на физике рендер». Это важно, так как очень многие переводят PBR как "Физически корректный" - но это не так. Очень много физических явлений света не учитывается при обработке текстур в PBR, поэтому это именно "основанный на физике", а не точный рендер.

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

В зависимости от поверхности, от ее состояния (отражает ли оно, как зеркало, или имеет шероховатость, есть ли капли грязи / воды / кофе на поверхности, кусок дерева) вам в глаз приходит уже видоизмененный луч (или волна?).

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

Расписывать о том, по каким правилам конструируется свет, как он отражается и отражается ли вообще, я не стану. Про то, как работает на уровне физики свет есть куча статей:

  • Статья по основам от создателей Substance Painter / Designer здесь. И ее перевод от 2015 года здесь . Ссылка на вторую часть перевода есть на той же странице.
  • Статья от Google по их разработке PBR (те же яйки, только в профиль с другими формулами) здесь.
  • Статья от MrShoor, который рассмотрел PBR на низкоуровневом программировании шейдеров здесь.

Мы рассмотрим PBR с точки зрения общей концепции и на уровне работы с каждым параметром отдельно через каналы пикселей.

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

  • Color (Base Color / Albedo). Использует комбинацию из 3 каналов.
  • Metallic. Использует 1 канал.
  • Specular. Использует 1 канал / 3 канала в зависимости от реализации рендера. об этом будет чуть ниже.
  • Roughness. Использует 1 канал.
  • Glossiness. Использует 1 канал.
  • AmbientOcclusion (далее AO). Использует 1 канал.
  • Height. Использует 1 канал.
  • Normal map. Использует комбинацию из 3 каналов.

Все параметры, кроме Color и Normal map, используют по 1 каналу, а Color и Normal map — по 3 канала каждый:

  • Color использует 3 канала — RGB, чтобы формировать цвет пикселя.
  • Normal map использует 3 канала, чтобы сымитировать наклон поверхности. Каждый канал отвечает за наклон по вертикали, горизонтали и глубину соответственно, а значения в этих каналах определяют силу наклона.

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

В первом типе учитываются параметры Color-Metal-Roughness, во втором — Diffuse-Specular-Glossiness. Именно во втором случае параметр Specular имеет 3 канала.

Оба типа реализации используют одинаково 3 параметра — АО, Normal map, Height.

Мы будем использовать первый вариант, так как в дальнейшем перенесем наше обучение на Unreal Engine 4, а этот движок использует первый вариант комбинаций + имеет дополнительно параметр Specular из одного канала.

Обратите внимание, что UE4 использует первый вариант рендера, но так же использует параметр Specular. Однако, если во втором случае Specular имеет 3 канала, то в UE4 используется Specular с одним каналом, что лишний раз показывает, что PBR — это условность, а параметры - это абстрактные входы для текстурных карт с каналами, чтобы можно было получить определенный результат. Спасибо Constantine Ponomarev за уточку =)

Мяу-Мяу.

Хотя при создании текстур в Substance Painter параметр Height и вынесен отдельно, при запекании текстур он вшивается в карту нормали. Но его все еще можно его выделить в отдельный канал.

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

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

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

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

И перенесем ее в параметр Normal:

Ваш конечный результат сразу обновился?

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

Теперь давайте извращаться. Удалим из параметра Normal эту карту и укажем ее в Metallic.

Но для параметра Metallic используется только один канал, а карта нормалей имеет 3 канала, соответственно, вставляя карту нормалей в этот параметр, Substance Painter обрежет 2 лишних канала (GB - второй и третий по очередности) и оставит только один для расчетов:

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

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

Как видим, это один канал в градациях серого, который определяет, какие пиксели должны выглядеть как металл, какие — как нечто среднее, а какие — не металл. 0 — не металлический. 1 — металлический.

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

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

Так как считается стандартом наименование последовательности каналов RGBA, то первым каналом будет всегда R.

В дальнейшем, при использовании других ПО можно будет указывать, из какого именно канала брать данные. И мы это обязательно рассмотрим в следующих статьях.

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

Визуально, кресло состоит из 3 материалов:

  • Кожа.
  • Металлические клепки.
  • Пластиковые (возможно, деревянные) ножки.

Каждый материал имеет свои параметры:

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

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

Сейчас мы знаем:

  • Принцип работы PBR - все параметры настраиваются через каналы.
  • Каналы - набор параметров пикселей в текстурах.
  • Как работают все параметры PBR, и как мы можем на них влиять через текстуры.
  • Принцип построения сложных материалов.
  • Как смешивать материалы с помощью масок (Маски мы проходили еще во второй части).

Исходя из всего этого, мы можем теперь представить, как можно создать мокрый грязный асфальт со следами шин. Можем ведь? Да, конечно, можем. Иначе мы не котятки =)

Перед тем, как начать, нам нужно определиться с количеством материалов, которые будут использоваться в нашем практическом туторе:

  • Асфальт.
  • Грязь.
  • Следы шин (проще говоря, резина).

Их нужно где-то найти, а потом добавить в проект Substance Painter =)

Встал вопрос — где брать эти материалы?

Можно немного помучиться и создать коллекцию параметров для каждого материала вручную. Например, найти изображение асфальта. Обрезать его до квадрата и сделать его в качестве BaseColor. Потом, через специальные программы (например, xNormal) по этому изображению создать карту нормали. Через карту нормали отрегулировать Metallic и Roughness (можно и по BaseColor). В итоге, потратить несколько часов на создание идеального материала асфальта, выверяя корректные параметры для металла и шероховатости.

А можно сделать все проще.

Как я уже сказал выше, большинство материалов уже заготовлены давно за вас. Не думаете же вы, что вы первые, кто создает свой материал? =) Ваша задача лишь найти готовые решения, которые отвечают вашим требованиям, скачать их и установить. Если вы пользуетесь Substance Painter, то у компании allegorithmic (теперь уже у Adobe) есть специализированное хранилище готовых материалов, которые можно скачать. Доступ к ним есть как платный, так и бесплатный.

Если вы пользуетесь Quixel Mixer, то в этой программе уже заложены сотни различных материалов, которые были отсканированы с реальных объектов со всего мира и представляют собой огромную базу реалистичных материалов. А вам достаточно лишь указать их и начать работать.

Вот здесь (Ссылка) я подготовил текстуры для материалов, которые мы будем использовать в нашей практике. Скачивайте, не стесняйтесь.

Наша цель сейчас не создавать очень качественные текстуры, а познакомиться с тем, как можно с помощью параметров PBR и масок (всего того, что мы узнали) создать нечто интересное. Поэтому на данном этапе мы не будем пользоваться генераторами масок или грязи, а все будем делать вручную, чтобы понять суть.

Всегда изучайте правила и условия игры. Когда вы знаете правила игры от и до - у вас появляется понимание сути игры и то, как можно нарушать правила без последствий, а как их можно модернизировать, чтобы быть максимально эффективным. Мяу-мяу.
А если вы будете играть в игру, не понимая правил - вы так и будете получать штрафные баллы "ни за что", а судья кикнет вас с поля спустя 3 предупреждения. Задумайтесь, мяу-мяу.

Если вы уже посмотрели файлы, то, наверное, обратили внимание на маску для шин. Она подготовлена отдельно, так как я не смогу ее сгенерировать на ходу в 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» для инвертирования уровней интенсивности канала:

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

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

Заметьте, как мы ловко смогли немного оптимизировать работу генерации текстуры - мы не стали загружать в проект еще 100500 текстур, а воспользовались той же текстурой, что и использовалась для окраски асфальта. Мы стали на шаг ближе, чтобы быть художником по поверхностям. Мяу-мяу.

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

  • Создать новую папку и назвать ее Road_Line.
  • Добавить черную маску папке.
  • Добавить в папку новый слой и назвать его Layer_RoadLine.
  • У слоя в параметрах BaseColor указать оранжевый цвет напрямую:

Вы так же можете отрегулировать параметры Metallic и Roughness на свой вкус, чтобы создать реалистичную краску. Я не стал этого делать, чтобы сократить размеры тутора.

Теперь, вспоминая правила иерархии слоев, расположим папку с дорожной линией между асфальтом и резиной.

Перед тем, как что-то красить и определять иерархию слоев, художники порекомендуют вам подумать над тем, какая была история у объекта. Сначала покрасили асфальт, а потом он стал грязным, и по нему проехала машина, или краску наложили после, просто не мыли асфальт (прям, как в жизни). История объекта всегда определяет его внешний вид, мяу-мяу.


Ранее в блоге

Часть I — кратко затронул историю становления термина PBR и вывел главный тезис. PBR это не шейдер и не текстура или какой-то отдельно взятый рендер движок — это в первую очередь принципы и основы современной компьютерной графики, кто-то называет это философией.

Часть II — была посвящена такому понятию как PBS — Физически корректный шейдинг, как неотделимая часть физически корректного рендеринга. Кратко рассмотрел, что такое BRDF функции.

Часть III — Реализация GTR (GGX) функции в V-ray. Альтернативные, физически корректные, BRDF модели. Аналитические BRDF модели (Merl библиотека). Коммерческие BRDF решения — VRscans (VrayScanedMtl)

Часть IV.I — PBR шейдинг в Дисней. Реализация в V-ray

Часть IV.II — PBR шейдинг в Дисней. Реализация в V-ray

Часть IV.III — PBR шейдинг в Дисней. Реализация в V-ray

Часть V — PBR текстуры (Заключительная часть цикла)

Финал

Финальная статья цикла, будет посвящена PBR текстурам. Сразу определю — PBR или «не PBR» текстур не бывает. Бывают текстуры отвечающие или не отвечающие PBR принципам.

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


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

PBR текстуры

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

Через растровую текстуру можно задать не только сложный диффузный цвет поверхности, но и «запечь» некоторые её свойства. Использование текстур, в которых «запечены» свойства материала, пришло в массы из игровой индустрии. По сложившейся практике пользователю, предлагается три базовые текстурные карты — Diffuse, Specular\Metalness и Glossy\Roughness, по ситуации, подключают дополнительные технические карты — Opacity, Normal, Height, Ambient occlusion, Cavity, Emissive maps. Классический сет это четыре текстуры: Diffuse, Specular\Metalness и Glossy\Roughness, Normal

Важным недостатком так называемых «PBR текстур» является отсутствие гибкости. Так например — карта Glossy\Roughness предлагает мне уже зафиксированные значение шероховатости поверхности. А что если мне нужно сделать больше глянца, как быть? Понятно что мне, как пользователю с опытом, не составляет труда «подкрутить» все эти карты до нужного результата, а как быть менее опытным коллегам? Поэтому мне не особо понятен тот хайп, который был в свое время поднят вокруг PBR текстур.

PBR текстуры для меня, в первую очередь, это решение все же узкоспециальное, для таких направлений как VR, реал-тайм и игровые движки, где нужно максимально упростить и унифицировать шейдерные вычисления, когда текстуры запекаются комплексно для всей модели сразу. В этом контексте — PBR текстуры это простое и универсальное решение, своего рода кроссплатформенный набор «Сделай сам».

3d модель, шейдер которой сделан с соблюдением PBR принципов, будет рендериться, в любой современной рендер системе, без необходимости конвертировать материалы или что либо в них перенастраивать. Особенно если часть свойств шейдера, было зафиксировано (запечено) в текстурах, о которых я говорил выше. Это важное и ценное качество для 3d модели, особенно когда вы продаете её на стоке [Посмотреть стрим о 3D стоках]. Покупатель будет понимать, что купив ваш продукт, он получит универсальное шейдерное решение, которое будет давать одинаковый результат при рендеринге в независимости от используемой рендер системы.

Есть два шейдерных решения так или иначе поддерживаемых в большинстве рендер движков — Specular workflow и Metalness workflow. Эти решения отличаются набором необходимых текстур и соответственно слотами размещения. Итоговая разница не существенна, но заметна в ряде деталей. Забегая вперед сразу скажу, что Metalness workflow более удобен, более экономичен в расходовании видеопамяти (актуально для игровых движков), прост и поэтому стал теперь доминирующим рабочим пространством.

Specular workflow

Как сказал ранее, практически все свойства шейдеров, можно запечь в текстуру, но в этом нет необходимости, так как большинстве рендер систем многие свойства, задаются программно. Так, например, нет необходимости запекать индекс рефракции (IOR), поскольку его можно задать напрямую в шейдере. Поэтому запекается, только ограниченный, комплект текстур.

Для Specular workflow используется базовый сет из следующих растровых карт

Diffuse map - Карта диффузного цвета

Specular map - Карта зеркальности

Glossy map - Карта глянцевитости

Normal map - Карта нормалей


Metalness workflow

Для Metalness workflow используется базовый сет из следующих растровых карт

Diffuse map - Карта диффузного цвета

Metalness map - Карта металличности

Roughnes map - Карта шероховатости

Normal map - Карта нормалей


В чем разница этих решений?

Очевидно, что некоторые текстуры подключаются к разным слотам шейдера и в принципе отличаются по содержанию. Разница между Glossy\Roughness картами небольшая: Glossy map это инвертированная Roughness map, переключение между режимами Glossy\Roughness поддерживается не во всех движках, но в любом случае адаптировать эту карту под нужный режим не составит труда при помощи Photoshop. Карта нормалей (Normal Map) не меняется в обоих решениях. Принципиальное отличие только в двух текстурах Diffuse и Specular\Metalness.


Для рабочего процесса Specular workflow — диффузная карта «закрашивается» черным в тех местах, где поверхность должна проявлять «металличность», там же, где поверхность является диэлектриком, задается необходимый цвет. Через текстурную карту Specular задается степень зеркальности объекта для диэлектрических участков через оттенок серого, а для металлических участков через необходимый цвет металла.

У рабочего процесса Metalness workflow— диффузная карта полностью цветная, как для металлических участков шейдера, так и на участках с диэлектрическими свойствами поверхности. Через черно-белую текстурную карту Metalness мы «сообщаем» рендер движку, где метал, где диэлектрик. По сути карта Metalness выполняет функции маски, а вся необходимая информация «снимается» с карты Diffuse.

Считается что Metalness workflow экономичней в контексте расходования видеопамяти, так как черно белая маска практически ничего «не весит». Я сравнил два сета и действительно сет для Metalness workflow на 20% легче сета Specular workflow.

Недостатки и тонкости работы с Metalness и Specular workflow

Я не буду перетряхивать все рендер движки, на предмет того, как у них организовано подключение так называемых PBR текстур и ограничусь только V-ray.

Классическая схема подключения текстур в Specular workflow


Недостатком этой схемы является то, что она предполагает полное отключение опции IOR, что фактически делает это решение физически некорректным, но…

Некоторые ресурсы предлагают адаптированный к V-ray сет для Specular workflow. В этом сете есть дополнительная IOR карта, которую нужно подключать к слоту Fresnel IOR и так же немного измененная по цвету Specular карта. Такое решение делает шейдер более корректным и отвечающим принципам PBR.


Хотя визуальная разница между этими двумя решениями будет едва ли заметна неискушенному пользователю.

Для подключения текстурных карт в режиме Metalness workflow, необходимо на вкладке BRDF переключиться в режим Use Roughness


Здесь тоже, всё не «слава богу», но получше чем у Specular workflow. Работа со множителем IOR в этом режиме возможна и я могу установить необходимое по ситуации значение, без использования дополнительных текстурных карт. Но, как мне «посчастливилось» выяснить, комплексное значение IOR у металлов значительно ниже чем у диэлектриков. И в примере который я сейчас разбираю, так же есть необходимость подключения дополнительной карты с разными значениями IOR для металла и для окислившейся поверхности (диэлектрика).

В связи с этим фактом, что у металлов есть комплексное значение IOR, которое хоть и не значительно, но влияет на результат, для Вас готовится отдельная статья по металлам, где я обновлю свое мнение и добавлю новую информацию по настройке металлов в V-Ray Next.

В статье Understanding metalnessвы можете найти табличку, скриншот которой представлен ниже, Vlado (папа V-ray) вычислил комплексные значения IOR для ряда металлов которые можно\нужно использовать в совместно со включенной опцией Metalness.


Эти значения, в большинстве случаев, чуть больше единицы. Но как раз из-за этого что IOR метала значительно ниже значений у неметаллов, то имеет смысл заморочиться над этой разницей, для достижения максимальной реалистичности и физической корректности шейдинга в режиме Metalness workflow.

Поскольку карта с необходимым значением IOR, к этому сету не прилагалась, я сделал кастомное решение используя ноду Mix и карту Metalness в качестве маски для разных значений IOR. Значения для IOR я поставил следующие:

IOR 1.05 = 0.9524 RGB для металлической поверхности (среднее значение из таблицы Vlado)

IOR 1.5 = 0.6666 RGB для окиси на поверхности металла (диэлектрик)


После всех тестов, я отдаю свое предпочтение схеме — Metalness workflow + IOR map, так как она наиболее близка к физически корректном решению. Но и другие схемы вполне рабочие, разница будет заметна только на мелких деталях, да и то, только на композитных материалах, которые я выбрал для обзора, где одновременно используется два типа материала — метал и диэлектрик. В простых, однородных, материалах эти нюансы будут менее всего заметны.


Так же сделал рендеры с контрастной световой схемой, что бы сравнить все четыре схемы с оригинальным превью, эксперимент не удался…


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

Что еще нужно знать при работе с так называемым PBR текстурами?

Та информация, которую я прояснил, в процессе работы с материалами к этой статье, стала откровением… Всю свою сознательную трудовую жизнь, когда уже многие начали работать в гамме 2.2 и я в том числе, все текстуры по умолчанию подгружались в этой гамме. Единственной картой, которая нуждалась в корректировке была карта нормалей (Normal Map) её нужно было подгружать в линейной гамме — 1.0

Когда я более подробно стал изучать PBR тему и работу с текстурами в частности, я был удивлен, когда узнал что и остальные текстуры, кроме Specular и Diffuse, необходимо было подгружать в линейной гамме.

Почему так?

Это связано с тем что все черно-белые текстуры, если грубо, участвуют в математических вычислениях. Так например в карте Metlaness, черный пиксель означает 0, белый пиксель означает 1. Математика это линейные вычисления, поэтому шейдерные вычисления так же происходят в линейном пространстве и только два шейдерных компонента — Specular и Diffuse должны быть в представлены гамме 2.2 поскольку это визуальные составляющие и их обработка происходит в нелинейном пространстве.

Specular workflows

Diffuse map - Gamma 2.2

Specular map - Gamma 2.2

Glossy map - Gamma 1.0

Normal map - Gamma 1.0

Metalness workflow

Diffuse map - Gamma 2.2

Metalness map - Gamma 1.0

Roughnes map - Gamma 1.0

Normal map - Gamma 1.0


Это правило, распространяется и на все другие шейдерные компоненты, которые реализуются через черно-белые растровые текстуры — они все должны подгружаться в гамме 1.0 не зависимо от того используете ли вы текстуры из PBR сборников или делаете что-то свое.

Всё. по PBR "точка".

PS Надеюсь что мои изыскания были не напрасны и принесут кому то пользу… во всяком случае у меня, в процессе работы над этим материалом, появилось много новых решений и вообще тема шейдинга стала достаточно прозрачной и понятной. Буду рад фидбеку и пожеланиям. Возможно я что то пропустил, дайте знать, и я просто дополню или уточню эти статьи необходимой информацией.

Читайте также: