Как использовать все возможности mental ray в работе с 3ds max
Часть 3. Источники освещения


Третья часть обзора посвящена рассмотрению конструкции описания, правил создания и операторов свойств источников света в mental ray. Мы также рассмотрим пример построения модели custom-источника, который может быть использован в качестве альтернативы Sky light, встроенного в 3ds max.

С точки зрения mental ray, создание источника света в сцене состоит из двух этапов. Первый - определение свойств источника, второй - создание его instance-копии в сцене. Только после выполнения обоих этапов свет от источника будет участвовать в расчетах освещения в сцене.

Первый этап, определение источника света, выполняется при помощи конструкции (элемента):

light "имя_источника"
… операторы свойств
end light

второй этап - при помощи конструкции:

instance "имя_источника_inst" "имя_источника"
операторы свойств
end instance

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

Определение источника света

В mental ray принята обобщенная модель источника света, представленная довольно большим набором операторов. Выбор операторов и значений их параметров определяет всю специфику конкретного источника света. Операторы свойств обрабатываются mental ray на дополнительном шаге, непосредственно перед рендерингом, чтобы определить, как свет распространяется в сцене. Это позволяет оптимизировать многие расчеты освещения. Например, для источника света типа Spot препроцессинг определяет область сцены, находящуюся внутри заданного створа spot-конуса, и тем самым задает область расчетов освещения. Для всех других областей сцены шейдер Spot-источника даже не будет вызываться.

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

light "имя_источника"
light shader (или список light-шейдеров: shader_list)
[ emitter shader (shader_list) ]
[ area_light_primitive ]
[ origin x y z ]
[ direction dx dy dz ]
[ spread spread ]
[ visible ]
[ tag labelint ]
[ data [ " data_name "|null ]]
[ energy r g b ]
[ exponent exp ]
[ caustic photons storeint [ emitint ]]
[ globillum photons storeint [ emitint ]]
[ shadowmap [ on|off ]]
[ shadowmap [ detail ]]3.3
[ shadowmap resolution resint ]
[ shadowmap detail samples numint ]3.3
[ shadowmap samples numint ]
[ shadowmap softness size ]
[ shadowmap file " filename " ]
[ shadowmap camera " cameraname " ]
[ shadowmap bias bias ]
[ shadowmap accuracy epsilon ]
[ shadowmap [color|alpha] ]3.3
end light

Не все операторы обязательно должны присутствовать в определении источника. Обязательными являются только оператор light shader и оператор, указывающий либо положение источника origin x y z (для omni), либо оператор направления испускания света direction dx dy dz (для direct). Поэтому, конструкция определения, как минимум, должна выглядеть:

light "имя_источника"
light shader (shader_list)
origin x y z
end light

либо:

light "имя_источника"
light shader (shader_list)
direction dx dy dz
end light

Mental ray позволяет работать с тремя основными типами точечных источников: omni light - изотропный источник света, одинаково излучающий во всех направлениях, directional light (или infinite light) - источник, излучающий из бесконечности в одном заданном направлении параллельные друг другу лучи света и spot light - источник, излучающий свет в заданном направлении в створ конуса с определенным угловым значением.

Источники могут быть не только точечными, но и протяженными: area, то есть обладающие излучающей свет поверхностью, и linear, излучающие вдоль длины. Протяженные источники получаются из точечных при помощи оператора, имеющего обобщенное название "area_light_primitive". Этот оператор может принимать следующие значения, которые и используются в определении источника вместо "area_light_primitive":

  • rectangle [ x_0 y_0 z_0 x_1 y_1 z_1 ] определяет в качестве формы протяженного источника прямоугольник, длины сторон которого задаются двумя векторами [ x_0 y_0 z_0 x_1 y_1 z_1 ]
  • disc [ x y z radius ] определяет в качестве формы протяженного источника диск, чья нормаль определяется вектором (x y z) и радиусом
  • sphere [ radius ] определяет в качестве формы протяженного источника трехмерную сферу заданного радиуса
  • cylinder [ axis radius ] определяет в качестве формы протяженного источника цилиндр с заданными осями и радиусом
  • object object_inst определяет в качестве формы протяженного источника произвольный геометрический объект. Такой объект должен быть определен и создан в сцене при помощи конструкции instance, а его имя, присвоенное в instance, передается в качестве параметра оператора формы источника.

Все операторы формы позволяют задавать детальность сэмплирования поверхности протяженного источника при помощи необязательного параметра sampling:

[u_samples v_samples[level[low_u_samples low_v_samples]]], где

u_samples и v_samples разбивают поверхность на области, которые образуют своеобразную сетку. Каждая область сэмплируется только в одной точке (область считается точечным источником), чье положение определяется параметрами сэмплирования и с учетом функции распределения интенсивности излучения по поверхности, если она задана. Суммарное освещение рассчитывается как сумма вкладов от областей протяженного источника. Если значение u_samples и v_samples не задано явно, то по умолчанию в mental ray они принимаются равными трем, а в 3ds max - пяти. Таким образом, по умолчанию, протяженные источники сэмплируются в девяти точках поверхности. Для диска и сферы u_samples разбивает радиус, а v_samples - угол. Для цилиндра u_samples разбивает высоту, v_samples - угол.

Если параметр level присутствует и не равен нулю, то при превышении суммой трассировок отражений и преломлений значения level, вместо u_samples и v_samples для сэмплирования источника света в отражениях и преломлениях будут использоваться значения, заданные параметрами low_u_samples и low_v_samples. Проще говоря, этот параметр определяет точность сэмплирования отражений и преломлений, и в том числе - отраженных/преломленных теней.

Любой из трех основных точечных источников - omni, directional или spot, может быть преобразован в протяженный источник при помощи операторов rectangle, disc, sphere, cylinder. Протяженный источник, использующий в качестве формы произвольный геометрический объект, может быть создан только из omni источника. При этом в качестве геометрического объекта формы можно использовать только односоставной объект, желательно простой формы и состоящий из как можно меньшего числа полигонов.

При определении источника важнейшим является оператор light shader, от которого и зависит, как свет испускается источником. Как правило, light shader определяет цвет, затухание, свойства теней и другие параметры, в зависимости от программируемых функций шейдера. Базовая библиотека mental ray base.dll содержит три основных light shader: mib_light_point для omni-источника, mib_light_spot для spot light и mib_light_infinite для directional light. Четвертый шейдер mib_light_photometric предназначен для использования световых профилей в фотометрических источниках. По умолчанию, эти шейдера скрыты, и чтобы получить возможность работы с ними в 3ds max, необходимо отредактировать декларации шейдеров в base.mi.

Тип источника определяется mental ray при расчете автоматически: если в определении источника указан только оператор положения origin, то это - источник типа omni. Если только оператор направления direction, то это - directional light. Если указаны операторы положения, направления и створ конуса, тогда это определение spot light. В mr 3.4 и выше для directional источника можно указывать и положение и направление.

Через интерфейс 3ds max доступны для непосредственной работы все четыре шейдера. Но, mib_light_photometric требует определения дополнительной конструкции описания светового профиля, что невозможно пока сделать средствами 3ds max. Поэтому, вместо прямой работы с этим шейдером, приходится использовать встроенный в max источник типа photometric.

Light shader

Световой шейдер (light shader) в подавляющем большинстве случаев вызывается другими шейдерами, например, - шейдерами материалов, которые выполняют сэмплирование источников света при помощи функций mi_sample_light или mi_trace_light. При пересечении луча от наблюдателя (eye ray) с поверхностью объекта сначала вызывается шейдер материала поверхности, который вычисляет нормаль и координаты пересечения и затем он вызывает функцию mi_sample_light, сохраняя в переменной state координаты и нормаль. Функция mi_sample_light может вызываться несколько раз, если сэмплируется протяженный источник.

Далее mi_sample_light выполняет расчет направления и расстояния на источники света, на которые представлены ссылки в материальном шейдере, и вызывает light shader. Световой шейдер может быть вызван и непосредственно, если eye ray попадает в протяженный источник света. Таким образом, light shader получает направление на точку пересечения, расстояние до нее и рассчитывает интенсивность и цвет света, достигающего поверхность объекта.

Кроме того, light shader может вызываться и для расчета тени для точки поверхности - в этом случае в ее направлении от источника строится и трассируется новый луч. Если такой луч пересекается с блокирующим свет объектом, вызывается теневой шейдер перекрывающего объекта, с помощью которого, в зависимости от свойств прозрачности материала, определяется количество проходящего сквозь объект света. Процесс повторяется вдоль всего пути теневого луча вплоть до достижения точки пересечения. Если у блокирующего объекта нет теневого шейдера, то он считается полностью непрозрачным, а точка - полностью находящейся в тени. Эта схема справедлива для ray tracing теней любого типа, кроме segment. В последнем случае теневой луч трассируется от точки поверхности, а не от источника.

Mental ray позволяет изменить схему сэмплирования для протяженного источника света. Для этого в определении источника указывается специальный оператор - user. При использовании user mental ray выполняет сэмплирование не при помощи mi_sample_light, а по правилам, которые должны быть определены в пользовательском light shader. Оператор user может быть указан только при ручном редактировании mi-файла сцены.

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

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

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

Декларация шейдер точечного omni-источника выглядит:

shader
color "mib_light_point" (
color "color",
boolean "shadow",
scalar "factor",
boolean "atten",
scalar "start",
scalar "stop"
)

и возвращает в качестве результатов цвет и интенсивность света, а в качестве параметров ему можно задавать цвет источника, включение/отключение расчета теней, смешивание (прозрачность) теней и затухание.

Шейдер для spot light:

shader
color "mib_light_spot" (
color "color",
boolean "shadow",
scalar "factor",
boolean "atten",
scalar "start",
scalar scalar "stop",
scalar "cone"
)

позволяет дополнительно определять косинус половинного угла створа, в который испускается свет - параметр cone, который изменяется в пределах от 0 (угол половинного угла 90 градусов, свет излучается в полусферу) до 1 (угол створа 0 градусов, свет излучается почти в одном направлении).

shader color "mib_light_infinite" (
color "color",
boolean "shadow",
scalar "factor"
)

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

shader color "mib_light_photometric" (
color "color",
boolean "shadow",
scalar "factor",
scalar "start",
scalar "stop",
lightprofile "profile"
)

позволяет использовать для описания пространственного распределения интенсивности света специальные файлы данных в формате IES или Eulumdat light profiles.

Еще один очень интересный light shader находится в библиотеке physics.dll - это шейдер physical_light:

shader color "physical_light" (
color "color",
scalar "cone",
scalar "threshold",
scalar "cos_exp"
)

Особенность шейдера - в запрограммированном способе расчета затухания прямого освещения. Затухание рассчитывается по закону 1/exp{R}, где R - расстояние от источника до освещаемой точки. Этот шейдер моделирует физически корректный источник освещения, в отличие от идеального источника, затухание для которого обратно пропорционально квадрату расстояния до источника. Поскольку physical_light возвращает в качестве результата своих вычислений цвет и его интенсивность, он может быть использован в качестве шейдера-параметра для шейдеров регулярных источников omni, spot или directional, что позволяет создать модель регулярного источника с физически корректным затуханием.

Emitter shader

Шейдеры, указываемые в операторе emitter используются для управления испусканием фотонов источником света и трассировки их траекторий. Как и в случае light shaders, существует набор предопределенных встроенных шейдеров - эмиттеров, которые автоматически используются в соответствии с типом источника, если иной (пользовательский) шейдер явно не указывается оператором emitter:

  • point: излучает фотоны равномерно во всех направлениях с началом в точке, где расположен point light
  • spot: излучает фотоны равномерно во всех направлениях в пределах створа конуса заданного угла, определяемого параметрами spot light
  • directional: излучает фотоны в одном заданном направлении
  • disc area: фотоны испускаются из разных точек поверхности диска в направлениях, определяемых косинусоидальным распределением
  • rectangle area: фотоны испускаются из разных точек прямоугольника в направлениях, определяемых косинусоидальным распределением
  • sphere area: фотоны испускаются, чтобы создать равномерный по всем направлениям поток от поверхности сферы. При этом считается, что точки испускания равномерного распределены по поверхности
  • cylinder area: испускается равномерный поток фотонов по всем направлениям на основе равномерного распределения точек испускания по поверхности, с торцов цилиндра фотоны не испускаются.

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

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

Оператор
origin x y z

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

Оператор
direction dx dy dz

определяет направление испускания света источником для spot и directional.

Оператор
spread spread

определяет косинус половинного угла светового конуса.

Операторы origin, direction, spread совместно определяют тип источника света. Если в определении указан только origin, то это omni источник. Если указано только направление испускания света direction, то это направленный (directional) источник света. В mr 3.4 для направленного источника можно указывать и начало (origin). В этом случае считается, что через origin проходит такая плоскость, что ее нормаль по направлению совпадает с direction. Эта возможность позволяет исключить ошибки при испускании направленным источником фотонов. Таким образом, если в определении источника указано только направление, или направление и положение (direction и origin) источника, то это - directional light. Наконец, если указаны и origin, и direction, и spread - это spot light.

Оператор
visible

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

Оператор
tag label

позволяет назначить источнику целочисленную метку (label). Метка не используется mental ray, однако метка источника может быть получена любым шейдером при помощи функции mi_query, чтобы в зависимости от ее значения выполнить те или иные операции. Поэтому, оператор tag предназначен, прежде всего, для кодирования пользовательских шейдеров.

Оператор
data [ " data_name "|null ]

позволяет при необходимости определить для источника различные пользовательские структуры данных типа data. Такие данные могут передаваться шейдерам в качестве параметров. Этот оператор также предназначен для расширения возможностей совместной работы источников света с custom-шейдерами.

Четыре оператора: energy, exponent, caustic photons и globillum photons определяют свойства фотонов, испускаемых источником света при расчете global illumination и caustic-эффектов.

Оператор
energy r g b

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

Оператор
exponent exp

позволяет определить затухание энергии фотонов с расстоянием. Для физической корректности расчетов gi и caustic значение exp должно быть равным 2 (квадратичное затухание с расстоянием). Однако, если физическая корректность не важна для рендера, значение exp может быть любым. Например, значение 0 используется для отключения затухания. Значения exp между 1 и 2 часто используются для борьбы с сильными засветами и для "протягивания" освещения от источника вглубь сцены.

Операторы
caustic photons store [ emit ] и globillum photons store [ emit ]

играют роль "выключателя" эмиссии источником caustic и globillum фотонов соответственно. Они нужны для того, чтобы процесс испускания фотонов был конечным во времени. Обязательный параметр store позволяет выключить испускание, когда в фотонной карте сохранится заданное этим параметром число фотонов, если необязательный параметр emit не указан явно. Если явно указаны оба параметра, испускание прекращается при достижении любого из двух условий. Наконец, если store = 0, количество сохраняемых в карте фотонов считается неограниченным и испускание прекращается, когда излучено количество фотонов, указанное в emit, который обязательно должен быть определен явно.

Sadowmaps

Shadowmap, или растровая карта теней, используется для расчета затенения объектами друг друга на основе иного алгоритма, нежели ray tracing. Этот алгоритм основывается на просчете изображений, или растровых карт, из точки положения источника. Такие карты просчитываются, сохраняются и используются когда материальный шейдер требует расчета теней. Shadowmap в большинстве случаев позволяют рассчитывать тени быстрее, чем ray tracing, но менее точно.

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

Оператор

shadowmap [ on|off ]

Оператор
shadowmap resolution res

позволяет определить качество растровой карты теней указанием ее разрешения в параметре res: ширина х высота в пикселях. Чем выше разрешение, тем качественнее тень и больше памяти на нее расходуется. Следует иметь в виду, что для omni источника создается шесть карт, суммарная размерность которых равна заданной в операторе. Для теней от spot light имеет значение величина параметра spread и расстояние до источника. Для направленного источника детальность тени зависит от количества объектов, для которых рассчитывается тень. Например, если небольшой объект находится на большой подложке и оба объекта отбрасывают тень, детальность тени маленького объекта будет гораздо меньше, чем в случае, когда тень отбрасывает только маленький объект, а подложка тени не имеет.

Операторы
shadowmap softness size и shadowmap samples num

определяют "мягкость", или размытость края тени. Значение параметра size оператора shadowmap softness указывает размер области вдоль внешней линии тени, в пределах которой происходит размывание, size = 0 отключает "мягкие" тени, делая их края "жесткими". Size измеряется в единицах внутреннего пространства проекционной плоскости карты теней. При расчете тени от направленного источника используется ортографическая проекция, при расчете теней от источников остальных типов - проективная. Это приводит к одному важному следствию. Размывание края тени направленного источника постоянно вдоль всей границы. Размывание тени от omni и spot источников будет зависеть от расстояния точек границы тени до источника - чем дальше, тем сильнее размывание. Поэтому, для сопоставимого размывания тени от направленного источника требуется гораздо большее значение size, чем для остальных типов источников. Слишком большое значение size может привести к исчезновению тени за счет сильного ее размывания.
Значение параметра num оператора shadowmap samples определяет количество сэмплов, рассчитываемых для границы тени в пределах size, что в конечном итоге влияет на гладкость размывания края тени, больше - значит лучше и медленнее.

Оператор
shadowmap bias bias

Если параметр bias имеет ненулевое значение, активизируется алгоритм расчета тени, при котором mental ray использует расстояние до ближайшего отбрасывающего тень объекта плюс значение, указанное в bias. Значение bias измеряется в мировых единицах и должно быть меньше наименьшего расстояния между объектом, отбрасывающим тень, и объектом, получающим тень, но не слишком маленьким, чтобы избежать самозатенения. При сохранении shadowmap в файл, сохраняется расстояние от источника до ближайшего объекта и отдельно - значение bias. Использование bias - алгоритма рекомендуется при shadow map merging.

Если bias равен нулю, работает стандартный алгоритм "Woo trick", при котором используется половинное расстояние между двумя ближайшими объектами, отбрасывающими тень. В 3ds max 8 значение bias можно указывать в настройках источников, использующих mental ray shadow map, в более ранних версиях определить bias средствами интерфейса 3ds max нельзя. Значение bias также может быть задано в блоке Options сцены сразу для всех источников. Если bias задан явно для источника, его значение имеет преимущество и переопределяет bias, заданное в Options.

Оператор
shadowmap file " filename "

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

Оператор
shadowmap camera " cameraname "

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

  • resolution, или разрешение карты, при этом карта может иметь не обязательно квадратную форму
  • window - окно, ограничивающее область расчета тени заданным размером window
  • offset сдвигает карту тени относительно проекционной плоскости
  • aperture, focal и aspect определяют поле видимости источника света

все остальные поля камеры игнорируются.

Оператор
shadowmap detail

новая возможность mental ray, сочетающая алгоритм shadowmap и ray tracing. Позволяет рассчитывать частично прозрачные тени, для чего вызывает материальный шейдер объекта, блокирующего свет. Расчет таких теней может быть даже более длительным, чем расчет ray tracing теней. Основное преимущество detail-теней в том, что они требуют меньшего разрешения карт, по сравнению со стандартными shadowmap, могут быть полупрозрачными и цветными, и могут быть сохранены в файл. Поэтому, наибольшая выгода от них может быть получена при расчете теней, размытых в движении и при повторном использовании с загрузкой из файла.

Файл, хранящий этот тип тени, несовместим по формату с файлами обычных shadowmap. Кроме того, detail-тени рассчитываются тайлами. Если при рендеринге тени загружаются из файла, то досчитывается и пересохраняется не вся карта, а только необходимые тайлы. Detail shadowmap не могут быть использованы в режиме segmented shadow и не поддерживают shadowmap merging.

Оператор
shadowmap detail samples num

позволяет указать число сэмплов на пиксель, используемых для расчета shadowmap detail теней. Число сэмплов равно квадрату значения num (n x n).

Оператор
shadowmap accuracy epsilon

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

Оператор
shadowmap color|alpha

color используется при расчете detail shadowmap по умолчанию - прозрачные тени будут цветными. Если используется параметр alfa, сохраняются только переходы интенсивностей цветов.

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

Источники света в 3ds max

Все источники света 3ds max для работы с mental ray имеют собственные light shader, которые декларированы в 3dsmax7.mi. Настройки источников достаточно хорошо согласуются с описанием mental ray и позволяют определять почти все из них. Это справедливо для любых источников 3ds max, а не только для источников mr omni, mr spot или фотометрических. Последние три перечисленных типа выполняют специальную функцию - позволяют использовать для освещения протяженные источники.

3ds max позволяет также использовать и шейдеры mental ray, как альтернативу встроенным шейдерам. Эта возможность реализована при помощи свитка параметров mental ray Light Shader, который есть у каждого источника 3ds max:




С его помощью источнику света можно назначить произвольный light shader и emitter shader. В библиотеке base.mi mental ray имеется четыре шейдера точечных источников: mib_light_point - для описания изотропного (всенаправленного) источника, mib_light_spot - для spot-источника, mib_light_infinite - направленного (directional) источника и mib_light_photometric - для фотометрических источников, использующих описание профиля распределения света (поддерживаются только форматы описания IES и Eulumdat).

Фотометрические источники реализовать шейдерами mr в рамках интерфейса 3ds max нельзя, поскольку один из параметров mib_light_photometric - lightprofile требует специального определения в сцене до того, как его можно будет использовать, при помощи конструкции:

lightprofile " произвольное_имя "
format ies
file " filename "
[ flags flagsint ]
[ hermite degreeint ]
[ resolution xres yres ]
end lightprofile

Создание такой конструкции средствами интерфейса 3ds max пока не предусмотрено и возможно только при помощи ручного редактировании экспортированного mi-файла сцены.

Остальные light - шейдера можно использовать напрямую, если есть такая необходимость. Только предварительно потребуется отредактировать base.mi - убрать ключ "hidden" в разделе gui деклараций шейдеров.

Специально написанные фотонные шейдеры отсутствуют в библиотеке, поскольку для определения эмиссии фотонов используются правила, рассмотренные нами выше, при описании операторов mr light. Интересно, что, по-видимому, именно способ эмиссии фотонов лежит в основе деления протяженных источников mr-типа, принятый в 3ds max. Так, все mr Area omni источники позволяют задавать в качестве формы протяженного источника только сферу или цилиндр, и их поверхность излучает фотоны изотропно. Все источники типа mr Area spot позволяют использовать только "плоские" фигуры для определения формы - прямоугольник или диск и их поверхность излучают фотоны либо вдоль одного выделенного направления, либо в створ конуса с некоторым заданным угловым значением. Тем не менее, все вышесказанное не отменяет возможности написания собственного шейдера-эмиттера фотонов.

Процедура построения источника света при помощи mr шейдеров проста - нужно, используя интерфейс mental ray Light Shader, выбрать из библиотеки нужный шейдер, включить галочку "Enable" и перетянуть шейдер в редактор материалов для настройки его параметров.

Как уже говорилось выше, 3ds max тем или иным способом позволяет определять все важные для mental ray свойства (операторы свойств) источников света. Например, можно выбирать тип тени - ray trace или shadow map для каждого источника. Однако тип ray trace тени (Simple, Sort, Segments) выбирается сразу для всех источников, тогда как mr позволяет сделать это для каждого источника индивидуально. Интерфейс настроечных параметров 3ds max также позволяет назначить свой light shader, emitter shader или задействовать относительно новую возможность mr - detail shadow map, задав прозрачность у карт теней.

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

И если в восьмой версии 3ds max параметр bias появился в настройках mental ray shadow map, то создание произвольной формы источника и user-сэмплирования пока остается недоступным. Впрочем, кое-что сделать все же можно.

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




В качестве источника выбран mr Area omni, которому назначен light shader = Light Point (base), изначально он находится в сцене точно над пирамидой и переименован в Pyr_light для облегчения поиска в mi-файле.

Теперь выполним экспорт сцены в mi-файл и откроем его для правки в каком-нибудь текстовом редакторе, например, - в WordPad (удобен, поскольку сохраняет исходное форматирование текста). Но прежде можно сделать следующее. Экспортированный файл содержит описание геометрии, в нашем случае довольно простой - это box-подложка и пирамида. В реальных сценах геометрия, как правило, гораздо сложнее и хранит множество полигонов, а также может содержать большие по размеру текстуры. Для упрощения редактирования исключим описание геометрии из mi-файла сцены, заменив реальную геометрию так называемыми контейнерами, хранящими только ссылки на объекты и границы объектов. Ссылки указывают на внешние файлы, в которых содержатся описания объектов, эти файлы будут подгружаться во время рендера по мере необходимости. Сделать это можно при помощи команды:

ray.exe "имя_экспортированного_файла_сцены.mi" -echo "echo_file.mi" ascii omit "dt" explode 1

(ключи командной строки описывались в предыдущей, второй части обзора).

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

Файлы сцены 3ds max и экспортированные mi-файлы: first.zip

Открываем для редактирования echo_file.mi. Прежде всего, нам необходимо найти конструкцию определения источника света и его инстанс-конструкцию. Это удобно делать по имени источника света стандартным поиском по тексту (клавиатурное сокращение в WordPad - ctrl+F). По ключевому слову Pyr_light (имя источника света) находим следующий фрагмент описания mi-сцены:

light "Pyr_light|Light" = "Map #1|Shader"
origin 0 0 0
shadowmap resolution 256
energy 394784 394784 394784
exponent 2
caustic photons 10000
globillum photons 10000
sphere 2.54
5 5 3 2 2
end light

instance "Pyr_light|Instance" "Pyr_light|Light"
transform
-1.6292068e-007 -4.3711395e-008 -1 0
-1 -4.4703476e-008 1.6292068e-007 0
-4.4703484e-008 1 -4.3711388e-008 0
0.43664119 -158.07874 6.8577906e-006 1
()
end instance

Для определения геометрической формы источника нужно изменить его определение - добавить оператор object, которому в качестве параметра указан инстанс объекта, чью форму нужно использовать. В нашем примере это пирамида (объект с именем Pyramid01). Снова выполним поиск по ключевому слову Pyramid, искомый фрагмент выглядит следующим образом:

data "Pyramid01|Data" "max_NodeData" (
"WireColor" 0.6 0.894118 0.839216 1,
"NodeID" 0,
"NodeRenderID" 1,
"illuminators" [ "Pyr_light|Instance"],
"shadowmakers" [ "Pyr_light|Instance"],
"useGlobalLights" off,
"materialRequirements" [
0])

data "Pyramid01|ObjectData(Mesh00)" "max_ObjectData" (
"bvmin" -15 -15 0,
"bvmax" 15 15 30,
"mapchannels" [
-1,
0],
"materialID" [
0,
0,
0,
0,
0,
0,
0,
0])

object "Pyramid01|GeomObject(Mesh00)"
reflection 2
refraction 2
tagged on
finalgather 2
tag 1
data "Pyramid01|ObjectData(Mesh00)"
box -15 -15 0
15 15 30
file "autoload_00000423_Pyramid01_GeomObject(Mesh00).mi"
end object

instance "Pyramid01|Instance(Mesh00)" "Pyramid01|GeomObject(Mesh00)"
visible on
shadow on
trace on
transparency 3
caustic 6
globillum 3
finalgather 3
face both
transform
-0.72280198 -0.69105518 -1.0914007e-007 0
-0.69105518 0.72280198 -1.0434643e-007 0
1.509958e-007 0 -1 0-4.9828614e-006 0 33 1
-4.9828614e-006 0 33 1
material "Default Material|Mtl"
data "Pyramid01|Data"
()
end instance

Первую data- конструкцию типа max_NodeData нужно просто удалить. Вторая data-конструкция типа max_ObjectData содержит текстурные данные и ее можно оставить. Конструкцию определения объекта Pyramid редактируем:

object "Pyramid01|GeomObject(Mesh00)"
tagged on
tag 1
data "Pyramid01|ObjectData(Mesh00)"
box -15 -15 0
15 15 30
file "autoload_00000423_Pyramid01_GeomObject(Mesh00).mi"
end object

Также, редактируем и instance-конструкцию этого объекта:

instance "Pyramid01|Instance(Mesh00)" "Pyramid01|GeomObject(Mesh00)"
visible off
shadow off
trace off
face both
transform
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
()
end instance

Другими словами, объект должен быть невидим и не должен отбрасывать тень. Кроме того, матрица трансформации, определяющая положение объекта, заменена единичной, но исходную матрицу нужно сохранить - мы подставим ее как матрицу трансформации instance-источника света, тогда положение источника будет в точности совпадать с положением объекта. И, наконец, удалены операторы material "Default Material|Mtl" и data "Pyramid01|Data".

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

Отредактируем определение источника:

light "Pyr_light|Light" = "Map #1|Shader"
origin 0 0 0
visible
energy 394784 394784 394784
exponent 2
caustic photons 10000
globillum photons 10000
object "Pyramid01|Instance(Mesh00)"
5 5 3 2 2
end light

и его инстанс, заменив исходную матрицу трансформации на матрицу объекта-формы (пирамиды):

instance "Pyr_light|Instance" "Pyr_light|Light"
transform
-0.72280198 -0.69105518 -1.0914007e-007 0
-0.69105518 0.72280198 -1.0434643e-007 0
1.509958e-007 0 -1 0
-4.9828614e-006 0 33 1
()
end instance

Наконец, удалим "Pyramid01|Instance(Mesh00)" из конструкции instgroup "SceneRoot|Group" … end instgroup, что исключит пирамиду как объект из рендеринга.

Сохраняем файл и выполняем его рендеринг из командной строки:




Таким образом, общая схема редактирования состоит из следующих шагов:

  • редактирование конструкций определения объекта и его инстанса. Должны быть удалены данные типа max_NodeData, поскольку они содержат ссылки на источники света, операторы назначения материалов и ссылки на данные типа max_NodeData. Объект должен быть невидим и не должен отбрасывать тень, а его матрица трансформации должна быть скопирована для последующего использования и затем заменена единичной
  • вырезание и вклеивание определений объекта-формы перед определением источника
  • редактирование конструкций определения источника с добавлением оператора object, параметром которого указывается имя instance объекта-формы, а матрица трансформации источника заменяется матрицей объекта. Чтобы сделать источник видимым в камеру, в его определении можно указать оператор visible. Качество теней определяется настройками сэмплинга, указываемыми сразу вслед за оператором object
  • instance объекта - формы источника должен быть удален из корневой конструкции instgroup "SceneRoot|Group" … end instgroup, которая находится в конце файла сцены.

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

Способ второй. Для этого способа потребуется дополнительный плагин mrGeomShaderObject.dlo и шейдер ctrl_objectlights (сам шейдер ctrl_objectlights.dll и файл его декларации ctrl_objectlights.mi), разработанный francescaluce.

Плагин mrGeomShaderObject идет в составе примеров max SDK, начиная с седьмой версии. По умолчанию, файл с кодом плагина находится: диск:\3dsmax7\maxsdk\samples\mentalray\mrGeomShaderObject и должен быть скомпилирован перед использованием. Затем его нужно поместить в директорию stdplugs 3ds max. После запуска программы появится новый геометрический объект:




Назначение этого плагина - создать в сцене контейнер в сцене 3ds max для геометрического шейдера mental ray. Единственный параметр плагина - слот Shader, куда и нужно помещать геометрические шейдеры. В base.mi есть несколько процедурных геометрических шейдеров (по умолчанию скрытых) - mib_geo_cube, mib_geo_sphere, mib_geo_cone, mib_geo_cylinder, mib_geo_square, mib_geo_instance, mib_geo_instance_mlist, mib_geo_add_uv_texsurf, mib_geo_torus, которые можно использовать для этой цели.




Однако для создания произвольной формы источника света потребуется еще один дополнительный шейдер - ctrl_objectlights, который можно взять по адресу: или здесь. Установка шейдера стандартна: файлы ctrl_objectlights.dll и ctrl_objectlights.mi из папки maya6.5\mentalray\win архива нужно поместить в папки shaders и include standalone mental ray и 3ds max mental ray, указав пути к ним (link и mi) в rayrc и 3ds max standard.mi. После этого шейдер ctrl_objectlights появится в списке доступных геометрических шейдеров.



Параметры шейдера ctrl_objectlights

Среди настроечных параметров ctrl_objectlights наиболее важными для нашей цели являются transform, куда нужно вводить имя объекта- формы и light, куда необходимо вводить имя источника света.

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

  • В сцене создаем обычный источник типа mr Area omni и помещаем его в начало координат. Источник типа mr Area omni рекомендуется к использованию во всех случаях создания источников произвольной формы.
  • Создаем mrShader объект, назначаем ему геометрический шейдер ctrl_objectlights и помещаем объект в начало координат
  • Создаем объект, который будет определять форму, и помещаем его в то место сцены, где он нужен
  • Перетягиваем шейдер ctrl_objectlights в редактор материалов и в поле transform вводим: Имя_объекта |Instance(Mesh00). Почему именно так? Дело в способе автоматической генерации имен для instance, который использует 3ds max - приставка "|Instance(Mesh00)" всегда добавляется к имени объекта и результат присваивается как имя для instance объекта. Например, если объект имеет в 3ds max имя "Pyramid01", то в transform нужно ввести: Pyramid01|Instance(Mesh00), поскольку именно таким будет имя instance для Pyramid01 и это легко проверить, экспортировав сцену в mi-файл.
    В поле light нужно ввести Имя_источника_света|Light, поскольку, опять же 3ds max так генерирует имя источника света при его определении в конструкции light … end light. Например, если имя источника в max Pyr_light, то в поле light шейдера ctrl_objectlights следует вводить Pyr_light|Light.
    Остальные параметры можно оставить неопределенными, поскольку это никак не повлияет на результат (такова не очень приятная особенность использования ctrl_objectlights в 3ds max). Однако аналогичные свойства можно определить при помощи свойств исходного источника - mr Area omni: видимость источника в камеру и качество сэмплирования для теней в пределах прямой видимости (первые два U и V samples).
  • В свойствах объекта-формы источника и в секции Rendering control выключаем все, кроме Renderable
  • Если планируется испускание фотонов, в свойствах объекта на закладке mental ray также нужно отключить все галочки напротив receive/grenerate GI/caustic

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




совершенно аналогично рендеру, полученному первым способом.

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

Шейдер ctrl_objectlights написан для Maya и standalone mr и не учитывает некоторых особенностей транслятора 3ds max. В результате, при рендере иногда возникают досадные ошибки. Если это произошло, в большинстве случаев достаточно повторно запустить рендер или "подергать" настройки сэмплинга в mr Area omni, незначительно меняя их значения. В особо тяжелых случаях может потребоваться удаление исходного источника и создание нового. Как только рендер получился, в дальнейшем его результат остается стабильным.

Теперь займемся практическими вещами и создадим альтернативу встроенному в 3ds max Sky light - источник света, форма которого будет определена полусферой, покрывающей сцену. Источник будет испускать прямое освещение, фотоны и иметь мягкие тени.

Альтернативный Sky light

Известно, что расчет освещения от стандартного Sky light в 3ds max, имитирующего освещение от небесного свода, при использованием mental ray возможен только методом final gather. Это означает, что от такого типа источника мы можем посчитать только вторичное освещение. На практике часто возникает необходимость иметь полноценный источник света, дающий прямое освещение и способный испускать фотоны. Реализовать такой источник довольно просто, если воспользоваться описанной выше методикой создания источника произвольной формы. Итак, создаем собственный Sky light.

1. Форма источника. В качестве формы используется полусфера радиусом в 50 метров, полученная из стандартного примитива Geosphere со следующими настройками: radius = 50 метров, segments = 1, type = Icosa, smooth, hemisphere. Полусфера помещалась в начало координат (0, 0, 0) конвертировалась в Editable Mesh, нижние грани удалялись, а направления нормалей остальных граней изменялись на противоположные (flip). Имя полусферы изменено на SkyU1.

2. Источник света. В качестве исходного выбран mr Area omni с ray traced shadow, Samples U = V = 18, Intensity = 2,5 и остальными настройками по умолчанию. Помещен в начало координат и переименован в SkyL.

3. В сцене создан объект типа mr Shader с назначенным ctrl_objectlights. Затем базовому источнику назначена полусфера в качестве формы по описанной схеме. Базовая модель источника готова для дальнейших экспериментов.

Первое, что теперь можно сделать - через закладку mental ray Light Shader в свойствах источника назначить Light Point (base)в качестве light shader. Использование Light Point дает несколько преимуществ - расчет прямого освещения выполняется немного быстрее, шейдер оптимизирован для процедуры излучения фотонов, но, что важнее, он позволяет определить цвет светового потока (параметр Color) при помощи не только Color picker, но и посредством любого шейдера, возвращающего в качестве результата цвет.

Используя это свойство, для параметра Color шейдера Light Point можно назначить, например, HDRI - карту. Тогда карта будет определять цвет и интенсивность различных участков протяженного источника. Карту следует брать низкого разрешения, не более 256х256, и размытую. Ее можно создать из HDRI высокого разрешения в такой программе, как HDRShop.

Или же, для определения цвета можно использовать шейдер mib_cie_d. В этом случае нужно немного отредактировать декларацию шейдера в base.mi - добавить в разделе apply шейдера ключ "texture" или "material", иначе mib_cie_d будет не виден при выборе шейдера для цвета.



Только прямое освещение от протяженного
источника-полусферы, имитирующего Sky light

Можно осветлить тень, поиграв с ее прозрачностью при помощи параметра Shadow Trancparency шейдера Light Point: 0 - полная непрозрачность, 1 - полная прозрачность тени, то есть - ее отсутствие. Значения между 0 и 1 будут давать различные степени прозрачности. Однако вместо этого будем использовать final gathering.

При расчете с использованием FG нужно учесть, что fg-лучи "чувствуют" цвет карты, назначенной источникам света и цвет геометрической формы источника или цвет материала, если он ей назначен. Эти свойства можно использовать для получения спецэффектов при управлении цветом освещения.

Чувствительность к цвету материала геометрической формы можно устранить назначением его поверхности шейдера Transmat, что делает объект прозрачным для fg-лучей. Уменьшить влияние карты источников на цвет освещения можно только при помощи ограничения длины fg-лучей параметром falloff.



FG - пасс, форме источника назначен нейтральный серый цвет,
FG falloff = 3 метра, один диффузный отскок

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

Наконец, полусфера может испускать фотоны. Для просчета фотонной карты, прежде всего, необходимо в свойствах полусферы на закладке mental ray отключить все галочки receive/generate GI/caustic. Иначе расчет фотонной карты будет невозможен (вызовет аварийное завершение 3ds max).

Если пытаться испускать фотоны, просто включив расчет GI в настройках рендера, создание фотонной карты будет исключительно медленным из-за разлета фотонов за пределы сцены. Кстати говоря, если использовать встроенный mr area omni, без Point Light шейдера, расчет фотонной карты будет вообще невозможен.

Повлиять на ситуацию можно, создав копию полусферы при помощи инструмента масштабирования с нажатой кнопкой "Shift". У копии полусферы в свойствах нужно установить Generate GI/caustic.



Фотонная карта, затухание обратно пропорционально радиусу,
энергия фотонов = 300 000, количество фотонов в карте = 100 тысяч.
GI accuracy: 220 фотонов, собираемых с площадки радиусом 2 метра

Теперь соберем все вместе:



Финальный рендер: прямое освещение+FG+PM

Файл настроенной сцены: garg_fin.zip

Такой источник может быть использован как для освещения открытых (экстерьерных) сцен, так и для интерьеров. Его преимущества заключаются в том, что прямое освещение позволяет четко прорисовать рельеф, без потери контраста светотени, и получить мягкие тени, а фотонные карты и FG позволяют доработать тени и color bleeding. При этом время рендера не превышает времени расчетов прямого освещения. Использование встроенного в 3ds max Sky часто приводит к потере контраста светотени и сильному шуму, что не лучшим образом сказывается на времени и качестве рендера.

Таким образом, мы рассмотрели все основные правила, свойства и операторы определения базовых источников освещения в mental ray. В следующей части обзора будут рассмотрены шейдеры, используемые в mental ray для определения материалов объектов.

Файлы сцен, используемых в обзоре:



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

iXBT BRAND 2016

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

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

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

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