Что такое PBR? Часть V

Ранее в блоге...

Часть 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 текстуры.

Cover.png

Про этот сборник с большой натяжкой можно сказать, что его содержимое отвечает всем 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 - Карта нормалей

Cover 06.1.jpg

Metalness workflow

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

Diffuse map - Карта диффузного цвета
Metalness map - Карта металличности
Roughnes map - Карта шероховатости
Normal map - Карта нормалей

Cover 06.2.jpg

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

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

Cover 06.3.jpg

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

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

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

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

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

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

Cover 06.4.jpg

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

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

Cover 06.5.jpg

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

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

Cover 06.6.jpg

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

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

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

Cover 06.8.jpg

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

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

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

Cover 06.7.jpg

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

Cover 06.9.jpg

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

Cover 06.10.jpg

Тут сложно дать однозначный и объективный комментарий и сделать какое то сравнение, так как у меня нет возможности задействовать 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

Cover 06.11.jpg

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

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

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

Яндекс.Дзен | ВКонтакте | YouTube | Instagram

760 0 850 18
7
2020-03-16
Очень круто, спасибо за статьи!
2020-03-16
Спасибо, многие вещи стали понятнее. В частности, требование Substance в использовании IOR-карты с VRay
2020-03-18
В целом весь цикл статей очень понравился. Все хорошо и детально структурировано.

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

Только в этом моменте немного неточное описание карт: в Specular workflow используется карта дифуза, а Metalness workflow - карта альбедо. Или я не прав?
2020-03-19
Мне известен только такой PBR (Patrol Boat River) =)
2020-03-20
Ромка ДолговВ целом весь цикл статей очень понравился. Все хорошо и детально структурировано.

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

Только в этом моменте немного неточное описание карт: в Specular workflow используется карта дифуза, а Metalness workflow - карта альбедо. Или я не прав?

Вы не правы. В этой части я писал, что "производители" PBR текстур и прочие вводят в заблуждение употребляя термин альбедо вместо диффузной карты. Термин Альбедо и Диффузная карта в их контексте это одно и тоже, но в расширенном понимании Альбедо это комплексная характеристика прочитайте внимательно раздел про диффузную карту.

Скриншот этого куска текста: https://clip2net.com/s/46xUXdW

Если вы создаете чистый метал в Specular workflow, то диффузная карта должна быть просто черной, а через цвет карты Specular вы задаете цвет металла. Если вы создаете диэлектрик в Specular workflow, то через дифузную карту вы задаете цвет диэлектрика, а карта Specular сообщает о силе отражающей способности - обычно это оттенки серого.

Если вы создаете метал или диэлектрик в Metalness workflow, то цвет метала и диэлектрика всегда задается через диффузную карту, а у шейдера включается опция Metalness (в V-ray) или подключается карта металличности, где белый цвет текстуры "сообщает" рендер движку что шейдер металический, а черный цвет что шейдер диэлектрик. При этом цвет рефлекта, он же Specular, у шейдера в Metalness workflow V-ray, всегда должен быть белым.
2020-06-22
Ромка ДолговВ целом весь цикл статей очень понравился. Все хорошо и детально структурировано.
Так что ты Долгов теперь типа Должен.
2022-08-26
Все части хороши, особенно, с исторической точки зрения развития шейдинга. Но в этой части я заметил кое-какие расхождения от теории pbr. В принципе, я сам уже больше года копаю эту тему, но до сих пор всё полностью не понял
RENDER.RU