Как использовать все возможности mental ray в работе с 3ds max. Часть 6. Материалы


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

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

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

Разделение mental ray на трассировщик и материальные шейдеры очень схематично. В настоящее время шейдеры можно написать практически для любой функции рендеринга. Кроме материальных, для программирования доступны следующие типы шейдеров: геометрические (процедурная геометрия), объемные (volume), фотонные (photon и photon volume), окружения (environment), освещения (light), displacement, теневые (shadow), contour, расчет карт освещения поверхности объектов (lightmap), шейдеры вывода для камер (output) и некоторые другие.
Тем не менее, упрощенное представление работы mental ray, как совместного функционирования трассировщика и материального шейдера, позволяет четко понять основную схему расчета изображений. И такое понимание может стать ключом к успешной работе с mental ray, как для художников, так и для программистов.

Конструкция стандартного материала

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

Материалы определяют вид геометрических объектов. Указание материала при определении геометрического объекта выполняется по его имени, при этом сам материал должен быть предварительно определен (определен до его первого использования в каком-либо геометрическом объекте). Для полигонных объектов указание имени используемого материала обязательно выполняется для каждого полигона, либо явным указанием его имени, либо при помощи тэгов. Правила определения полигонных объектов подробно рассматриваются в обзоре "Как использовать все возможности mental ray в работе с 3ds max. Часть 4. Геометрические объекты".

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

Разработчики 3ds max решили отойти от этого правила. Так, они включили описание источников света непосредственно в определение объекта при помощи специальной структуры пользовательских данных max_NodeData. Эти данные содержат поля "illuminators" и "shadowmakers", определяющие источники света и расчет теней от них.

Такая схема в общем случае не конкурирует со схемой, используемой mr, поскольку шейдеры, написанные специально для 3ds max, используют для расчета освещения именно пользовательские структуры данных и оставляют без внимания способ указания источников в материалах. Шейдеры же mental ray, поставляемые в его стандартных библиотеках, используют для расчета освещения списки источников, указываемые в материальных шейдерах и не используют пользовательские данные. В конечном итоге - дело каждого шейдера, откуда получать данные, лишь бы это происходило правильно.

Таким образом, если работать со стандартными материалами 3ds max, о привязке освещении можно не беспокоиться - она может быть выполнена стандартными средствами max. Но если в материале используются стандартные шейдера mental ray, может возникнуть ситуация, когда придется редактировать списки источников в материалах.
Это вполне возможно сделать, отредактировав раздел gui в декларации материальных шейдеров mental ray (файлы base.mi и physics.mi, категория Illuminations, убрать hidden у параметров lights и mode). По умолчанию в стандартных материальных шейдерах mental ray значение mode равно 0, то есть материал освещается всеми присутствующими в сцене источниками.

В остальном, конструкция материала в 3ds max, реализованная при помощи mental ray Connection и mental ray material, совершенно аналогична конструкции, используемой в mental ray.

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

material " material_name "
[ opaque]
material shader [shader_list]
[ displace shader [ shader_list]]
[ shadow shader [ shader_list]]
[ volume shader [ shader_list]]
[ environment shader [ shader_list]]
[ contour shader [ shader_list]]
[ photon shader [ shader_list]]
[ photonvol shader [ shader_list]]
[ lightmap shader [ shader_list]]
end material

и в 3ds max:



Конструкция материала типа mental ray



mental ray Connection стандартных материалов

Как видите, конструкции материалов совершенно идентичны.

Итак, определение в mr материала выполняется конструкцией

material "material_name" … end material

с указанием операторов свойств, каждый из которых, кроме material shader, является необязательным и может отсутствовать в определении конкретного материала. Имя материала "material_name" используется в описании геометрического объекта для указания материалов, назначаемых полигонам поверхности. Оператор material shader [shader_list] задает материальный шейдер, или несколько (список), который не может быть опущен при определении материала, за исключением одного единственного случая - когда материал полностью прозрачен и имеет коэффициент преломления, равный 1 (справедливо для mr версии 3.3 и выше). Такие прозрачные материалы используются для создания специальных эффектов, например - для ограничивающих поверхностей-контейнеров объемных эффектов.

Ввиду особой важности материального шейдера, мы рассмотрим его подробно.

Основные функции материального шейдера четко определены и неизменны - он должен рассчитывать прямое освещение от источников света, рассчитывать ослабление освещения объектами, блокирующими свет (затенение), испускать и обсчитывать вторичные лучи преломлений и отражений, рассчитывать все виды вторичного освещения (final gathering, global photon illumination, caustic) и комбинировать полученные значения в конечный результат с учетом затухания освещения (расстояния до источника), протяженности источника и используемой BRDF для определения количества света, излучаемого (отражаемого) точкой поверхности в направлении наблюдателя. Специальная модификация материальных шейдеров позволяет рассчитывать и объемные эффекты в дополнение к выше перечисленным.

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

Основным "инициатором" запуска на исполнение материального шейдера является пересечение испущенного из камеры луча с поверхностью объекта, которой назначен этот шейдер. Говоря "основным", я имею в виду, что кроме луча из камеры, материальный шейдер могут запускать и пересечения других типов лучей. Вторичные лучи - отраженные или преломленные прозрачными объектами, при пересечении с поверхностями также вызывают их материальные шейдеры. Кроме того, есть основания полагать, что и final gather также используют вызов материальных шейдеров.

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

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

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

Так, именно состояние передает шейдеру координаты точки пересечения, нормаль поверхности и направление на источник света. Эти данные можно считать локальными - они создаются только в момент события и существуют лишь на протяжении расчета цвета луча, создавшего состояние. Другие данные являются глобальными - они существуют на протяжении всего рендера и могут быть доступны нескольким материальным шейдерам одновременно при рендеринге по сети или на многопроцессорных/многопоточных машинах. Примером глобальных данных служат настройки расчета вторичного освещения - caustic, gi, fg и другие. Полный список данных состояния приводится в документации по mental ray.

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

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

Прежде всего определяется список активных источников света. Определение материала позволяет исключать некоторые источники из расчетов (параметры light и mode в настройках материальных шейдеров).

Примечание. Поскольку 3ds max использует собственную схему указания источников света для объектов, параметры light и mode скрыты. Если работа ведется только с light шейдерами 3ds max, эти параметры не понадобятся. Если же потребуется работать с исходными light-шейдерами mental ray, скорее всего, их придется открыть.

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

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

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

Примечание. Шейдер physical light учитывает анизотропию излучения для протяженных источников, рассчитывая угол между направлением на освещаемую точку и нормалью поверхности источника в точке сэмплирования. Зависимость интенсивности излучения от этого угла определяется по закону косинуса. Шейдер physical light обладает настроечным параметром, позволяющим задавать степень косинуса угла и тем самым изменять изотропию излучения: чем выше степень, тем более выражен пик в направлении нормали источника. Кроме того, physical light позволяет задавать произвольный закон затухания освещения с расстоянием. В отличие от него, базовые источники типа omni, spot, directional могут рассчитывать освещение только с линейным затуханием или без затухания вообще, не учитывают зависимость угла излучения и используют простые типы анизотропии.

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

Наконец, если источник протяженный - все вышеописанные вычисления повторяются в цикле, пока не будет вычислено заданное в настройках источника света число сэмплов (в 3ds max это U- V- samples в Area Light Parameters). Вычисленные сэмплы затем суммируются и делятся на общее число сэмплов - так получается усредненное освещение точки.

4. BRDF. Материальный шейдер использует результат, возвращаемый световыми шейдерами источников, и реализует модель освещения, рассчитывая весь падающий в точку световой поток по всем направлениям, и ту часть этого освещения, которая отражается в заданном направлении (направлении eye ray, вторичных лучей или fg -лучей). Поэтому в работе шейдера можно всегда четко выделить две самостоятельные составные части - расчет потока падающего освещения (irradiance или illuminance) и расчет потока отраженного материалом освещения (radiance). Материальный шейдер является по своей сути функцией, связывающей эти два типа световых потока. Вместо термина "материальный шейдер" в компьютерной графике используется BRDF - Bidirectional Reflectance/Refraction Distribution Function, в рассматриваемом контексте мы можем считать их синонимами.

В настоящее время разработан и используется довольно широкий набор моделей освещения. Стандартная библиотека mental ray предлагает семь стандартных моделей, соответствующие материальные шейдеры которых декларированы в base.mi (категория illumination): модель освещения Ламберта, Фонга, Блинна, Кука - Торренса, Варда и модель освещения волос. Нестандартные модели представлены dgs, dielectric и path (mr 3.4) материальными шейдерами, которые декларированы в physics.mi.

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

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

Разработка моделей ведется постоянно и представляют собой интереснейшую область исследований. Появление новых моделей освещения обогащает компьютерную графику возможностями визуализации и является источником расширения библиотек материальных шейдеров. В качестве примера хочу привести шейдер path material, который появился в mental ray 3.4. Используемая в нем модель освещения довольна сложна и реализует так называемый двунаправленный path tracing, который позволяет рассчитывать все типы освещения в сцене, в том числе и вторичное освещение, методом рейтресинга, без привлечения фотонных карт и final gather.

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

5. Отражения и преломления. Если в свойствах материала заданы прозрачность или отражения, материальный шейдер будет выполнять трассировку дополнительных лучей, так называемых secondary ray или вторичных лучей. Сначала будет вычислено направление испускания вторичного луча в соответствии с законами отражения/преломления и значениями параметров материального шейдера, таких как коэффициент преломления. Затем выполняется трассировка вторичного луча и, в случае его пересечения с другим объектом, будет вызван материальный шейдер материала, назначенного этому объекту.
Далее произойдет расчет материального шейдера в объеме и последовательности, описанных выше и затем вновь рассчитанный цвет будет скомбинирован с цветом материального шейдера, запустившего трассировку вторичных лучей. Мы видим, что стандартизация функций материального шейдера позволяет довольно просто реализовать всю цепочку расчетов последовательным вызовом требуемых шейдеров.

6. Расчет вторичного освещения.

Наконец, после расчетов прямого освещения, отражений и преломлений, выполняется вычисление вторичной освещенности. Завершающим этапом работы любого материального шейдера mental ray является учет вторичного освещения при помощи методов final gather, photon map или caustic photon map.

Для этого материальный шейдер вызывает специальную процедуру расчета вторичного освещения, которая проверяет активность/неактивность используемых методов - fg, gi, caustic и используя параметры их настройки, рассчитывает для точки всю вторичную освещенность. Активность метода и параметры настройки его расчета являются глобальными и не должны изменяться материальными шейдерами. Выбор методов расчета вторичного освещения и их параметров в 3ds max осуществляются в секции Indirect Illumination панели Rendering.

Начиная с версии mental ray 3.3 введена новая, дополнительная процедура расчета вторичного освещения, которая позволяет переопределять настройки вычислений fg, gi и caustic индивидуально для материалов. Однако, ее использование в 3ds max требует программирования специального шейдера для поверхности геометрических объектов, через который должны подключаться материальные шейдеры.

7. После вычисления вторичного освещения, результат складывается с освещением, рассчитанным на предыдущих этапах и получается окончательный цвет для текущего первичного луча (сэмпла). Этот цвет записывается в буфер цвета mental ray и впоследствии фильтруется в соответствии с настройками суперсэмплинга (секция Sampling Quality панели Rendering в 3ds max).

Таким образом, подводя краткий итог, материальный шейдер рассчитывает цвет первичного луча следуя схеме (расчет параметров шейдера) -> освещение (light shader) -> BRDF -> (отражения/преломления) -> (вторичное освещение) -> запись цвета сэмпла в буфер для фильтрации.

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

Кроме цвета, материальный шейдер может управлять выводом и в другие буфера mental ray:

  • Z, или буфер глубины, сохраняя соответствующие значения в state->point.z
  • label, сохраняя соответствующие значения в state->label
  • normal, сохраняя соответствующие значения в state->normal
  • motion vector, сохраняя соответствующие значения в state->motion
  • в определяемые пользователем буфера при помощи функции mi_fb_put

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

Оператор
displace sader [ shader_list]

и соответствующий слот свойств материала в 3ds max позволяют задать шейдер, который будет рассчитывать изменение геометрии объекта, смещая элементы поверхности вдоль нормали на рассчитанную скалярную величину, если используются displacement-шейдеры из стандартной библиотеки mental ray. Как и любой другой, этот шейдер может быть заменен другим с иным алгоритмом расчета смещения элементов поверхности.

Оператор
shadow shader [ shader_list]

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

Как правило, теневой шейдер представляет собой упрощенную копию материального шейдера. Упрощенную в том смысле, что он может рассчитывать свойства прозрачности (а теневой шейдер нужен только для прозрачных объектов), но никогда не трассирует вторичные лучи. Поэтому, в качестве теневого шейдера вполне допустимо указывать копию материального шейдера, при вызове mental ray автоматически сможет определить как используется шейдер - как материальный или как теневой. Также, ничто не мешает использовать для расчета тени шейдер с произвольными свойствами, если это имеет смысл.
Впрочем, назначать чрезмерно сложный шейдер для расчета тени вряд ли стоит из-за соображений производительности. В mental ray действует соглашение, согласно которому если shadow шейдер не указан в операторе (или слоте shadow материала 3ds max) явно, тогда объект по умолчанию считается непрозрачным. Указывать явно теневой шейдер не нужно в том случае, если используется расчет global illumination - тени будут рассчитаны методами gi.

Оператор
volume shader [ shader_list]

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

Оператор
environment shader [ shader_list]

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

Оператор
contour shader [ shader_list]

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

Оператор
photon shader [ shader_list]

еще один оператор, который не предназначен для вычислений цвета объекта, которому этот шейдер непосредственно назначен в составе материала. Шейдер используется только на этапе трассировки фотонов и создании фотонных карт, определяя как фотоны взаимодействуют с данным материалом. Расчет же фотонной освещенности объекта выполняется на основе настроек рендеринга в секции Indirect Illumination и никак не использует этот шейдер. В качестве фотонного шейдера могут быть использованы как специально написанные (например, photon basic), так и обычные материальные шейдера.
В последнем случае mental ray в состоянии автоматически определить, что материальный шейдер используется как фотонный. Наиболее правильным, с практической точки зрения, является использование в качестве фотонного шейдера материального шейдера dgs, поскольку он обеспечивает закон сохранения энергии при расчете переотражений фотонов.

Оператор
photonvol shader [ shader_list]

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

Оператор
lightmap shader [ shader_list]

позволяет назначить материалу шейдер, который будет запекать в текстуру все падающее в данную точку освещение (illuminance или irradiance). Этот шейдер подробно рассматривался в обзоре "Mental ray для 3ds max. Часть 5. Запекание текстур (render to texture)"

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

Возможности, заложенные в схему трассировщик - материал (материальный шейдер), при которой специальная подпрограмма-обработчик вызывается по факту возникновения пересечения, обладают большим потенциалом. По сути, мы имеем очень мощный инструмент, позволяющий обрабатывать поверхности объектов поточечно и произвольным образом, так, как нам нужно.
Например, это можно использовать для определения параметров расчета вторичного освещения индивидуально для материалов. Или, можно реализовать совершенно новый алгоритм расчета освещения, такой как Metropolis Light Transport. Или реализовать новую BRDF. Или определить использование спектральных цветовых пространств вместо стандартной модели RGB... Возможности расширения свойств рендеринга новыми шейдерами неограниченны, а встраивание новых шейдеров стандартизировано, просто и удобно.

Шейдеры и параметры

Говоря о простоте и удобстве, нужно также упомянуть еще об одной замечательной возможности mental ray. Речь идет об определении значений параметров одних шейдеров при помощи значений, возвращаемых другими шейдерами (shader assignment). Это свойство позволяет строить цепочки шейдеров через их параметры, соединяя их в последовательности и сети для построения более сложных материалов или phenomena.

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

В 3ds max это правило работает "визуально", каждому параметру шейдера можно вместо постоянного значения назначить другой шейдер из списка доступных, который появляется при нажатии кнопки справа от константного значения параметра:



Назначение шейдеров в качестве параметров других шейдеров в 3ds max

В 3ds max принята классификация шейдеров по назначению, вследствие которой работают дополнительные ограничения на подключение шейдеров. Реализовано это при помощи оператора apply в декларации шейдеров. Например, если шейдер при декларации имеет строчку "apply material", то он будет виден только в редакторе материалов и недоступен для назначения в качестве shadow шейдера (хотя mental ray это допускает). В mental ray такие ограничения не используются и директива apply просто игнорируется (действует только правило соответствия типов). Поэтому, если шейдер не виден в какой-либо категории, исправить положение просто - нужно отредактировать декларацию этого шейдера, добавив нужную категорию в apply.

Например, в декларации всех материальных шейдеров присутствует "apply material". Если дописать "apply material, shadow, photon", то материальные шейдеры станут доступны не только для слота surface, но и для shadow, и для photon - то есть с их помощью можно будет определять тени и фотонные свойства материалов.

Оператор apply является функцией mental ray и предназначен для описания возможной области применения шейдера, носит исключительно рекомендательный и информационный характер. В mental ray также регламентированы и ключи этого оператора (типы шейдеров по назначению):

  • lens: линзовый шейдер для камеры
  • material: материальный шейдер
  • light: шейдер источника света
  • shadow: теневой шейдер для материалов
  • environment: шейдер окружения для материалов или камер
  • volume: объемный шейдер для материалов или камер
  • texture: текстурный шейдер
  • photon: фотонный шейдер для материала
  • geometry: геометрический шейдер
  • displace: displacement шейдер для материала
  • lightmap: шейдер запекания освещения в текстуру для материала
  • emitter: шейдер фотонного эмиттера, управляющий испусканием фотонов от источников света
  • output: шейдер вывода для камер
  • state: шейдер состояния

В 3ds max использование оператора apply в декларации шейдера с указанием его ключей является обязательным требованием и вызывает сообщение об ошибке, если оператор или его ключи не указаны.

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

Подключение шейдеров в mi файле рассмотрим на примере назначения шейдера mib_cie_d в качестве цвета для светового шейдера точечного источника mib_light_point.

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

declare shader
color "mib_light_point" (
color "color",
boolean "shadow",
scalar "factor",
boolean "atten",
scalar "start",
scalar "stop"
)
version 1
apply light
end declare

declare shader
color "mib_cie_d" (
scalar "temperature",
scalar "intensity"
)
version 1 apply light
end declare

Мы хотим использовать mib_cie_d для определения параметра "color" у mib_light_point. Обратите внимание, что тип результата, возвращаемого mib_cie_d и тип параметра "color" у mib_light_point одинаковы - это цвет (color).

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

shader "color_light" "mib_cie_d" (
"temperature" 2700,
"intensity" 1)

Здесь мы определили шейдер типа mib_cie_d с именем "color_light" и присвоили его параметрам "temperature" и "intensity" значения.

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

shader "my_light" "mib_light_point" (
"color" ; = "color_light",
"shadow" off,
"factor" 0,
"atten" off,
"start" 0,
"stop" 40)

Аналогичную цепочку можно построить и средствами 3ds max, но потребуется отредактировать оператор apply в декларации mib_cie_d - дописать для apply light новый ключ material, вот так: apply light, material. После этого шейдер станет доступен для определения цвета точечного источника.



Назначение mib_cie_d в качестве параметра цвета светового шейдера точечного источника в 3ds max

Phenomena

Возможность назначения шейдеров в качестве параметров лежит в основе phenomena. Phenomenа расширяют концепцию шейдеров, позволяя строить из простых шейдеров более сложные, соединяя их в разветвленные цепочки (shader graph) посредством параметров. Для mental ray phenomena не отличается от обычных шейдеров - как и шейдеры, phenomena так же должны быть декларированы и имеют параметры, значения которых должны быть определены перед использованием. Как и шейдеры, phenomena должны иметь свой mi-файлы, которые хранят их "код". Но в отличие от шейдеров, phenomena не являются настоящими программами, поэтому для них не нужен dll (dso) -файл с программным кодом, реализующим их функции. По сути, phenomena просто описывают какие шейдеры, в какой последовательности и для каких параметров используются.

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

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

declare phenomenon color "light_color_phen"
(scalar "temp",
scalar "inten")
apply light version 1
#"код" phenomena#
shader "color_light" "mib_cie_d" (
"temperature" = interface "temp" ,
"intensity" = interface "inten")
shader "my_light" " mib_light_point" (
"color" = "color_light",
"shadow" on,
"factor"
"factor" 0,
"atten" off,
"start" 0,
"stop" 40)
root = "my_light"
end declare

Параметры phenomena "temp" и "inten" являются интерфейсными параметрами, то есть предназначены для передачи значений извне для параметров шейдера mib_cie_d: "temperature" = interface "temp" и "intensity" = interface "inten". Затем, шейдер mib_cie_d назначается в качестве параметра другого шейдера - mib_light_point, его значение определит цвет источника света (параметр "color"). Наконец, оператор root определяет значение, которое будет возвращать phenomena. В данном случае это значение шейдера my_light типа mib_light_point. Обратите внимание, что тип возвращаемого шейдером my_light результата и объявленный тип результата в декларации phenomena идентичны - color. Такая идентичность типов - обязательное условие.

Если написанный выше "код" сохранить в файл с расширением .mi, например "my_phen.mi", и подключить его при помощи директивы mi "путь_к_файлу\my_phen.mi" в rayrc или в standard.mi, то phenomena "light_color_phen" может быть использован в сцене как обычный световой шейдер:

$include

"my_phen.mi"

................................................

shader "my_light_color" "light_color_phen"
("temp" ; = 2500,
"inten" = 1

................................................

Более того, phenomena "light_color_phen" будет виден в 3ds max как обычный световой шейдер с двумя настроечными параметрами - температурой и интенсивностью.



Phenomena в 3ds max виден как обычный шейдер заданного apply типа

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

Как и шейдеры, phenomena предназначены прежде всего для создания сложных материалов на основе более простых материальных шейдеров. Реальным примером сложных phenomena является материал sss_fast_skin, который подробно рассмотрен в обзоре "Mental ray 3.3 для 3ds max. Часть 4. Упрощенная модель подповерхностного рассеяния SSS Fast" (http://www.ixbt.com/soft/ss_fast.shtml). Или Car paint Phenomenon, который появился в standalone mental ray версии 3.4 (файл paint.mi) и представляет собой сеть из шейдеров mi_metallic_paint, mi_bump_flakes, mib_glossy_reflections, mib_color_interpolate и mib_illum_lambert.



Car paint Phenomenon

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

declare phenomenon
[ тип] " phenomenon_name " ( тип " parameter_name ",
..........................
тип " parameter_name " )
[ version version ]
[ shader " name "
[ material " name " ... end material
[ light " name " ... end light
[ instance " name "... end instance
[ roots ]
[ options ]
end declare

В определении phenomena могут быть использованы любые шейдера, конструкции материалов, источников света и инстансы. Блок options предназначен для указания только необходимых условий, которые обязательно должны быть выполнены, прежде чем phenomena может быть вызван. Перед рендерингом mental ray проверяет эти условия в декларациях всех шейдеров и phenomena, используемых в сцене, разрешает конфликты и настраивает глобальные опции сцены, чтобы удовлетворить этим требованиям. Полный список опций включает: scanline on|off, trace on|off, shadow off, shadow on, shadow sort, shadow segments, face front|back|both, derivative [ 1] [ 2], object space, camera space, volume level.

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

Возможные типы root:

root shader
в качестве возвращаемого значения определяется значение шейдера, как мы это видели в примере с light phenomena. По принятому соглашению в качестве результата phenomena должны быть указаны именные шейдеры без параметров: root = "name_shader". Тип результата шейдера должен совпадать с декларированным типом phenomena. Этот вид phenomena является основным для практического использования и эквивалентен регулярному шейдеру.

root material " material_name "
указывает, что сконструированный phenomena будет материалом, при этом тип phenomena в декларации обязательно должен быть material. В этом случае phenomena может быть использован для создания собственной конструкции материала, который затем используется как регулярный материал, а не шейдер, везде, где применение материалов допустимо.

Из этих двух видов root в определении phenomena один обязательно должен присутствовать и наличие одного исключает присутствие другого. Таким образом, для mental ray phenomena - это либо обычный шейдер, либо материал.

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

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

volume shader,
позволяет добавить объемный шейдер (например, шейдер атмосферы) для камеры.

environment shader
добавляет шейдер окружения для камеры.

lens shader
добавляет линзовые шейдеры для камеры

output shader
output [ " type "] " format " [ opt] " filename "
позволяют добавить шейдеры и операторы выводы в определение камеры до начала рендеринга. Например, если phenomena рассчитывает и записывает пользовательские данные, этот вид root позволит создать пользовательский буфер для их вывода.

contour store shader
contour contrast shader
позволяют вводить шейдеры для NPR (non photorealictic rendering).

volume priority priority (целое число),
lens priority priority (целое число),
output priority priority (целое число)
определяют приоритет размещения шейдеров указанных типов в определении камеры.

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

Важность phenomena для практического использования всегда подчеркивалась разработчиками. Совсем свежие новости из этой области - mental images расширили линейку своих продуктов, добавив, в числе прочих новых приложений, mental mill специально для облегчения разработки шейдеров и шейдерных графов (phenomena). В частности, mental mill позволяет разрабатывать, тестировать и настраивать шейдеры и phenomena для аппаратного и программного рендеринга при помощи интуитивного графического интерфейса в режиме реального времени и, в силу этого, предназначен для самого широкого круга пользователей. Подробнее об этом можно узнать здесь: http://www.mentalimages.com/2_0_products/index.html.

Ну что же, пора подводить итоги.

Итак, мы познакомились с конструкцией материалов mental ray, шейдерами, входящими в ее состав, их назначением и свойствами. Узнали в подробностях о работе материального шейдера, являющегося основой материала (да и основой расчетов изображений в mental ray тоже). Рассмотрели shader assignment - назначение шейдеров в качестве параметров других шейдеров, и познакомились с phenomena и правилами их определения.

Я надеюсь, что этой информации достаточно для понимания основных принципов работы mental ray с материалами и составляющими их шейдерами. А когда основной принцип ясен, с деталями разобраться намного проще.

Приложение 1.

is_mat_irradiance - шейдер расчета вторичного освещения индивидуально для материалов

Как мы теперь уже знаем, расчет вторичного освещения методами final gathering, global photon map (GI) и caustic photon map, является неотъемлемой и обязательной частью любого стандартного материального шейдера. Настройки расчетов задаются в 3ds max в секции Indirect Illumination панели Rendering или блока Options в mi-файле сцены. Эти настройки являются "глобальными" в том смысле, что они имеют силу для всех объектов - расчет вторичного освещения всех объектов сцены будет выполнен с одними и теми же настройками качества расчетов.
Однако, часто имеет место ситуация, когда одни части сцены требуют высокого качества, например там где освещение меняется быстро или есть важные мелкие детали геометрии, тогда как другие объекты сцены не требуют высокого качества (например, плоские ровные поверхности с медленно меняющимся освещением). Хотя алгоритм расчетов умеет правильно учитывать такие ситуации при помощи механизма адаптивности, все же хотелось бы иметь возможность индивидуальной по-объектной настройки качества расчетов. Это может быть весьма полезно для сокращения общего времени расчетов или для локального разрешения ошибок расчета освещения.

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

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

Предлагаемый вашему вниманию шейдер is_mat_irradiance является одним из возможных способов реализации новой возможности по-материального расчета вторичного освещения. Его основная идея вытекает из вышеописанной проблемы - не программируя заново все материальные шейдера отключить встроенный расчет вторичного освещения и заменить его новым. Такую возможность предоставляет манипулирование с данными state.

Принцип работы этого шейдера прост - is_mat_irradiance назначается в слот поверхности (Surface материала типа mental ray или mental ray Connection стандартных материалов 3ds max), вместо материального шейдера, а сам материальный шейдер назначается в качестве одного из параметров is_mat_irradiance. Таким образом, is_mat_irradiance действует как своеобразный переходник, выполняющий необходимые манипуляции, чтобы реализовать по-материальный расчет вторичного освещения. Необходимость в перепрограммировании шейдеров отпадает - можно как и раньше использовать любые стандартные материальные шейдера или материалы 3ds max (через дополнительный стандартный Material to Shader).

Настроечные параметры is_mat_irradiance:



Интерфейс шейдера is_mat_irradiance

Назначение параметров:

- Mtl. Irradiance Off : отключает расчет вторичного освещения для материала.

- Irradiance In Reflect/Refract: если установлен, рассчитывается вторичное освещение в отражениях и преломлениях. По умолчанию установлен, если отражений или перломлений в сцене нет, отключение параметра ускорит рендеринг.

- Input Mtl : слот, куда должен быть подключен материальный шейдер mental ray или материал 3ds max, является аналогом слота Surface.

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

- чекбоксы Mtl. Overwrite Caustic, Mtl. Overwrite GI и Mtl. Overwrite FG, если установлены, позволяют переопределять настройки расчета вторичного освещения индивидуально для материала/мат. шейдера, заданного в Input Mtl.

параметры Num. Photons per Sample, Max. Sampling Radius для каустики и GI, Num. Samples, Max. Radius, Min. Radius, Radii in Pixels для FG являются параметрами качества расчетов и идентичны аналогичным из секции Indirect Illumination глобальных настроек, но действуют только для материала, подключенного в слоте Input Mtl.

FG Occlusion in alfa : если включен, возвращает в альфа канале fg occlusion, если выключен - обычный альфа-канал, рассчитываемый материальным шейдером.

Irradiance Multiplier : множитель интенсивности вторичного освещения. Новый метод расчета вторички возвращает значение интенсивности освещения в pi (3.14) раз слабее старого метода. Основное назначение множителя - обеспечить совместимость результатов старого и нового методов (нужно ввести значение 3.14 вместо 1), но может также использоваться для произвольного управления интенсивностью вторичного освещения.

Irr. for BackSide On : если включен, то вторичная освещенность рассчитывается для всех полигонов, в том числе тех, нормали которых "смотрят" от камеры. По умолчанию выключен.

Use Fast Sky : позволяет реализовать имитацию освещения от полусферы небесного свода при помощи использования fg occlusion - усредненных значений заблокированности fg лучей, которые возвращает новый метод расчета вторичного освещения.

Fast Sky Color : цвет освещения от Fast Sky.

Для того, чтобы расчет вторичного освещения выполнялся индивидуально для материалов также требуется включить расчет соответствующего метода в Indirect Illumination.

Вот как это выглядит на примере очень простой сцены.



Расчет освещения методом FG с глобальными настройками

Сцена освещена одним SkyLight, расчет освещения выполнен методом FG с глобальными настройками: 20 сэмплов, min radius = 0.1 см, max. Radius = 1 см., всем объектам назначен один материал с шейдером IllumLambert

Теперь для чайника и цилиндрической подставки назначим новый материал, подключив IllumLambert через is_mat_irradiance с настройками FG : 150 сэмплов, min radius = 0.1 см, max. Radius = 1 см.



Расчет вторичного освещения с индивидуальными настройками FG для материала чайника и цилиндрической подставки (увеличено число сэмплов)

Теперь c помощью is_mat_irradiance создадим материал для конуса и "земли", число сэмплов оставим равным 20, но увеличим радиусы max = 50 см., min=5 см.



Расчет вторичного освещения с индивидуальными настройками FG для материала чайника и цилиндрической подставки (увеличено число сэмплов) и материала конуса и земли (увеличены только радиусы)

Добавим немного освещения от дополнительного источника света типа spot:






Рендеринг с Fast Sky

Шейдер is_mat_irradiance (dll и mi для 3ds max), инструкция по установке прилагается.

Автор выражает глубокую признательность Павлу Ледину за ценные консультации и советы при разработке шейдера.

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

iXBT BRAND 2016

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

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

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

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