Mental ray 3.3 для 3ds max. Часть 3.

Физическая модель подповерхностного рассеяния в mental ray – SSS Physical Material


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

Используемый в настоящее время алгоритм расчета диффузного цвета довольно прост и не отвечает современным требованиям. Ему на замену (или, может быть, - в дополнение) приходят новые методы.

Данный обзор посвящен одному из таких методов - расчету диффузного отражения в результате подповерхностного рассеяния света, реализованному в mental ray материалами и шейдерами типа SSS Physical (другое название - miss_physical).



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

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

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

Однако хотя этот факт и малоизвестен, еще в 1914 году было доказано, что диффузный характер отражения нельзя объяснить только микрорельефом, точнее, в принципе не может существовать микрорельефа поверхности, который бы позволил получить равномерное изотропное отражение.

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

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

Это объяснение является достаточно корректным с точки зрения физики, но имеет один существенный недостаток. Это качественная модель, описывающая происходящие со светом процессы "на пальцах". По большому счету, все что мы могли до недавних пор задавать для диффузных характеристик поверхностей – произвольное значение диффузного цвета, никак не связанное с индивидуальными диффузными характеристиками материала и законами подповерхностного рассеяния. То есть, одинаковым образом и для металлов, которые таким рассеянием не обладают, и для органических материалов с сильным подповерхностным рассеянием. Чтобы учесть все многообразие диффузных свойств различных материалов нам нужна количественная модель, позволяющая настраивать соответствующие параметры индивидуальных материалов.

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

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

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



Это уравнение получено исходя из закона сохранения энергии и является просто выражением на языке математики того, как изменяется поток энергии света при прохождении через материал:



изменение потока света L (x, w) в точке объема материала x с направлением распространения потока w при бесконечно малом смещении ds из точки x в направлении s обусловлено тремя причинами:

1. затуханием в результате рассеяния и поглощения вдоль пути смещения ds:



ut – коэффициент затухания, равный сумме коэффициентов поглощения и рассеяния;

2. приростом за счет света, распространяющегося по всем другим направлениям w’, но изменившим направление распространения на w в результате рассеяния:



us – коэффициент рассеяния,
p (w, w’) – фазовая функция рассеяния материала, определяющая какая часть излучения, пришедшего по направлению w’ будет распространяться в направлении w. Интеграл в этом выражении появляется, поскольку необходимо рассматривать все входящие в точку x направления в пределах 360 градусов.

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



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



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

Интегрирование линейного уравнения переноса по всем направлениям входящего излучения w вдоль сегмента ds в точке x позволяет получить другое уравнение, определяющее величину изменения освещения на единицу длины в произвольной точке рассеивающего объема как функцию падающего на поверхность объекта освещения от источников света. Такое уравнение называют уравнением объемного рендеринга, оно является основополагающим для расчета объемных эффектов.

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

Эта проблема может быть разрешена несколькими способами. Один из них – решение уравнения численными методами, например, методом Монте-Карло. Главный недостаток такого подхода в его медленности, неприемлемой для современных производственных условий, а главное преимущество – высокая точность результата. Конечно, ситуация со временем может измениться, поскольку главным ограничителем выступает вычислительная мощность современных персональных компьютеров.

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

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

Коэффициент поглощения (absorption coefficient) ua – описывает свойство поглощения света материалом. Количественно определяет вероятность взаимодействия света с материалом при прохождении расстояния единичной длины. Если луч света проходит в материале расстояние длиной х и коэффициент ua является постоянным в пределах объема объекта, вероятность P прохождения пути х без поглощения материалом определяется как Pa = exp {-ua * х}. В случае, если ua зависит от координат, например, для сложных по составу материалов, или материалов с неоднородной плотностью



Коэффициент рассеяния (scattering coefficient) us - количественно определяет вероятность рассеяния света при прохождении лучом пути единичной длины. Для расстояния x вероятность прохождения пути х без рассеяния определяется как Ps = exp {-us * x}, если us постоянная величина, и



если us изменяется в пределах объема объекта.

Коэффициент затухания (coefficient of extinction) ut - сумма коэффициентов поглощения и рассеяния. Определяет полную вероятность взаимодействия света с материалом, в случае постоянных коэффициентов вероятность прохождения пути х без поглощения и рассеяния определяется как Pt = {-exp (ut * x)} = {-exp ((ua + us)*x)}.

Коэффициенты, используемые в уравнении линейного переноса излучения - это вероятности взаимодействия света с материалом, то есть коэффициенты Pa, Ps и Pt.

Усредненная длина свободного пробега (mean free path length) Lu = 1 / ut и измеряется в обратных единицах длины, например, 1/мм. Характеризует максимальную длину пути, которую свет может пройти без взаимодействия (поглощения и/или рассеяния).

Альбедо albedo = us / (us + ua) = us / ut. Albedo характеризует соотношение свойств рассеяния и поглощения. Если величина albedo близка к 1, это означает, что рассеяние света в материале намного сильнее, чем поглощение: us >> ua. Если albedo близко по величине к 0 - поглощение преобладает над рассеянием: us << ua.

Фазовая функция рассеяния определяет вероятность рассеяния света на тот или иной угол относительно первоначального направления. Другими словами, если 100 лучей "приходит" в точку x, то фазовая функция позволяет определить количественное распределение лучей по всем возможным углам рассеяния в пределах 360 градусов. Определение вида фазовой функции конкретного материала задача очень непростая, поскольку ее свойства будут определяться микро- и макроскопическими размерами рассеивающих частиц, их формой и ориентацией в пространстве, а также - соотношением диаметра частиц с длинами волн рассеиваемого света. Реальные материалы сложны по составу и, как правило, содержат смесь самых разных частиц и поэтому вывести для них точный вид фазовой функции довольно сложно.

В компьютерной графике принято использовать упрощенную универсальную фазовую функцию, которая не зависит от координат точки в пределах объема рассеивающего материала, а зависит только от угла между первоначальным направлением луча и направлением рассеянного луча света. Это формула Henyey-Greenstein, которая имеет вид:



здесь g полностью определяет рассеивающие свойства материала и может изменяться от -1 до 1, j - угол между направлением падения и направлением рассеяния луча света, а p(cosj) - вероятность рассеяния на угол j. Если g = -1, рассеяние будет происходить преимущественно "назад". Если g = 0, то рассеяние будет происходить равномерно во всех направлениях, при g = 1 рассеяние происходит "вперед".



Используя формулу Henyey-Greenstein, для любого конкретного значения g можно построить график зависимости p(cosj) от j, перебирая все возможные углы рассеяния с некоторым шагом и вычисляя p. Такой график позволяет визуально представить форму однократного рассеяния света в материале для заданного g, например, в mathcad.

В вычислениях также используются:

  • reduced scattering coefficient us1 = us (1-g);
  • reduced extinction coefficient ut1 = us1 + ua;
  • reduced mean free path = 1/ ut1;
  • reduced albedo = us1 / ut1.

Значения всех этих параметров отображаются в логе mental ray при рендере с использованием шейдера miss_physical:

PHEN 0.2 info : "misss_physical_phen::physshader" channels 0 1 2:
PHEN 0.2 info : albedo: 99.8004 99.7955 99.2582
PHEN 0.2 info : reduced albedo: 99.2063 99.1870 97.0973
PHEN 0.2 info : extinction coefficient: 0.7014 1.2225 1.9142
PHEN 0.2 info : reduced extinction coefficient: 0.1764 0.3075 0.4892
PHEN 0.2 info : mean free path length: 1.4257 0.8180 0.5224
PHEN 0.2 info : reduced mean free path length: 5.6689 3.2520 2.0442

Экспериментальные исследования рассеяния света в различных материалах показали, что все процессы взаимодействия можно разбить на две части: отражение света в объеме материала в результате однократного рассеяния и отражение в результате многократных (два и более) рассеяний. Так, Pat Hanrahan и Wolfgang Krueger в статье "Reflection from Layered Surfaces due to Subsurface Scattering" приводят интересные данные о соотношении вкладов от одно- и многократных рассеяний света:



График соотношения вкладов от одно- и многократных рассеяний света для полубесконечных сред с различными альбедо. Штриховые линии - вклад одно-, двукратных и т.д. рассеяний, сплошная линия - полное отражение в результате учета подповерхностного рассеяния, по данным Pat Hanrahan и Wolfgang Krueger

Как хорошо видно из графика, даже для сильно рассеивающих материалов величина вклада от однократного рассеяния вовсе не равна нулю, а стремится к некоторому предельному числу - около 15%. Для слабо рассеивающих сред одноактное рассеяние фактически полностью определяет общее рассеивание света.

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

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

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

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

Pat Hanrahan и Wolfgang Krueger исследовали также зависимость величин вкладов от углов отражения. Вывод, который ими получен, гласит, что однократное рассеяние скорее подчиняется не закону Ламберта, а закону Seeliger: cos ji / (cos ji + cos jr), ji - угол падения света, jr - угол отражения света. А вот многократное рассеяние приблизительно удовлетворяет закону Ламберта.

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

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



Фотография распределения подповерхностного рассеяния от освещения листа дерева монохромным лазером. Яркое центральное световое пятно - однократное рассеяние, ореол света меньшей интенсивности вокруг него - многократное рассеяние света. По данным Neil Blevins.

Такой же подход, разделение рассеяния света на одно- и многократное использует и Henrik Wann Jensen в статье "A Practical Model for Subsurface Light Transport", которая является математической основой алгоритма шейдера miss_physical, используемого в mental ray.

Для однократного рассеяния Jensen предложил простую процедуру численного нахождения его вклада с использованием метода Монте-Карло.



Схема сэмплирования для расчета вклада от однократного рассеяния света

Согласно этой схеме, луч от камеры трассируется до пересечения с поверхностью, частично отражается от нее, проникает под поверхность и преломляется в соответствии с законом Фреснеля. Для вычисления вклада однократного рассеяния для каждого луча камеры используется техника ray marching - вдоль траектории луча под поверхностью выбирается заданное число пробных точек (сэмплов), разделенных интервалами случайной длины d = log r / ut, где r - случайная величина, изменяющаяся в пределах от 0 до 1. В каждой точке - сэмпле строится луч в направлении всех источников света в сцене. Полный вклад от однократных рассеяний для луча камеры является суммой вкладов от всех сэмплирующих точек с учетом затухания.

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

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

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

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



Схема дипольной аппроксимации

Высота и глубина источников определяются так, чтобы были удовлетворены некоторые граничные условия для поверхности объекта.

Исходя из этого, а также считая рассеивающий объект полубесконечной средой с плоской границей, Jensen получил формулу для расчета вклада от диффузного многократного отражения (см. ту же статью).

В программе рендеринга вычисление вклада от многократного рассеяния выполняется методом Монте-Карло. При этом сэмплы выбираются внутри площадки некоторого диаметра на поверхности объекта с центром в точке вхождения луча, а вклад от одного сэмплирующего луча определяется по формуле для дипольной аппроксимации. Такое сэмплирование предполагает случайное изменение обоих концов сэмплирующих лучей: начала луча в пределах площадки диаметром d на поверхности и конца луча на источнике света, если это протяженный, а не точечный источник.

Полное подпространственное рассеяние рассчитывается как сумма однократного рассеяния и многократного рассеяния света в объеме материала.

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




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

Основываясь на этом, Jensen вводит понятие BSSRDF - Bidirectional SubSurface Reflectance Distribution Function, которая связывает освещение, падающее в одной точке, с отражением света поверхностью в любой другой ее точке. Вычисление полного отражения (потока рассеянного освещения) в некоторой точке требует интегрирования падающего потока, вообще говоря, по всем точкам поверхности рассеивающего объекта и по всем направлениям входящего потока в каждой точке поверхности. Учет экспоненциального затухания рассеянного освещения позволяет уменьшить область интегрирования, но даже в этом случае речь идет о расчете сотен и даже тысяч сэмплов на каждый рассеянный луч. Это объясняет, почему расчет подповерхностного рассеяния "в лоб" является очень высокозатратной задачей.



При отсутствии подповерхностного рассеяния BSSRDF вырождается в обычную BRDF, которая связывает падающий свет с отраженным светом в одной и той же точке поверхности и требует для вычисления отражения интегрирования только по всем направлениям входящего потока в одной точке - точке падения луча.

В 2002 году на SIGGRAPH Jensen и Buhler представили модификацию расчета вклада от многократных отражений - Rapid Hierarchical Rendering Technique. Для материалов с сильными свойствами рассеивания (значениями альбедо близкими к 1) расчет вклада от многократных рассеяний вышеописанным способом сэмплирования становится неэффективным, медленным. Вызвано это тем, что приходится просчитывать все большие площади поверхности возле точки вхождения лучей и требует это все большего числа сэмплов. Для преодоления этого недостатка Rapid Hierarchical Rendering Technique использует две основные идеи.

Первая заключается в разделении расчетов освещенности поверхности от источников света и расчетов многократных рассеяний на два самостоятельных и независимых этапа.

Расчет освещенности от источников света выполняется один раз для выбранных по некоторому правилу точек поверхности. При этом становится возможным использовать уже наработанные методы расчета освещенности, включая scan-line, raytracing и даже GI, в том числе - фотонные карты. Рассчитанная освещенность выбранных точек сохраняется в файл в виде специальной структуры данных - octree или kd-tree.

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

Вторая идея состоит в том, что для расчета многократных рассеяний применяется так называемая техника быстрых иерархических вычислений (rapid hierarchical evaluation), которая использует рассчитанные освещенности точек от входящего света, выбирая нужные из файла, а не рассчитывая их каждый раз по новой. Точки разбиваются на вложенные группы-кластеры, упорядоченные в древовидную структуру данных (oktree). Каждый родительский кластер хранит групповое значение освещенности всех своих потомков, более мелких кластеров, самый мелкий кластер содержит освещенности некоторого небольшого числа точек. Это позволяет учитывать рассчитанные освещенности покластерно, в зависимости от их близости к точке, для которой вычисляется освещение от многократного рассеяния.

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

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

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

На втором проходе строится луч от камеры в направлении рассеивающего объекта и для оценки освещенности от подповерхностного рассеяния используется ray marching. Для этого находится точка пересечения луча камеры и поверхности рассеивающего объекта и преломление луча камеры при пересечении поверхности. Вдоль пути луча камеры в рассеивающем материале выбираются сэмплирующие точки, расположенные на некотором случайном расстоянии друг от друга (ситуация сходна с сэмплированием однократных рассеяний). Для каждой сэмплирующей точки в пределах сферы заданного радиуса просматриваются записи о рассеянии фотонов, сделанные на первом проходе, и по ним делается оценка освещенности от сэмпла. Суммарная освещенность для луча является суммой освещенностей сэмплов, с учетом затухания (длины пути до выхода на поверхность). Радиус сферы, а также число просматриваемых записей о рассеянных фотонах задаются в настройках рендера.

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

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

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

Число отслеживаемых фотонных рассеяний задается в настройках рендера. Это число определяет слой некоторой глубины относительно поверхности объекта, в пределах которого отслеживаются фотоны. Такой слой называют shallow layer. Максимальную глубину этого слоя можно определить умножив заданное число отслеживаемых рассеяний на усредненную длину свободного пробега, которая определяется коэффициентами рассеяния и поглощения материала.

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

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

Все три типа расчетов подповерхностного рассеяния - метод однократного рассеяния, метод диффузной дипольной аппроксимации многократного рассеяния и метод многократного рассеяния фотонов используются шейдером miss_physical.

Подведем небольшой итог и перечислим основные свойства этих методов.

1. Однократное рассеяние. Вклад этого типа рассеяния существенен для большинства реальных материалов с подповерхностным рассеянием. Несет в себе информацию о характере анизотропии рассеяния материала (фазовой функции)- если рассеяние происходит по некоторому выделенному направлению, такую же форму будет иметь и однократное рассеяние. Расчет величины вклада однократного рассеяния определяется интенсивностью прямых источников света и не требует испускания фотонов. Освещение на поверхности рассеивающего объекта от этого типа рассеяния затухает по экспоненте и быстрее освещения от многократных рассеяний для сильнорассеивающих материалов.

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

2. Дипольная диффузная аппроксимация. Позволяет учесть вклад от многократных рассеяний. Излучение от многократных рассеяний является изотропным вне зависимости от фазовой функции материала и анизотропии источников света. Величина вклада этого типа рассеяния возрастает для материалов с сильными рассеивающими свойствами. Освещение на поверхности рассеивающего объекта от этого типа рассеяния затухает по экспоненте, но медленнее, чем для однократного рассеяния. Расчет вклада от многократного диффузного рассеяния может учитывать как прямое освещение, так и непрямое, в том числе и каустику. Использование метода дипольной диффузной аппроксимации в mental ray обязательно требует испускания фотонов (caustic или GI) от источников света.

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

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

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

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

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

Шейдер miss_physical

Рассмотрев математическую модель, лежащую в основе шейдера miss_physical, перейдем теперь к изучению настроечных параметров шейдера, реализующих эту модель в рамках mental ray.

Спецификация шейдера в mental ray выглядит следующим образом:

declare shader
"misss_physical" (
color "material",
color "transmission",
scalar "ior",
vector "absorption_coeff",
vector "scattering_coeff",
scalar "scale_conversion",
scalar "scattering_anisotropy",
scalar "depth",
integer "max_samples",
integer "max_photons",
scalar "max_radius",
boolean "approx_diffusion",
boolean "approx_single_scatter",
boolean "approx_multiple_scatter",
array light "lights"
)
version 3
apply material, photon
end declare

а интерфейс шейдера в 3ds max выглядит вот так:



Описание и назначение параметров.

1. Параметр material позволяет определять дополнительные свойства поверхности рассеивающего объекта - цвет, текстуру, шейдер или материал. При этом в каждой точке заданный поверхности цвет, цвет текстуры или цвет возвращаемый назначенным поверхности шейдером или материалом "модулируется" законом Фреснеля - интенсивностью отраженного света, вычисленной в этой же точке по закону Фреснеля с учетом интенсивности и направления светового потока от источников, нормали поверхности в точке и коэффициентов преломления окружения и материала.

Нейтральный серый цвет поверхности выступает как "чистый усилитель" и может служить регулятором силы отражения поверхности. Черный цвет полностью выключает отражение. Белый цвет делает интенсивность отражения максимальной.

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

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

2. Параметр transmission позволяет "фильтровать" проходящее под поверхность освещение. Величина проходящего освещения опять же определяется законом Фреснеля и зависит от источников света, нормали поверхности в данной точке и коэффициентов преломления окружения и материала (если окружение - воздух, то только материала).

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

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

3. параметр ior - индекс рефракции (преломления) света в рассеивающем материале. Используется в вычислениях количества пропущенного под поверхность и количества отраженного на поверхности света от источников по закону Фреснеля.

4. параметр absorption_coeff характеризует ослабление светового потока в результате поглощения при его прохождении через среду. Измеряется в обратных единицах длины, 1/мм. Произведение коэффициента и длины пути луча света (фотона) х - величина безразмерная и характеризует вероятность прохождения фотоном без поглощения пути длиной х по закону 1/exp {uax}. Этот параметр имеет тот же смысл, что и коэффициент поглощения в математической модели.

При использовании коэффициента поглощения важно учитывать соотношение между единицами измерения коэффициента (это всегда миллиметры) и единицами измерения в сцене и правильно указывать scale_conversion.

Значение absorption_coeff задается по отдельности для разных длин волн (для трех основных цветов модели RGB) и может иметь цифровые значения, или определяться из растровых карт, или из 3d процедурных карт.

5. параметр scattering_coeff - коэффициент рассеяния, характеризует рассеяние света при прохождении через среду, измеряется в обратных единицах длины. Произведение коэффициента рассеяния на длину пути луча света (фотона) - величина безразмерная и характеризует вероятность прохождения фотоном пути длиной x без рассеяния (изменения первоначального направления траектории) по закону 1/exp {usx}, аналогичен коэффициенту рассеяния математической модели. Также важно учитывать соотношение единиц измерения коэффициента (мм) и сцены.

Значение scattering_coeff задается по отдельности для разных длин волн и может иметь не только цифровые значения, но определяться из карты, как 2d, так и 3d процедурных карт.

6. параметр scale_conversion управляет преобразованием при согласовании единиц измерения коэффициентов и единиц измерения сцены, если они разные. Для шейдера miss_physical единицы измерения фиксированы - это всегда миллиметры. Если, например, единицы измерения сцены - см, то тогда scale_conversion = 10, поскольку 1см = 10 мм.

7. параметр scattering_anisotropy определяет преимущественный тип рассеяния и по смыслу идентичен определению типа универсальной фазовой функции рассеяния Henyey-Greenstein математической модели. Фактически scattering_anisotropy определяет значение переменной g фазовой функции. Диапазон возможных значений параметра лежит в пределах от -1 до 1. Значение -1 соответствует типу анизотропного рассеяния преимущественно "назад", 0 - изотропное рассеяние во всех направлениях, 1 - анизотропное рассеяние "вперед".

8. параметр depth определяет толщину слоя, в пределах которого отслеживаются фотоны. Указывая значение depth, мы определяем глубину слоя, или shallow layer, в пределах которого расчет рассеяний и поглощений фотонов выполняется точно. Глубина слоя вычисляется как произведение depth на усредненную длину свободного пробега фотона.

Часть объема, лежащая глубже shallow layer, обсчитывается менее точным и более быстрым методом дипольной диффузной аппроксимации, а слой называют diffuse layer.

9. Параметр max_samples определяет количество промежуточных точек (или сэмплов), в которых выполняется расчет освещенности от рассеяния, для каждого луча, испускаемого от камеры (наблюдателя). Промежуточные точки формируют значение общей освещенности для луча при помощи техники ray marching. Параметр используется при расчете однократных рассеяний и многократных рассеяний трассировкой фотонов. Неприменим (не используется) для метода диффузной дипольной аппроксимации. Типичные значения лежат в пределах 10 - 30 сэмплов на один луч.

10. Параметр max_photons задает максимальное число собираемых фотонов из карты рассеяний фотонов для оценки освещенности каждого сэмпла (см. max_samples) в расчетах многократных рассеяний трассировкой фотонов. "Рабочие" значения этого параметра могут составлять несколько тысяч фотонов для одного сэмпла.

11. Параметр max_radius определяет максимальный радиус сферического объема с центром в сэмпле, в пределах которого выполняется поиск и сбор фотонов. Единицы измерения радиуса - миллиметры, вне зависимости от единиц измерения сцены. Лог mental ray обеспечивает статистику по количеству фактически собираемых фотонов при данных настройках. Из лога всегда можно точно узнать сколько фотонов действительно собирается в пределах заданного радиуса, что очень удобно для коррекции настроек.

PHEN 0.2 info : "misss_physical_phen::physshader" multi-scatter photons per sample:
PHEN 0.2 info : samples: 33172
PHEN 0.2 info : minimum: 550.0000
PHEN 0.2 info : maximum: 4000.0000
PHEN 0.2 info : mean: 2338.3762
PHEN 0.2 info : variance: 2083465.8375

Приведенная выдержка из лога содержит информацию о сборе 4000 фотонов в пределах некоторого радиуса:

minimum - минимальное число собираемых фотонов;
maximum - максимальное число собираемых фотонов;
mean - среднее число собираемых фотонов на один сэмпл.

Вывод, который можно сделать из приведенной статистики сбора, - необходимость увеличить радиус сбора и/или количество испускаемых источником фотонов, чтобы обеспечить требуемые 4000 на сэмпл, поскольку среднее число собираемых фотонов при текущих настройках составляет 2338, то есть около половины требуемого количества.

12. Группа параметров

  • approx_diffusion
  • approx_single_scatter
  • approx_multiple_scatter,
каждый может принимать два значения - true и false, что приводит к отключению или включению того или иного метода расчета подповерхностного рассеяния: метода дипольной диффузной аппроксимации, расчета однократного рассеяния и расчета многократных рассеяний методом трассировки фотонов соответственно. Можно включать и отключать использование этих методов в произвольной комбинации, правда, не все комбинации имеют смысл, см. математическую модель рассеяния.

Эти параметры скрыты в интерфейсе шейдера 3ds max со значением по умолчанию "on" для всех трех методов, то есть все три типа расчетов выполняются по умолчанию. Сделать эти параметры доступными в интерфейсе настроек шейдера можно отредактировав файл subsurface.mi (находится в папке: корневая директория 3ds max/mentalray/shaders_standard/include). Нужно открыть файл в текстовом редакторе, найти SSS physical shader и SSS physical material (достаточно выполнить поиск по "SSS physical") и удалить ", hidden" в разделе gui:

control "approx_diffusion" "boolean" (
"uiName" "Approx. diffusion",
"value" 1,
"hidden"
)
control "approx_single_scatter" "boolean" (
"uiName" "Approx. single scattering",
"value" 1,
"hidden"
)
control "approx_multiple_scatter" "boolean" (
"uiName" "Approx. multiple scattering",
"value" 1,
"hidden"
)

Удалять нужно ", hidden".

15. Параметр lights позволяет указать источник света, от которого рассчитывается подповерхностное рассеяние, делать это нужно обязательно.

Для расчета освещения материала с подповерхностным рассеянием можно использовать два способа. Первый предполагает назначение шейдера miss_physical (SSS Physical shader в редакторе материалов 3ds max) с одинаково настроенными параметрами одновременно и в слот материала поверхности и в слот фотонных свойств поверхности через mental ray Connection.

Второй способ проще - в списке материалов 3ds max 7 есть SSS Physical Material (mi), с которым можно работать как с любым другим материалом.

Оба способа равноценны, но второй удобнее.

Для успешного расчета подповерхностного рассеяния должен быть выполнен ряд следующих требований:

  • Версия mental ray - 3.3, не ниже. В составе библиотек должны присутствовать файлы subsurface.dll и subsurface.mi. Например, в стандартной поставке Maya 6.0 их нет, а получить их можно, скачав Maya Bonus Tools;
  • Raytracing должен быть активизирован. Следует также обращать внимание на настройки глубины трассировки, в особенности - refract, глубина должна быть достаточно большой;
  • 3. Должен быть активирован расчет Caustic и/или Global Illumination (поскольку обсчитывается взаимодействие фотонов с объектом), глубина трассировки reflect и refract фотонов должна быть достаточно большой (не меньше, чем задано в параметре depth miss_physical);
  • В свойствах объектов должно быть указано генерировать и получать (generate and receive) caustic и GI;
  • Поверхность объекта должна быть замкнутой. Кроме того, SubD поверхности SSS-шейдером пока не поддерживается.
  • Должен быть хотя бы один источник света, излучающий caustic и/или GI-фотоны. Лучше, если такой источник света фокусированно излучать фотоны на объекты с SSS. Сцена должна быть закрытой, чтобы фотоны не разлетались в "пустоту". Геометрия сцены должна быть такой, чтобы эффективно сохранять в картах излучаемые фотоны. Открытая сцена с точечным ИС - пример "плохой" геометрии, а закрытая сцена (интерьер) с ИС типа Spot, фокусированным на SSS-объекты - пример "хорошей" геометрии;
  • Расчет SSS для слабо рассеивающих материалов с величинами альбедо, меньшими 0.7 лучше выполнять только методом однократного рассеяния. Та же рекомендация относится к случаю очень тонких рассеивающих материалов вне зависимости от их свойств рассеяния, если другие методы порождают артефакты. Такой подход вполне корректен, из экспериментальных данных известно, что при уменьшении толщины рассеивающего слоя его отражательные свойства начинают превалировать над всеми другими;

Для расчета SSS сильно рассеивающих материалов (альбедо > 0.7) лучше всего подходит метод расчета многократных рассеяний трассировкой фотонов в сочетании с дипольной диффузной аппроксимацией. Если диффузная аппроксимация порождает артефакты, при помощи параметра depth можно попробовать увеличить глубину диффузного слоя, уменьшив depth.

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

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

Для этой цели я использовал простую сцену с моделью-образцом в виде куба 1х1х1 см, которому назначен рассеивающий материал (молоко). Образец находится внутри замкнутого объема и освещается одним узконаправленным источником типа direct с минимально возможным угловым значением створа лучей. В сцене имеется 5 камер, расположенных с шагом 45 градусов относительно друг друга, три из них перпендикулярны разным граням куба-образца (верх-бок-низ).



Скриншот тестовой сцены

Ниже приведены результаты расчетов подповерхностного рассеяния для различных случаев.

Тест 1. Расчет подповерхностного освещения методом однократного рассеяния

Описание сцены:

  • Образец: молоко;
  • Метод: однократное рассеяние (approx_single_scatter = on);
  • Свет: direct;
  • Отражение поверхности отключено (слот material имеет черный цвет);
  • top - верхняя камера, перпендикулярна грани, на которую падает свет;
  • side - камера перпендикулярна боковой грани;
  • bottom - камера перпендикулярна нижней грани.



top - side - bottom, g = - 0.9 (анизотропное рассеяние назад)



top - side - bottom, g = 0 (изотропное рассеяние)



top - side - bottom, g = 0.9 (анизотропное рассеяние вперед)

Выводы:

1. Анизотропия. Для рассеяния вперед (g = 0.9) существенный световой поток (красное пятно) выходит через нижнюю грань образца, и в меньшей степени по сравнению с другими типами анизотропии рассеяния - сверху (желтое пятно). Для рассеяния назад и изотропного рассеяния снизу свет не выходит (выходит значительно меньше), зато через верхнюю грань световой поток сильнее (белые пятна), чем при рассеянии вперед.

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

Как видно из рендеров, величина g влияет на вероятность однократного рассеяния в зависимости от глубины. При g = 0 глубина рассеяний максимальна - однократные рассеяния происходят на бОльшей глубине и их больше по количеству, при g = - 0.9 = 0.9 - минимальна и практически идентична как для рассеяния вперед, так и для рассеяния назад.

3. Высокая зависимость от положения камеры



слева-направо: камера под углом 90, 45 и 35 градусов к нижней грани

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

4. Отражение Фреснеля.



Для материала с g = 0.9 (рассеяние вперед) отражение поверхности (камера под углом 45 градусов сверху над образцом) демонстрирует закон Фреснеля. Дальняя часть эллипса светлее из-за того, что угол зрения относительно поверхности меньше для дальней части эллипса и больше для передней части эллипса. Свойства отражения для образца отключены - для слота material назначен черный цвет.

5. Расчет методом однократных рассеяний требует высоких значений интенсивности источников света. Если интенсивность источника недостаточна, результат расчетов будет просто нулевым ("черный" рендер).

Тест 2. Однократное рассеяние методом трассировки фотонов

Approx_multiple_scatter = on, остальные методы расчета выключены.

Образец тот же, трассировка фотонов выполнялась при depth = 1 (одна длина свободного пробега). В расчете освещения данным методом нельзя выделить вклад от однократных рассеяний, поскольку при любой, сколь угодно малой толщине слоя, вероятность многократных рассеяний все равно будет ненулевой.



top - side - bottom, g = - 0.9 (рассеяние назад)



top - side - bottom, g = 0 (изотропное рассеяние)



top - side - bottom, g = + 0.9 (рассеяние вперед)

В целом, поведение рассеянного света аналогично предыдущему случаю. Существенная разница состоит в отсутствии регулярности, что обусловлено многократными рассеяниями. Нет геометрически правильного hot spot от источника, вместо этого наблюдается световое пятно с неправильными и размытыми границами, размер пятна варьируется в зависимости от типа рассеяния. Характер затухания с глубиной также несколько изменился. Для рассеяния назад выход освещения через заднюю грань (камера bottom g = - 0.9) мы наблюдаем темное пятно в центре и более светлый граничный слой, по сравнению с расчетом, получаемым методом однократных рассеяний - просто темная задняя грань(см. аналогичный рендер выше).

Тест 3. Расчет рассеяния трассировкой при разной глубине depth



Слева - направо: depth 1, 10, 20, 100

Рендеры фактически идентичны. Это означает, что все значимые вклады собираются в пределах depth = 1.

Тест 4. Расчет методом дипольной диффузной аппроксимации

Approx_diffusion = on, остальные методы выключены.



Слева - направо: depth 1, 10, 20, 100

Рендеры с расчетом рассеяния только методом диффузной аппроксимации для карты размером в 100 тысяч фотонов для разных значений depth от 0 до 0.9 с шагом 0.1. При depth = 1 вклад от диффузной аппроксимации практически равен нулю. Последнее означает, что на такую глубину при заданных настройках фотоны уже не проникают.



Слева - направо: depth 1, 10, 20, 100

Рендеры с расчетом рассеяния только методом диффузной аппроксимации для карты из 1 миллиона фотонов и глубины depth от 0.9 до 1.04 с шагом глубины в 0.01 мм. Несмотря на то, что карта размером больше предыдущей в 10 раз, глубина ненулевого вклада осталась практически неизменной, при depth = 1.04 он практически равен нулю. Динамика несколько изменилась.

Выводы.

1. Результат расчета методом диффузной аппроксимации зависит от количества фотонов карты - чем больше, тем точнее. Если при рендере видны отдельные фотоны, следует либо уменьшить depth, либо увеличить число испускаемых фотонов.

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

Тест 5. Текстурные трехмерные карты для коэффициента рассеяния




Представлены рендеры с использованием трехмерных процедурных карт для коэффициентов рассеяния из стандартного набора карт 3ds max.

В заключение я приведу примеры рендеров сцен с настроенным расчетом подповерхностного рассеяния.



Сцена 1. Молоко в стеклянном стакане

Файл сцены: scene1.zip



Сцена 2. Горящая цилиндрическая свеча

Файл сцены: scene2.zip



Сцена 3. Кубическая свеча

Файл сцены: scene3.zip

При настройке расчетов я следовал нескольким простым правилам:

1. Для освещения рассеивающего объекта использовался узконаправленный источник света. Это позволяет эффективно организовать испускание фотонов. Для освещения остальной части сцены использовался дополнительный источник.

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

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

4. Для получения подсветок поверхности использовался шейдер illum_phong (mental ray), который скрыт по умолчанию. Открыть его можно тем же способом, что описан выше. Настройку освещения поверхности легче выполнить, полностью отключив проникновение света под поверхность.

5. Окончательный результат является балансировкой сочетания интенсивностей источников света и энергий излучаемых ими фотонов, соотношения величины пропущенного и отраженного света (material, transmitted) и их цветов. Задача довольно хлопотная и требующая некоторого терпения.

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

Далее будут рассмотрены материалы SSS Fast Material и SSS Fast Skin Material и соответствующие шейдеры.

Успешных рендеров!

Дополнительно

iXBT BRAND 2016

«iXBT Brand 2016» — Выбор читателей в номинации «Процессоры (CPU)»:
Подробнее с условиями участия в розыгрыше можно ознакомиться здесь. Текущие результаты опроса доступны тут.

Нашли ошибку на сайте? Выделите текст и нажмите Shift+Enter

Код для блога бета

Выделите HTML-код в поле, скопируйте его в буфер и вставьте в свой блог.