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

Конструкция материала типа 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:

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

Оператор 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... Возможности расширения свойств рендеринга новыми шейдерами неограниченны, а встраивание новых шейдеров стандартизировано, просто и удобно.