Урок №40. Физически корректный рендеринг (PBR) в OpenGL

  Дмитрий Бушуев  | 

  Обновл. 14 Дек 2020  | 

 2411

 ǀ   4 

На этом уроке мы рассмотрим, что такое PBR в OpenGL.

Физически корректный рендеринг (PBR)

Физически корректный рендеринг (сокр. «PBR» от англ. «Physically Based Rendering») — это набор принципов (или скорее даже — целая теория) рендеринга, в той или иной мере соответствующих физическим законам природы. Освещение, созданное с применением технологии PBR-рендеринга, обычно выглядит более реалистичным по сравнению с оригинальными алгоритмами моделей освещения Фонга и Блинна-Фонга. Помимо того, что при PBR-рендеринге объекты сцены выглядят лучше, мы (и особенно художники) для имитации правильного освещения можем использовать специальные материалы поверхностей объектов, созданные на основе реальных физических параметров (не прибегая при этом к дешевым трюкам). Одним из самых больших преимуществ подобных материалов является то, что они будут выглядеть корректно независимо от условий освещения.

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

Для того чтобы PBR-модель освещения считалась физически корректной, она должна удовлетворять 3 условиям:

   в её основе должна лежать модель микрограней;

   поддержка выполнения закона сохранения энергии;

   использование физически корректной двулучевой функции отражательной способности.

На следующих уроках мы сосредоточимся на определенном подходе PBR-рендеринга, первоначально разработанном компанией Disney и позже адаптированном для рендеринга в реальном времени компанией Epic Games. Их подход, основанный на принципе металличности материала, имеет богатую документацию, широко принят большинством популярных движков и визуально выглядит просто потрясающе. К концу этих уроков мы получим нечто похожее на следующее изображение:

Учитывайте, что теория, рассматриваемая на этих уроках, имеет продвинутый уровень сложности, поэтому рекомендуется хорошо разбираться в OpenGL и шейдерном освещении. А также вам понадобятся познания в таких темах, как: фреймбуферы, кубические карты, гамма-коррекция, HDR и карты нормалей. Мы также немного углубимся в продвинутую математику, но я сделаю всё возможное, чтобы объяснить концепции как можно яснее.

Модель микрограней


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

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

На микроскопическом уровне ни одна поверхность не является полностью гладкой, но, учитывая, что рассматриваемые микрограни достаточно малы, мы можем смоделировать шероховатость поверхности введением в модель дополнительного параметра шероховатости. В зависимости от шероховатости поверхности, мы можем вычислить ту часть микрограней, которые ориентированы вдоль некоторого вектора h. Вектор h является срединным вектором, который расположен посередине между вектором света l и вектором вида v. Мы уже обсуждали данный вектор на уроке о продвинутом освещении, напомню, что он вычисляется как сумма векторов l и v, деленная на длину вектора l + v:

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

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

Сохранение энергии

При применении теории микрограней используется закон сохранения энергии: энергия отраженного светового потока никогда не должна превышать энергию падающего светового потока (за исключением случаев использования излучающих поверхностей). Глядя на вышеприведенное изображение, мы видим, что при увеличении уровня шероховатости площадь блика зеркального отражения увеличивается, но в тоже время его яркость — уменьшается. Если бы в каждом пикселе интенсивность отражения была одинаковой (независимо от размера блика), то более грубые поверхности испускали бы гораздо больше энергии, нарушая тем самым принцип её сохранения. Вот почему мы видим более интенсивные блики зеркального отражения на гладких поверхностях и более тусклые — на шероховатых поверхностях.

Для соблюдения принципа сохранения энергии нам необходимо провести четкое различие между рассеянным и отраженным светом. В тот момент, когда луч света попадает на поверхность, он расщепляется на две части: преломленную (refraction) и отраженную (reflection). Отраженная часть — это свет, который непосредственно отражается от поверхности и не проходит внутрь нее; то, что мы ранее определяли как зеркальное освещение. Преломленная часть — это оставшийся свет, который попадает на поверхность и поглощается ею; то, что мы ранее определяли как рассеянное освещение.

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

Как правило, не вся энергия поглощается материалом, и свет будет продолжать распространяться (в основном) в случайном направлении, снова и снова сталкиваясь с другими частицами, пока запас его энергии не истощится или он не покинет поверхность. Лучи света, вновь выходящие из поверхности, вносят свой вклад в наблюдаемый (диффузный) цвет поверхности. Однако, при PBR-рендеринге мы делаем упрощающее предположение, что весь преломленный свет поглощается и рассеивается на очень маленькой площади взаимодействия, игнорируя эффект от световых лучей, которые вышли бы из поверхности. Шейдерные приемы, которые это учитывают, известны как методы подповерхностного рассеивания, они значительно улучшают визуальное качество таких материалов, как кожа, мрамор или воск, но цена этому — снижение производительности.

Дополнительной тонкостью при рассмотрении вопроса отражения и преломления света становятся металлические поверхности. Металлические поверхности реагируют на свет иначе по сравнению с неметаллическими поверхностями (называемые диэлектриками). Металлические поверхности следуют тем же принципам отражения и преломления, но весь преломленный свет, не рассеиваясь, полностью поглощается. Это означает, что металлические поверхности оставляют только отраженный или зеркальный свет; металлические поверхности не имеют диффузных цветов. Из-за этого очевидного различия между металлами и диэлектриками, они по-разному обрабатываются в конвейере PBR-рендеринга, который мы рассмотрим далее.

Различие между отраженным и преломленным светом подводит нас к другому наблюдению, касающемуся сохранения энергии, а именно: что они — взаимоисключающие понятия. Какая бы световая энергия ни отражалась, она больше не будет поглощаться самим материалом. Таким образом, энергия, поглощенная поверхностью в виде преломленного света, является результирующей энергией после того, как мы отбросили отраженную составляющую.

Для выполнения закона сохранения энергии необходимо сначала вычислить зеркальную составляющую, т.е. процент энергии отраженного падающего света. Затем, доля преломленного света вычисляется непосредственно из зеркальной составляющей:

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

Уравнение отражения


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

Уравнение отражения на первый взгляд кажется пугающим, но, по мере того, как мы будем его анализировать, вы увидите, что оно постепенно начинает обретать смысл. Чтобы понять это уравнение, мы должны немного углубиться в фотометрию. Фотометрия — это совокупность методов измерения электромагнитного излучения, в том числе видимого света. Существует несколько фотометрических величин, которые мы можем использовать для измерения света вдоль направлений и поверхностей, но мы обсудим только одну, которая имеет отношение к уравнению отражения, известную как световое излучение (radiance), обозначенное здесь буквой L. Термин «световое излучение» используется для количественной оценки величины или силы света по заданному направлению в заданной точке пространства. Сначала это немного сложно понять, поскольку световое излучение — это комбинация нескольких физических величин, поэтому мы сосредоточимся в первую очередь на них:

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

Поток излучения измеряет общую площадь этой функции на разных длинах волн. Непосредственно принимать эту меру длин волн в качестве входных данных немного непрактично, поэтому мы упростим представление потока излучения не как функции изменяющейся длины волны и соответствующей энергии, а как тройки цвета, закодированного в RGB-формате (или, как мы обычно называем его: цвет света). Данное кодирование приводит к потере части информации, но это, как правило, незначительно для визуальных аспектов.

Телесный угол (обозначаемый как ω) — это часть пространства, которая является объединением всех лучей, выходящих из данной точки (вершины угла) и пересекающих некоторую поверхность (которая называется поверхностью, стягивающей данный телесный угол). Телесный угол можно представить, как направление с объемом:

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

Сила излучения (энергетическая сила света, англ. «radiant intensity») определяет величину потока излучения, распространяющегося от источника излучения, внутри малого телесного угла:

Уравнение для описания силы излучения определяется следующим образом:

Здесь I — это сила потока излучения Φ, переносимого через элемент поверхности, ограниченной телесным углом ω.

Зная величину потока излучения, силу излучения и телесный угол, мы можем составить уравнение энергетической яркости (англ. «radiance»). Энергетическая яркость описывается отношением потока излучения Φ, испускаемого (или принимаемого) с площадки A и распространяющегося в телесном угле ω, к площади проекции этой площадки на плоскость, перпендикулярную направлению распространения, и величине телесного угла ω:

Как можно видеть, сила светового потока является наибольшей, когда он прямо перпендикулярен поверхности. Это похоже на наше восприятие рассеянного освещения из урока о базовом освещении, поскольку cosθ непосредственно соответствует скалярному произведению между вектором направления света и нормалью поверхности:

Уравнение энергетической яркости весьма полезно, поскольку оно содержит основные физические величины, которые нас интересуют. Если считать телесный угол ω и площадь A — бесконечно малыми величинами, то мы можем использовать уравнение силы излучения для измерения потока одного луча света, падающего в заданную точку пространства. Это соотношение позволяет нам вычислить излучение одного светового луча, воздействующего на одну точку (фрагмент); мы фактически переводим телесный угол ω в вектор направления ω, а точку A — в точку p. Таким образом, мы можем напрямую использовать энергетическую яркость в наших шейдерах для вычисления вклада отдельно взятого луча света для каждого фрагмента.

На самом деле, когда речь заходит об энергетической яркости освещения, то нас интересует весь падающий (или входящий) в точку p свет, подобную сумму всего излучения мы будем называть облученностью (англ. «irradiance»). Зная и излучение, и облученность мы можем вернуться к уравнению отражения:

Теперь мы знаем, что буквой L в уравнении рендеринга обозначено излучение некоторой точки p и некоторого бесконечно малого телесного угла ωi, который можно рассматривать как входящий вектор направления ωi. Помните, что cosθ влияет на количество энергии излучения, ведь она зависит от угла падения света на поверхность, а его мы находим в уравнении отражения в виде скалярного произведения n ⋅ ωi. Уравнение отражения вычисляет сумму отраженного (или исходящего) излучения Lo(p,ωo) точки p в направлении ωo, которое является исходящим направлением к зрителю. Или, говоря иначе: Lo измеряет отраженную сумму световой облученности в точке p, если смотреть из точки ωo.

Уравнение отражения основано на облученности, которая является суммой всех входящих излучений, которые мы измеряем не только одного направления входящего света, но и всех направлений входящего света в пределах полусферы Ω с центром в точке p. Полусферу можно описать как половину сферы, ориентированной вдоль нормали поверхности n:

Для вычисления суммы значений внутри области или (в случае полусферы) объема мы используем математическую конструкцию, называемую интегралом, обозначаемую в уравнении отражения символом , по всем входящим направлениям i в пределах полусферы Ω. Интеграл измеряет площадь функции, которая может быть вычислена аналитически или численно. Поскольку нет аналитического решения как для уравнения рендеринга, так и для уравнения отражения, то мы будем решать интеграл численно. Это значит, что мы будем вычислять результат для малых дискретных шагов уравнения отражения по полусфере Ω и усреднять их результаты по размеру шага. Данные математические действия носят названия суммы Римана, которую мы можем реализовать в коде следующим образом:

При уменьшении диаметра разбиения dW, сумма будет стремиться к общей площади или объему фигуры, ограниченной заданной на множестве Ω функцией. Величину dW каждого дискретного шага можно рассматривать как дифференциал i в уравнении отражения. Математически i — это единый символ, по которому мы вычисляем интеграл, и хотя он не имеет прямого отношения к dW в коде (поскольку это дискретный шаг Римановой суммы), но мы можем считать его таковым. Имейте в виду, что дискретные шаги всегда дают нам аппроксимацию общей площади функции. Внимательный читатель заметит, что мы можем увеличить точность суммы Римана, увеличив количество шагов.

Уравнение отражения суммирует излучение всех входящих световых направлений ωi по полусфере Ω, попадающих в точку p, с помощью функции fr и возвращает сумму отраженного света Lo в направлении зрителя. Входящее излучение может исходить от источников света, с которыми мы уже знакомы по предыдущим урокам, или от карты окружающей среды, задающей излучение каждого входящего направления, но это мы обсудим на уроке про IBL.

Теперь единственным неизвестным остается символ fr, носящий название — BRDF (или «Двулучевая функция отражательной способности»), которая масштабирует или взвешивает входящее излучение на основе свойств материала поверхности.

Двулучевая функция отражательной способности (BRDF)

Двулучевая функция отражательной способности (сокр. «BRDF» от англ. «Bidirectional Reflectance Distribution Function») — это функция, которая в качестве входных данных принимает входящее (световое) направление ωi, исходящее (видовое) направление ωo, нормаль поверхности n и параметр поверхности a, представляющий шероховатость микроповерхности. BRDF аппроксимирует вклад каждого отдельно взятого луча света ωi в окончательное значение отраженного света от непрозрачной поверхности с учетом её свойств материала. Например, если объект имеет идеально гладкую поверхность (как зеркало), то BRDF-функция вернет 0.0 для всех входящих световых лучей ωi, за исключением одного луча, который имеет тот же (отраженный) угол, что и исходящий луч ωo, при котором функция возвращает значение 1.0.

BRDF моделирует отражательные и преломляющие свойства материала на основе ранее обсуждавшейся теории микрограней. Чтобы BRDF была физически правдоподобной, необходимо, чтобы соблюдался закон сохранения энергии, то есть сумма отраженного света никогда не должна превышать количество входящего света. Технически, модель Блинна-Фонга относится к BRDF, принимая в качестве входных данных значения ωi и ωo. Однако модель Блинна-Фонга не считается физически корректной, поскольку она не придерживается принципа сохранения энергии. Существует несколько физически обоснованных BRDF для моделирования реакции поверхности на свет. Однако почти все конвейеры PBR-рендеринга реального времени используют BRDF, известную как BRDF-модель Кука-Торренса.

Модель Кука-Торренса содержит как диффузную, так и зеркальную часть:

Здесь kd — это ранее упомянутый показатель входящей преломленной световой энергии, а ks — показатель отраженной световой энергии. В левой части BRDF указывается диффузная часть уравнения, обозначаемая символом flambert. Данный символ описывает Ламбертовское рассеяние, аналогичное тому, которое мы использовали для диффузного затенения. В рассматриваемом примере оно является постоянным коэффициентом:

Здесь c — это альбедо или цвет поверхности (диффузная текстура поверхности). Деление на π необходимо для нормализации рассеянного света, поскольку ранее обозначенный интеграл, содержащий BRDF, умножается на π (мы доберемся до этого на уроках про IBL).

Примечание: Вы можете задаться вопросом, как Ламбертовская диффузия соотносится с диффузным освещением, которое мы использовали раньше: цвет поверхности, умноженный на скалярное произведение между нормалью поверхности и направлением света. Скалярное произведение все еще здесь, просто оно переместилось из BRDF, т.к. мы находим n ⋅ ωi в конце интеграла Lo.

Существуют различные виды уравнений для диффузной части BRDF, которые, как правило, дают более реалистичный результат, но при этом являются и более дорогостоящими в вычислительном отношении. Однако, по мнению Epic Games, Ламбертового рассеяния достаточно для большинства задач рендеринга в реальном времени.

Зеркальная часть BRDF немного более продвинута и описывается следующим образом:

Зеркальная составляющая БРДФ модели Кука-Торренса состоит из трех функций и нормализирующего коэффициента в знаменателе. Каждый из символов D, F и G представляет собой тип функции, которая моделирует определенную часть отражательных свойств поверхности. Они носят названия функции нормального распределения (англ. «Distribution function»), уравнения Френеля (англ. «Fresnel equation») и геометрической функции (англ. «Geometry function»):

   Функция нормального распределения: аппроксимация распределения микрограней поверхности, ориентированных вдоль срединного вектора, влияющих на шероховатость поверхности; это основная функция аппроксимации микрограней.

   Уравнение Френеля: описывает соотношение поверхностного отражения при различных углах поверхности.

   Геометрическая функция: описывает свойство самозатенения микрограней. Когда поверхность относительно шероховата, одни микрограни могут затемнять другие микрограни, уменьшая свет, который отражает поверхность.

Каждая из этих функций является аппроксимацией их физических эквивалентов, и вы найдете множество различных версий данных функций, направленных на моделирование различными способами лежащей в их основе физики; некоторые из них более реалистичны, другие — более эффективны. Совершенно нормально выбрать любую версию этих функций, которую вы хотите использовать. Брайан Карис из Epic Games провел большое исследование различных типов моделей аппроксимаций. Мы собираемся задействовать те же функции, которые используются в движке Unreal Engine 4, созданного компанией Epic Game, которые относятся к т.н. классу функций модели Trowbridge-Reitz GGX (сокр. «GGX» от англ. «ground glass unknown». Более подробно об этом можно почитать здесь) — для D, приближением Френеля-Шлика — для F и Smith’s Schlick-GGX — для G.

Функция нормального распределения (NDF)

Функция нормального распределения (сокр. «NDF» от англ. «Normalized Determinant Function») D статистически аппроксимирует относительную площадь поверхности микрограней, в точности ориентированных вдоль срединного вектора h. Существует множество NDF, которые приближают общее выравнивание микрограней с учетом некоторого параметра шероховатости. Мы собираемся использовать функцию нормального распределения Trowbridge-Reitz GGX:

Здесь h — это срединный вектор, α — является мерой шероховатости поверхности. Если мы в качестве вектора h возьмем срединный вектор между нормалью поверхности и направлением света при различных параметрах шероховатости, то получим следующий визуальный результат:

Когда значение шероховатости маленькое (т.е. поверхность гладкая), то большое количество микрограней, ориентированных вдоль срединного вектора, будет сконцентрировано в небольшом радиусе. Благодаря такой высокой концентрации, NDF представляет собой очень яркое пятно. Однако на шероховатой поверхности, где микрограни, ориентированные вдоль срединного вектора h, разбросаны по гораздо большей площади, мы получим более сероватые результаты.

Средствами GLSL функция нормального распределения Trowbridge-Reitz GGX преобразуется в следующий код:

Геометрическая функция

Геометрическая функция статистически аппроксимирует площадь поверхности, где микрограни, перекрывая друг друга, вызывают окклюзию световых лучей.

Подобно NDF, геометрическая функция принимает параметр шероховатости материала в качестве входных данных, при котором более грубые поверхности будут иметь более высокую вероятность затенения микрограней. Геометрическая функция, которую мы собираемся использовать, представляет собой комбинацию GGX и приближения Шлика-Бекмана, известная как Schlick-GGX:

Здесь k — это переназначение переменной α, основанное на том, используем ли мы геометрическую функцию для прямого освещения, либо для освещения IBL:

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

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

Использование метода Смита с Schlick-GGX в качестве Gsub дает следующий визуальный вид при различной шероховатости R:

Геометрическая функция представляет собой множитель из диапазона [0.0, 1.0], где 1.0 (или белый) означает «без затенения микрограней», а 0.0 (или черный) — «полное затенение микрограней».

В GLSL геометрическая функция преобразуется в следующий код:

Уравнение Френеля

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

Каждая поверхность или материал имеет уровень базовой отражательной способности при взгляде перпендикулярно поверхности, но при взгляде на поверхность под углом все отражения становятся более очевидными по сравнению с базовой отражательной способностью поверхности. Вы можете проверить это сами, посмотрев на свой (предположительно) деревянный/металлический стол, который имеет определенный уровень базовой отражательной способности с перпендикулярного угла обзора, но, посмотрев на свой стол под углом, близким к 90 градусов, вы увидите, что отражения становятся гораздо более очевидными. Теоретически, все поверхности полностью отражают свет, если смотреть на них под идеальным углом 90 градусов. Это явление известно, как эффект Френеля и описывается уравнением Френеля.

Уравнение Френеля — довольно сложное уравнение, но, к счастью, его можно аппроксимировать с помощью приближения Френеля-Шлика:

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

Есть несколько тонкостей, связанных с уравнением Френеля. Во-первых, приближение Френеля-Шлика фактически определено только для диэлектрических или неметаллических поверхностей. Для поверхностей проводников (металлов) расчет базовой отражательной способности с индексами преломления не выполняется должным образом, и нам нужно использовать другое уравнение Френеля для проводников. Поскольку это неудобно, то мы дополнительно предварительно вычислим отклик поверхности при нормальном падении (F0) под углом 0 градусов (как будто смотрим прямо на поверхность). А далее интерполируем это значение на основе угла обзора в соответствии с приближением Френеля-Шлика, в результате чего мы можем использовать одно и то же уравнение как для металлов, так и для неметаллов.

Отклик поверхности при нормальном падении, или базовую отражательную способность, можно найти в больших базах данных, подобных этим, с некоторыми из наиболее распространенных значений, перечисленных ниже, взятых из заметок курса Нати Хоффман:

Здесь интересно отметить, что для всех диэлектрических поверхностей базовая отражательная способность никогда не превышает 0.17, что является скорее исключением, чем правилом, в то время как для проводников базовая отражательная способность начинается гораздо выше и (в основном) колеблется между 0.5 и 1.0. Кроме того, для проводников (или металлических поверхностей) базовая отражательная способность имеет тонировку. Вот почему F0 представлено в виде RGB-тройки (отражательная способность при нормальном падении может варьироваться в зависимости от длины волны); это то, что мы видим только на металлических поверхностях.

Данные специфические свойства металлических поверхностей по сравнению с диэлектрическими породили так называемый подход на основе принципа металличности материала. При данном подходе мы создаем поверхностные материалы с дополнительным параметром, известным как металличность (metalness), который описывает, является ли поверхность металлической или неметаллической.

Примечание: Теоретически, металличность материала имеет только два состояния, а именно: либо металл, либо не металл; материал не может быть и тем, и другим. Однако большинство конвейеров рендеринга позволяют линейно настраивать металличность поверхности в диапазоне значений от 0.0 до 1.0. Это происходит главным образом из-за отсутствия достаточной точности текстуры материала. Например, поверхность, имеющую мелкие (неметаллические) частицы пыли/песка/царапины на металлической поверхности, трудно визуализировать, ведь материал не может пребывать в двух состояниях одновременно.

Предварительно вычисляя F0 как для диэлектриков, так и для проводников, мы можем использовать одно и то же приближение Френеля-Шлика для обоих типов поверхностей, но если у нас есть металлическая поверхность, то нужно будет подтонировать базовую отражательную способность. Обычно мы делаем это следующим образом:

Мы определяем базовую отражательную способность, которая подходит для большинства диэлектрических поверхностей. Это еще одно приближение, поскольку F0 усредняется для наиболее распространенных диэлектриков. Базовая отражательная способность 0.04 имеет место для большинства диэлектриков и дает физически правдоподобные результаты без необходимости создавать дополнительный параметр поверхности. Затем, основываясь на том, как выглядит металлическая поверхность, мы либо берем базовую отражательную способность, либо F0 в качестве цвета поверхности. Поскольку металлические поверхности поглощают весь преломленный свет, они не имеют диффузных отражений, и мы можем непосредственно использовать цветовую текстуру поверхности в качестве базовой отражательной способности.

В коде приближение Френеля-Шлика будет выглядеть следующим образом:

При этом cosTheta является результатом операции скалярного умножения между нормалью поверхности n и срединным вектором h (или вектором вида v).

Уравнение отражения Кука-Торренса

Теперь, зная все компоненты BRDF модели освещения Кука-Торренса, мы можем добавить физически корректную BRDF в окончательное уравнение отражения:

Однако это уравнение не является полностью математически корректным. Возможно, вы помните, что уравнение Френеля F представляет собой показатель количества света, который отражается на поверхности. Это фактически наш коэффициент ks, то есть зеркальная (BRDF) часть уравнения отражения неявно содержит показатель отражения ks. Учитывая это, наше прям совсем окончательное уравнение отражения принимает следующий вид:

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

Создание PBR-материалов


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

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

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

   Нормаль. Текстура карты нормалей точно такая же, как мы использовали ранее на уроке про карты нормалей. Карта нормалей позволяет нам задать для каждого фрагмента уникальную нормаль, чтобы создать иллюзию того, что поверхность более бугристая, чем её плоский прототип.

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

   Шероховатость. Карта шероховатости указывает для каждого текселя то, насколько шероховатой является поверхность. Сэмплированное значение шероховатости влияет на статистическую ориентацию микрограни поверхности. Более грубая поверхность получает более широкие и размытые отражения, в то время как гладкая поверхность получает сфокусированные и четкие отражения. Некоторые PBR-движки работают с картой гладкости вместо карты шероховатости, которую некоторые художники находят более интуитивно понятной. Затем эти значения преобразуются в шероховатость (1.0 − smoothness) в момент их выборки.

   AO (Ambient Occlusion). Карта фонового затенения (или просто «AO-карта») определяет дополнительный коэффициент затенения поверхности и окружающей геометрии. Например, если у нас есть поверхность кирпича, то текстура альбедо не должна содержать никакой информации о тенях внутри трещин кирпича. Однако АО-карта описывает эти затемненные грани. Учет фонового затенения в конце этапа освещения может значительно повысить визуальное качество вашей сцены. AO-карта меша/поверхности либо генерируется вручную, либо предварительно вычисляется в программах 3D-моделирования.

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

Дополнительные ресурсы

   Background: Physics and Math of Shading by Naty Hoffmann: если вы хотите узнать больше о физике света и о том, как она связана с PBR-теорией, то обязательно прочтите данный материал.

   Real shading in Unreal Engine 4: обсуждается PBR-модель, принятая компанией Epic Games в 4-й версии движка Unreal Engine. Система PBR, на которой мы остановимся на наших уроках, основана именно на данной PBR-модели.

   [SH17C] Physically Based Shading, by knarkowicz: отличная демонстрация всех отдельных PBR-элементов в интерактивном приложении ShaderToy.

   Marmoset: PBR Theory: введение в PBR для художников.

   Coding Labs: Physically based rendering: введение в уравнение рендеринга и его связь с PBR.

   Coding Labs: Physically Based Rendering — Cook–Torrance: введение в BRDF модели Кука-Торренса.

   Wolfire Games — Physically based rendering: введение в PBR от Lukas Orsvärn.

   [SH17C] Physically Based Shading: отличный интерактивный пример (предупреждение: может занять некоторое время для загрузки) от Krzysztof Narkowi, демонстрирующий взаимодействие света и PBR-материала.


Оценить статью:

Звёзд: 1Звёзд: 2Звёзд: 3Звёзд: 4Звёзд: 5 (4 оценок, среднее: 5,00 из 5)
Загрузка...

Комментариев: 4

  1. Аватар Виталий:

    В уравнении Френеля-Шлика вместо серединного вектора должен быть вектор нормали

    1. Дмитрий Бушуев Дмитрий Бушуев:

      Если я правильно вас понял, речь идёт об этом уравнении:

      F(h, v, F0) = F0 + (1 — F0)(1 — (h * v))^5

      из раздела:
      https://ravesli.com/urok-40-fizicheski-korrektnyj-rendering-pbr-v-opengl/?replytocom=14423#toc-7

      Если обратиться к первоисточнику Christophe Shlick — An Inexpensive Model for Physically-Based Rendering, то на стр. 8 будет представлено данное уравнение в виде:

      F(u) = f + (1 — f)(1 — u)^5, где u — это скалярное произведение (H * V) (стр. 2).

      Далее, если поразмыслить, то становится понятно, что данная формула даёт максимальный эффект тогда, когда скалярное произведение равно 0. А это будет соответствовать тому случаю, когда вектор вида V будет ортогонален вектору нормали N, а вектор направления входящего света V' будет симметричным отражением вектора вида V относительно вектора нормали N.
      Единственное скалярное умножение, которое будет давать 0 в данной ситуации, это — (H * V), эквивалентное произведению (H * L), где L — вектор света.
      Скалярное произведение не может иметь вид (N * V), т.к. в этом случае оно не зависит от вектора света L. Также, произведение не может иметь вид (N * H), т.к. в этом случае оно будет возвращать значение 1, вместо 0.
      Как-то так… 🙂

      P.S. Ссылка на книгу — https://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.50.2297&rep=rep1&type=pdf

  2. Аватар Сергей:

    А про Кватернионы будет?

    1. Аватар Данил:

      А кватернионы используются в программирование, если да, то можете дать ссылку на какую-нибудь информацию, интересно было бы почитать

Добавить комментарий

Ваш E-mail не будет опубликован. Обязательные поля помечены *