Что такое PBR? Часть 4.1
Pavel_Ushakov 1846

5509ea17abefb4da578618a084fb0dfc.jpeg

Ранее в "сериале"...

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

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

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

О физической корректности рендер систем.

Повторю еще раз для "горячих" финских парней - ни один рендер движок не имеет преимуществ над другим в контексте PBR, все они используют различные алгоритмы, которые решают математические задачи. Расчет глобального освещения (GI) это отдельная математическая задача. Каждый рендер движок решает эту задачу по-разному, но итог один, это результат наличия глобального освещения в 3d сцене. Глобальное освещение не может быть менее физически корректным у одного движка и более физически корректным у другого.

Корректней сравнивать алгоритмы и понимать, что каждый алгоритм нацелен на какой-то результат. Так например Irradiance Map в V-ray и Irradiance Cache в RedShift это алгоритмы с сильной интерполяцией результатов. Для вычисления GI эти алгоритмы используют меньшее число данных, поэтому рендеринг с этими алгоритмами происходит быстрей, но это не говорит о рендер движке как не состоятельном в контексте PBR. Вот если бы расчет GI заменялся бы расчетом Ambient Occlusion, то тогда да можно было бы сказать что мы имеем дело с физически некорректным решением.

"PBR" требования, предъявляемые к BRDF функции.

Расчет BRDF функции, которая определяет как луч света себя поведет при столкновении с поверхностью объекта в 3d пространстве, это то же задача. V-ray использует для этого GTR (GGX) функцию, Corona Renderer - GGX, Octan и Fstorm использует "свои" наработки, но это в любом случае подправленные в деталях известные BRDF функции, у Arnold - Cook-Torrance. На самом деле это не так важно название, важен результат и задачи с которыми справляется BRDF функция. На текущий момент к BRDF функции предъявляют следующие требования, соответствие которым определяет её как физически корректную:

Energy Conservation - закон сохранения энергии. Если по простому то все 100% света, которые попали на объект, должны быть правильно распределены - сколько-то % зеркально отразилось, сколько-то % поглотилось, сколько-то % прошло насквозь, но в сумме это должно давать вновь 100%

Reciprocity - Принцип взаимности или можно сказать инверсии, означает что результат BRDF функции останется не изменным, когда луч выпущенный из точки 1 (источник света), пройдя любое количество преломлений, отражений и т.д. при достижении конечной точки 2 (датчик), может вернуться тем же путем, если поменять местами точки 1 и 2, т.е. источник света и датчик. Другими словами, принцип математически доказывает утверждение: «Если я вижу тебя, ты можешь видеть меня».

Microfacets - поддерживать и соответствовать теории микрошероховатости поверхности (Microfacet theory)

Fresnel Effects - поддержка законов Френеля и связанных эффектов (Fresnel Glossy)

Anisotropy - поддержка анизотропности, которую можно встретить у таких материалов как брашированный метал, ткань, волосы, древесина.

Естественно, результаты сравниваются с аналитическими BRDF моделями из MERL библиотеки. GTR (GGX) отвечает большинству запросов, хотя у нее есть некоторые погрешности в Energy Conservation, возможно это только в имплементации у V-ray. Так же Octan может похвастать хорошими результатами, но дальнейшее повествование я буду вести про GTR (GGX) реализованную в V-ray поскольку с этим движком я иду по жизни уже более 15-ти лет.

Почему Chaos Group выбрали эту BRDF модель? Я думаю что это связано со определенными стандартами в киноиндустрии, где V-ray прочно занял свою нишу. В 2016 году вышел анимационный фильм FINAL FANTASY XV, полностью посчитанный на V-ray.

А 2017 году официальное лицо компании Chaos Group, он же папа V-ray - Владимир Койлазов (aka Vlado), получил Оскара за технологичные достижения в киноиндустрии.

Мне повезло встретиться с моим героем в оффлайн, на CG EVENT 2018 MOSCOW

ca0fff5f14865ed5579975b97deb6423.jpeg

И так почему GTR (GGX)? Я думаю это из-за того что бы быть конкуренто способным и одновременно дружественным рендер решением к студии Дисней. В этой студии так же выбрана BRDF модель GTR (GGX) в качестве основной функции, а эти ребята понимают в своем деле, поболее чем...

Так по запросу Physically-Based Shading at Disney в сети можно найти много документов с математическими формулами и графическими примерами, но поскольку я рассматриваю PBR принципы с потребительской точки зрения, мне интересно только то, как я эти все принципы могу адаптировать в пользовательской практике, а не через формулы.

В моей сфере самые актуальные рендер системы это Corona Renderer и V-ray Next. V-Ray, как я уже писал, мне знаком с первых версий, поэтому все свойства материалов я буду рассматривать и реализовывать на этом движке. Данные свойства кроссплатформенны, т.е. актуальны для любого современного рендер-движка. По этой причине я не буду впадать в сравнительный анализ всех доступных рендер систем. Люди со светлой головой смогут понять и правильно применить эти свойства не зависимо от используемой ими платформы.

Physically-Based Shading at Disney

По запросу «Disney shading principles» в Google можно найти кучу графических таблиц с цветными шариками, которые демонстрируют основные принципы, а фактически физические свойства любой поверхности, грамотное применение которых позволяет настроить любой материал. Я смог реализовать все диснеевские принципы на практике в рендер-движке V-ray Next и не испытал никаких трудностей, поскольку стандартный шейдер VRayMtl поддерживает их в полной мере, с небольшими "надстройками" в виде дополнительных расширений — VrayBlendMtl, Vray2SidedMtl и т.д.

110376eb72d91e177e07b3e1126c7132.jpeg

Diffuse colour

Диффузный цвет (англ. Diffuse — рассеивать свет) базовая характеристика поверхности задающая цвет поверхности освещенной прямым источником света. В последнее время термин Diffuse colour, применяемый в CG стали подменять\путать\приравнивать к термину Альбедо (англ. Albedo — коэффициент отражательной способности). В реальности Albedo это комплексная характеристика поверхности — итог совместной работы всех представленных в таблице свойств материала — Specular Colour, Diffuse colour, SSS и т.д., а не просто диффузный цвет поверхности. Albedo — важная характеристика и при настройке шейдера следует поглядывать в таблицу известных значений альбедо, для некоторых материалов, что бы не делать дилетантских ошибок.

На практике я ограничиваю альбедо для максимально темного цвета равным значениями от 0.005 до 0.01, а для самых светлых тонов 0.7-0.8 - это контрольные цифры, которые определяют мой рабочий диапазон. Конечно не все данные есть в интернете, но вот сводная таблица некоторых значений, которые помогут верно "взять" диффузный цвет.

649ebd91f1589d3e46218aafbae837c3.png

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

4df23ef1d31e4abbb7315698b81628df.png

Diffuse Roughness

Diffuse Roughness (англ. Roughness — шероховатость) В оригинальной таблице Дисней данная опция не представлена. Она используется в студии, но практика её применения достаточно узкая, чтобы уделять ей много внимания. Данную опцию в некоторых рендер системах называют Flatness (англ. Flatness — плоская).

Коротко о том чем обусловлено появление этой опции. Взгляните на изображение луны, фактически это сфера, но мы её видим плоской. Это связано с тем что из-за грубой поверхности и прочего комплекса физических явлений — объем «уплощается» и освещенная отраженным светом луна выглядит плоской. Физика и имплементация в CG описаны здесь. Применение данной опции актуально для грубых и глубоко матовых поверхностей — грубая ткань, натуральный камень, рыхлая бумага и т.д.

11c146addb84a2fb235cbc6fae1957d4.png

Subsurface Scattering

Корректней, на мой взгляд, назвать это свойство Translucency (англ. Translucency — светопроницаемость, полупрозрачность), поскольку определение Subsurface Scattering (англ. Subsurface Scattering — подповерхностное рассеивание ) это процесс поведения света внутри полупрозрачного объекта, а транслюцентность это свойство. В V-Ray для реализации этого свойства есть множество решений, как через стандартный шейдер, так и через отдельные решения, такие как VrayALSurfaceMtl, VrayFastSSS2 и т.д. Вопрос физически корректной имплементации подповерхностного рассеивания открытый, поскольку точных измерений было произведено достаточно мало, но все же в ряде источников можно найти некоторые из них. Эти данные используются в пред установках шейдера VrayFastSSS2 и их можно считать вполне физически корректными.

0d50f67467f36de2ce403f7039bf9c0a.png

Metallic

В CG , по типу отражения, шейдеры разделяют на Dielectric и Conductive (или Metallic и Non-Metallic), в русской адаптации с английского языка, можно сказать металлы и… «все остальные», поскольку если переводить дословно, то Conductive это токопроводящий материал, но вода так же проводит ток, а имеет свойства отражения как у диэлектриков, поэтому правильней и понятней применять определение «металлы» и условно «неметаллы». В V-ray Next, в стандартном шейдере, ввели дополнительную опцию Metalness, но с небольшой оговоркой, физически корректный результат это значение либо 1 либо 0, промежуточные значения, не имеют за собой физически обоснованного контекста.

dce62ae5863e3a820449334e4e0e0d46.png

Specular

Specular (англ. Specular — зеркальный, отражающий и т.д.) С этим термином иногда возникает путаница — в V-Ray за отражающие свойства поверхности отвечает параметр Reflect, а за силу отражения параметр IOR (англ. Index of Refraction — Индекс преломления). Если грубо, то белый цвет рефлекта «включает» зеркальность материала, а IOR определяет силу этого отражения. На практике физически-корректные значения IOR для «неметаллов» колеблются от 1,3 до 1,8. Особняком стоят некоторые минералы, значение которых достигает 3. IOR металлов в CG имплементируется совершенно другим способом, здесь можно найти подробную инструкцию как получить максимально точный цвет метала. Иногда, термин IOR вводит в заблуждение. Индекс преломления актуален и для визуально непрозрачных материалов, таких как металлы. Измерения IOR у таких материалов производят на очень тонкой пленке, толщина которой меньше длинны световой волны, при таких размерностях IOR металла становится доступен к измерению. Что бы сделать измерения - пленку металла наносят на прозрачную поверхность: вода, стекло или пластик.

981216ba3f437233f7f56f30990de7a9.png

Правильным, для большинства «неметаллов», считается следующее решение — белый рефлект и подходящее значение IOR. Если IOR не известен то значение 1.5 будет оптимальным. Для водосодержащих материалов (алкоголь, органика, шампуни, человеческая кожа, молоко и т.д.) обычно используют IOR для воды — 1.33 или близкие к этому значения.

Следующее свойство не имеет физического обоснования, но все же было реализовано для CG художников в студии Дисней.

Specular Tint

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

1579aa96dc7aa74d2d17332e33a1a8ac.png

Specular Roughness

Specular Roughness (англ. Roughness — шероховатость). В V-Ray, по дефолту, за «размытые» отражения отвечает опция Glossy Reflect, это инвертированная опция Specular Roughness. Если необходимо работать в PBR workflow, то в стандартном шейдере VRayMtl есть возможность переключаться между Roughness\Glossy для «размытия» отражений. Результаты работы Roughness и Glossy идентичны, просто они начинаются с разных концов, но в серединном значении 0,5 они совпадают.Roughness в V-Ray ввели для того что бы удобно было использовать так называемые «PBR текстуры» задающие параметры для опции Specular Roughness.

d0c5eaf4edbd80198234f2cd58c79f54.png

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

Комментарии (17)

+3
ViTcore
Да мы поняли уже, USHAKOV KANAL. Что за спам, это все можно было в 1 статью объединить.
+2
M_E_T_I_S
Непонятно ваше негодование.
+3
semjaza
А мне понятно. Человек описал элементарную вещь в 4 частях и не собирается останавливаться. Все это и так понятно человеку хоть немного понимающему английский язык. И как тогда это назвать, если не спам?
+5
AG.edits
Так не читайте, в чем Ваша проблема? Как Вас это затрагивает?
На каждую статью - найдется свой читатель
+2
ck_petya
Не злись. Иди, обниму
+1
semjaza
В каком плане - не читайте? я ответил на комментарий.
Не отвечайте мне тогда, если не нравится мой комментарий.)
0
AG.edits
в каком плане - не нравится комментарий?)))
0
semjaza
Умора)
+2
alex151286
Отличный материал, расписал так расписал!
+1
Pavel_Ushakov
Спасибо
+2
necBTpuko
Круто! А кто автор статьи, не пойму никак? -_-
0
dontpiter
Как кто? Это Павел Ушаков - очевидно же))
+3
ck_petya
Как будто хелпер по вирею прочитал.
+2
SpLine_85
Рили. все грамотно все по полочкам, не каждый зайдет в официальный хелп и начнет разбираться. а тут все все с анализом наглядным. Молодец! продолжай!
+3
3ds-shaman
Паша молодец, не обращай внимание на всех, кому надои интересно тот прочитает, а кому легче обосрать видимо чего много, тем и делится.
+2
Pavel_Ushakov
Спасибо
0
Maksijo
Спасибо Павел!