logo
Как использовать все возможности mental ray в р

Часть 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":

Все операторы формы позволяют задавать детальность сэмплирования поверхности протяженного источника при помощи необязательного параметра 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:

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

Для протяженных источников света, в принципе, нет необходимости писать специальные фотонные эмиттеры, поскольку для таких источников 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 "

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

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

Оператор 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, что исключит пирамиду как объект из рендеринга.

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

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

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

Способ второй. Для этого способа потребуется дополнительный плагин 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 появится в списке доступных геометрических шейдеров.

Yandex.RTB R-A-252273-3
Yandex.RTB R-A-252273-4