В предыдущей статье, я немного раскрыл, что стоит за термином PBR.
Перед тем как продолжить, хочу внести некоторую ясность в определениях. Как писал ранее, расшифровка PBR звучит как Physically Based Rendering (англ. Физически обоснованный\корректный рендеринг).
В сети так же можно встретить аббревиатуру PBS - Physically Based Shading (англ. Физически корректный шейдинг), не стоит на это обращать внимание, это все тот же PBR, просто в этом случае физически корректный шейдинг выделяют как отдельное направление.
Physically Based Shading (PBS)
Шейдер (англ. Shader – затеняющий), шейдинг (англ. Shading – затенение). В CG это определение перекочевало из области изящных искусств. Так называют технику штриховки карандашом, которая выявляет объем объекта.
Если мы нарисуем замкнутую линию, ну, например, пусть это будет круг (Аналогом в 3ds max может быть сплайн). Данная геометрическая фигура не дает нам никакого представления об объеме объекта и я уже не говорю о свойствах его поверхности и т.д.
Если нарисуем несколько замкнутых линий эллипсовидной формы, то они образуют каркас сферы (аналогом такого решения будет отображение сферического объекта в режиме «wire»). Текущее представление, уже может дать представление о форме объекта, но для людей с хорошим пространственным мышлением.
Если же начать наносить штрих, поверх конструктивного рисунка, выявляя границы между светом и тенью, добавляя полутени, а также обозначив границы у падающих теней, то получится объемно-пространственное изображение. Эти действия можно сопоставить с процессом рендеринга, а итог этих действий – с результатами рендеринга.
Резюмирую суть - то как будет выглядеть поверхность 3D модели, после рендеринга, определяет шейдер, в простонародье «материал». По внутренней сути, шейдер — это программа или код. Математическое ядро любого шейдера — это функция, вычисляющая как свет взаимодействует с поверхностью объекта.
Решение этой функции не простая задачка, это не 2+2 результат которой однозначно 4, а более сложная система отношений между различными переменными и параметрами, поэтому универсального и идеального шейдера на все случаи жизни просто не существует. Гипотетически можно конечно написать такую функцию, но это будет громоздкая и не оптимальная реализация.
BxDF функции
BxDF - семейство функций которые определяют как луч света ведет себя при "столкновении" с поверхностью 3d объекта. Символ x в аббревиатуре BxDF заменяется подходящей по ситуации буквой, а ситуаций может быть много, вот несколько типичных случаев:
- Луч полностью отразился - зеркальная поверхность
- Луч рассеялся - диффузная поверхность
- Луч прошел сквозь объект - прозрачная поверхность
- Луч зашел в объект и вернулся - полупрозрачный объект
В зависимости от ситуации используется подходящая функция - BDF, BSSRDF, BRDF, BTDF, BSSTDF, BSSDF, BSDF. Больше деталей можно узнать здесь, поскольку шейдерные функции это отдельный и очень емкий материал, который больше будет интересен кодерам, чем визуализаторам.
Для определения базовых свойств поверхности, которые удовлетворяют большинству пользовательских запросов используют относительно простую функцию: BRDF - Bidirectional reflectance distribution function. Чаще всего BxDF функции носят имена ученых, которые их разработали.
BRDF функции в V-ray
Популярная и широко используемая в продакшене рендер система V-ray долгое время применяла в стандартном шейдере VrayMtl следующие BRDF функции:
Данные модели BRDF не имеют ничего общего с PBR, поскольку разработаны на основе эмпирических данных.
Эмпирические данные (от др.-греч. [empeiria] «опыт») — данные, полученные через органы чувств, в частности, путём наблюдения или эксперимента.Это выглядит примерно так - некоторый ученый по имени «N» наблюдает как свет ложится по поверхности на том или ином материале и на основе этих наблюдений с учетом существующих теорий, базовых аксиом и научных постулатов, предпринимает попытки описать эти явления математически.Естественно невозможно ожидать, что два учёных, наблюдающих или проводящих эксперименты над одним и тем же явлением или объектом придут к одинаковым, независимым от теорий выводам.
Удивительно, но да, большинство BxDF функций реализованы «на глазок», на основе наблюдений. Другое дело функция GGX. Данная функция была выведена на основе физических измерений и в различных имплементациях используется во всех современных рендер системах, как в продакшене, так и в реалтайме.
GGX функция
GGX функция - это результат совместных изысканий четырех ученых Корнельского университета (США) Bruce Walter, Stephen R. Marschner, Hongsong Li, Kenneth E. Torrance. Алгоритм функции и результаты исследования опубликованы в 2007 году. Очевидно, что все четыре имени не запихнуть в название BRDF функции, поэтому данной модели дана аббревиатура GGX, расшифровать которую достаточно сложно. Возможно Generalized Gausian X, где Х – хрен знает, что обозначает. Математика здесь: Microfacet Models for Refraction through Rough Surfaces
На основе сравнительного анализа и математических вычислений было доказано что результаты этой функции максимально близки к результатам у аналитических BRDF функций различных материалов, которые были получены путем сканирования - MERL database
В частных случаях функция GGX по-прежнему не удовлетворяла все запросы, так например блик на полированном хромовом шарике имел более длинный «хвост», чем получался у GGX функции. На слайде ниже видно, что основное «тело» блика функции GGX и BRDF модели отсканированного материала (MERL database) очень похожи, но в GGX не хватает «дымки» вокруг блика и его растяжки по поверхности.
Длинный «хвост» или эффект «дымки» вокруг основного блика обусловлен тем, что большинство объектов, которые встречаются в обычных бытовых условиях, не имеют идеальной полированной поверхности у них всегда имеются микрошероховатости, которые оказывают влияние на глянцевитость поверхности.
GTR функция
Недостаток у GGX функции, отсутствие возможности управлять "хвостом" блика, был решен в R&D (англ. Research and Development — исследования и разработки) отделе студии Дисней, который модифицировал GGX функцию, «скрестив» её с зеркальной моделью Trowbridge-Reitz описанную в работе 1975 года «Average Irregularity Representation of a Rough Surface for Ray Reflection».
Таким образом в GGX функции появилась переменная для управления «хвостом» блика. Самой функции дали название GTR (Generalized Trowbridge-Reitz) В стандартном шейдере VRayMtl по умолчанию задается значение для «хвоста» блика равное 2 (опция GTR tail falloff), что производит блик эквивалентный функции GGX. Значения меньше двух, дают возможность более тонко настроить блик и это уже будет работа GTR функции.
Продолжение следует…