Mental ray 3.3 для 3ds max. Часть 4. Упрощенная модель подповерхностного рассеяния SSS Fast


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

Для расчета подобных объектов в mental ray предусмотрен специальный набор шейдеров и материалов.

Шейдеры:

  • misss_fast_shader (SSS Fast Render Shader), скрыт по умолчанию (то есть, невидим в редакторе материалов);
  • misss_skin_specular (SSS Specular Reflection for Skin), скрыт;
  • misss_lambert_gamma (SSS Lambert Gamma), скрыт;
  • misss_lightmap_write (SSS Lightmap Write), скрыт;
  • misss_call_shader (SSS Passthrough Shader), скрыт.

Материалы:

  • miss_fast_simple_phen (SSS Fast Material);
  • miss_fast_skin_phen (SSS Fast Skin Material);
  • miss_fast_skin_phen_d (SSS Fast Skin Material+Displace).

В скобках приведены названия, как они появляются в редакторе материалов 3ds max.

Скрытые шейдеры можно открыть, отредактировав файл subsurface.mi — в разделе declare shader каждого шейдера необходимо найти "gui" и убрать "hidden".

Расчет подповерхностного рассеяния выполняется при помощи двух специальных типов карт — карты диффузного освещения lightmap и карты глубины depthmap. Lightmap содержит информацию об освещенности точек поверхности, depthmap – об их расстоянии до камеры (z-расстояние). Каждая из них представляет собой растровую карту в формате с плавающей запятой. Обе карты записываются в один файл, lightmap — в RGB каналы, depthmap — в альфа-канал. Поэтому, к формату файла предъявляется ряд требований. Он должен поддерживать хранение четырех каналов RGBA в 32-битном численном представлении данных в формате с плавающей запятой.

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

Для 3ds max карты можно сохранять в формате tif, а просматривать сохраненные карты при помощи утилиты inf_disp или другой программы просмотра, поддерживающей работу с 32-битными файлами.

Lightmap является камерозависимой картой. Это означает, что при построении lightmap для какого-либо объекта, его поверхность проектируется на двумерную плоскость в пространстве камеры. Та часть объекта, которая ближе к камере — это "передняя" поверхность, "задняя" поверхность — это следующая по удаленности от камеры поверхность объекта, обычно — обратная, задняя сторона.

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



Рассеянный задней поверхностью свет освещает
переднюю поверхность

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

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

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



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

Данные о диффузной освещенности точек поверхности карты Lightmap рассчитываются по закону Ламберта. По умолчанию, этот расчет выполняется шейдером misss_lambert_gamma. Размер карты, то есть общее количество точек с посчитанной освещенностью, можно задавать в настройках. Когда луч от камеры достигает некоторой точки поверхности, ее освещенность от подповерхностного рассеяния рассчитывается сбором освещенностей соседних точек из lightmap с учетом затухания, определяемого заданным радиусом подповерхностного рассеяния. Количество просматриваемых соседних точек также можно изменять в настройках.

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

Именно поэтому группа шейдеров SSS Fast считается "физически некорректной" — для них мы задаем в качестве параметра то, что miss_physical "честно" рассчитывает как результат рассеяния света в объеме материала.

SSS Fast не требует для расчетов испускания фотонов, GI, замкнутости объема и даже рейтресинга.

Рассмотрим смысл и назначение настроечных параметров шейдеров и материалов.

Материал miss_fast_simple_phen

Начнем с miss_fast_simple_phen (SSS Fast Material), как одного из базовых материалов.

Этот материал является составным, то есть, построен из нескольких базовых модульных шейдеров — misss_fast_shader, misss_skin_specular, misss_lambert_gamma и bump. Он автоматически генерирует lightmap и depthmap, наполняет их данными и рассчитывает окончательный цвет с учетом упрощенной модели подповерхностного рассеяния. Содержит два рассеивающих слоя, соответствующих передней и задней поверхности объекта, слой с простыми свойствами зеркального отражения и слой не рассеянного диффузного отражения.



Вверху — объект со стандартным материалом (Blinn),
внизу — с материалом SSS Fast Material

Общее значение цвета этого материала рассчитывается по следующей схеме. Все цвета рассчитываются простыми шейдерами по отдельности и "наслаиваются" друг на друга – освещенности могут просто складываться или складываться в режиме "Screen". Складываются вначале диффузные компоненты: нижний слой — рассеяние от задней поверхности, затем рассеяние от передней поверхности и, наконец, наверху — не рассеянное диффузное освещение. Суммарный диффузный цвет может умножаться на простой цвет или растровую карту (параметр overall color) и затем складываться с зеркальными подсветками для получения окончательного результата. Зеркальные подсветки "лежат" на самом верху.

Спецификация шейдера:

material "misss_fast_simple_phen" (
color texture "lightmap", скрыт в интерфейсе материала 3ds max
color texture "depthmap", скрыт string "lightmap_group",
scalar "lightmap_size",
integer "samples",
shader "bump",
struct "d" {
color "ambient",
color "overall_color",
color "diffuse_color",
scalar "diffuse_weight",
color "front_sss_color",
scalar "front_sss_weight",
scalar "front_sss_radius",
color "back_sss_color",
scalar "back_sss_weight",
scalar "back_sss_radius",
scalar "back_sss_depth"
},
struct "s" {
color "specular",
scalar "exponent"
},
struct "a" {
scalar "lightmap_gamma",
boolean "indirect",
scalar "scale_conversion",
scalar "scatter_bias",
scalar "falloff",
boolean "screen_composit"
},
integer "mode", # light selection mode 0..2, скрыт
array light "lights", скрыт
)



Вид интерфейса SSS Fast Material по умолчанию в 3ds max



Вид интерфейса SSS Fast Material
со всеми открытыми слотами свойств

Группа параметров SSS Fast Material (mi) Parameters:

lightmap и depthmap — по умолчанию, скрыты. Предназначены для указания имен карт lightmap и depthmap. В обычных обстоятельствах предполагается, что эти имена назначаются картам автоматически по некоторым внутренним правилам и определения не требуют.
При явном указании файла, его имя и параметры нужно задавать только в слоте "lightmap", слот "depthmap" определять не нужно. Размер lightmap по ширине должен быть вдвое больше размера рендера по ширине, а по высоте соответствовать высоте рендера. Например, если размер рендера 500х500, ширина lightmap должна составлять 1000, высота — 500. И обязательно нужно указывать использование 32 бит на канал.
Если имена файлов не указываются явно (слот "lightmap" остается пустым), карты резидентно хранятся в оперативной памяти.





Карта lightmap с данными освещенности передней и задней поверхности. "Полосатость" изображения обусловлена совмещением в соседних пикселях данных
о передней и задней поверхности.



Карта с данными глубины. Пусть вас не вводит в заблуждение белый цвет — это издержки 8-битного отображения монитором 32-битного изображения. Реальные значения пикселей можно измерить "пипеткой" в HDRShop

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

lightmap_group (Scatter group) — имя группы. Паре карт lightmap/depthmap будет присвоено групповое имя, указанное в lightmap_group. Этот параметр предназначен для автоматического генерирования резидентных карт и передачи их для расчетов всем шейдерам.
Все объекты, имеющее одно и то же имя в lightmap_group, будут взаимодействовать при расчете рассеяния, объекты с разными именами в lightmap_group взаимодействовать не будут. Использование различных групп увеличивает объем необходимой для расчетов памяти, поэтому использовать разные группы для материалов следует только в том случае, если это приводит к появлению артефактов. Например, при рендере рукопожатия двух людей для рук следует использовать материалы с разными именами в lightmap_group.

Другой пример — если один объект полностью содержится в другом объекте (стенки объектов не должны соприкасаться), то для блокирования подсветки от задней рассеивающей поверхности содержащего объекта внутреннему объекту можно назначить другой материал, но с тем же именем в lightmap_group. Имена чувствительны к регистру, то есть "А" и "а" — это разные имена.



Два объекта — куб и помещенная в него сфера. Материалы объектов разные, но имеют одинаковое имя в lightmap_group и потому взаимодействуют при расчете рассеяния — сфера блокирует свет



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

lightmap_size — размер карты lightmap, выраженный в процентах от размера рендера. Обычно, 50% размера вполне достаточно, но при возникновении артефактов на краях объектов, размер lightmap нужно увеличивать.

samples (Number of samples) — количество близлежащих точек (сэмплов) lightmap, собираемых для расчета освещенности точки. Samples — один из регуляторов уровня шума в рендере. Минимальное значение, установленное по умолчанию, — 32 сэмпла на луч.



Верхнее изображение — samples = 16,
нижнее — samples = 256

Реальное количество собираемых сэмплов будет определяться тремя параметрами: значением samples, величиной радиуса рассеяния и размером lightmap.

bump (Bump shader) — шейдер, позволяющий определить расчет псевдорельефа (bump — искажение нормалей точек поверхности) при помощи процедурной или растровой карты. По умолчанию назначен шейдер mental ray Bump (3ds max), при необходимости его можно заменить на другой.



Для шейдера bump использована растровая карта

Mode (скрыт) — определяет режим работы с источниками света: 0 — учитывается освещение от всех источников в сцене, 1 — учитывается освещение только от указанных в списке Lights источников, 2 — не учитывается освещение от источников, представленных в списке Lights.

Lights (скрыт) — позволяет установить/отключить режим работы со списком источников света и создать такой список.

Параметры Mode и Lights представляют альтернативный стандартному для 3ds max методу включения/исключения объектов из освещения.
Рекомендую открыть их и использовать, поскольку при работе с материалами группы Fast SSS стандартное исключение из освещения средствами 3ds max не работает.

Группа параметров, определяющих диффузные свойства рассеивающего материала Diffuse Sub Surface Scattering:

ambient (Ambient/Extra light) — определяет фоновое освещение. Ambient - освещение добавляется в lightmap и учитывается при расчете рассеяния, наряду с освещением от источников. Поэтому, его можно использовать для определения реального рассеянного фонового освещения от HDRI карт или ambient occlusion.



Рассеяние без и с использованием ambient occlusion
(нижнее изображение)

Использование ambient occlusion позволяет достичь более плавных переходов на границе освещенных областей и тени. Эффект достаточно тонкий, но вполне различимый.

overall_color (Overall diffuse coloration) — множитель для суммарного диффузного освещения всего материала: unscattered disffuse color + Front surface color + Buck Surface scatter color, не воздействует на зеркальные свойства материала. Может изменять интенсивность и оттенок цвета умножением заданного в overall diffuse coloration цвета (или карты) на суммарный диффузный цвет материала. Этот слот полезен в качестве блокирующей маски для помещения растровой карты, имитирующей родинки на коже, грязь, текстурные брови и тому подобного. Не рекомендуется для помещения растровой карты цвета поверхности, ее лучше положить в слот diffuse_color.

diffuse_color (Unscattered diffuse color) — обычный, не рассеянный диффузный цвет материала, рассчитываемый по закону Ламберта. Этот цвет накладывается поверх рассеянного освещения. Здесь уместна аналогия со слоями в Adobe Photoshop — на самом верхнем слое лежит overall_color, на слое под ним — unscattered diffuse color, рассеянный свет располагается на нижних слоях. SSS Fast material использует для расчета диффузного не рассеянного освещения шейдер misss_lambert_gamma (SSS Lambert Gamma).

diffuse_weight (Unscattered diffuse weight)— множитель, определяющий степень проявления не рассеянного диффузного цвета. Чем больше множитель, тем больше величина соответствующего диффузного компонента и тем сильнее он проявится при рендере. Можно вновь воспользоваться аналогией с Photoshop — изменение weight идентично изменению прозрачности слоя. Вообще же вес всех слоев имеет простую цель — балансировать их вклады при формировании общего цвета материала.

front_sss_color (Front surface scatter color) и front_sss_weight (Front surface scatter weight) — цвет и вес рассеянного освещения от front (передней) рассеивающей поверхности.

front_sss_radius (Front surface scatter radius)— радиус рассеяния освещения для передней поверхности в миллиметрах. Радиус измеряется в единицах сцены, деленных на значение Scale conversion factor. Радиус является ключевым параметром для определения рассеивающих свойств материала. Чем меньше радиус, тем меньше рассеивающие свойства материала и тем больше он походит на обычный материал без рассеяния.

back_sss_color (Back surface scatter color) и back_sss_weight (Buck surface scatter weight) — цвет и вес рассеянного света от задней поверхности.

back_sss_radius (Buck surface scatter radius) — радиус рассеяния освещения для задней поверхности.

back_sss_depth (Back surface scatter depth) — определяет максимальное расстояние от задней поверхности, на котором виден рассеянный ею свет. Если радиус достаточно велик, рассеянный свет от задней поверхности может "подсвечивать" переднюю поверхность. Глубина особенно важна для проявления эффектов подповерхностного рассеяния в тонких объектах. Например, покраснение ушей или просвечивание костей кисти руки сквозь тело при заднем освещении. Если величина Back surface scatter depth не указана, она полагается равной величине радиуса рассеяния для задней поверхности.

Группы параметров front_sss и back_sss определяют визуальное проявление подповерхностного рассеяния материала и вычисляются при помощи lightmap. Для расчета карт освещения SSS Fast Material использует второй шейдер — самплер misss_lambert_gamma (первый — для расчета не рассеянного диффузного освещения).

Группа параметров зеркальных свойств Specular reflections:

Для реализации зеркальных отражений в SSS Fast Material используется шейдер misss_skin_specular (SSS Specular Reflection for Skin). Точнее, часть параметров первого слоя зеркальных подсветок primary_spec_color и primary_shinyness, второй слой просто не используется (описание этого шейдера будет дано немного позже).

specular (Specular color) — цвет и интенсивность зеркальных подсветок.

exponent (Shininess) — размер зеркальной подсветки, этот параметр определяет степень экспоненты для расчета размера пятна подсветки — стандартной подсветки, которую можно видеть у материалов типа phong или Blinn. Чем меньше его значение, тем шире пятно, чем больше — тем меньше размер подсветки.



Применены растровые карты для bump,
overall diffuse coloration и specular

С зеркальными подсветками материала SSS Fast Material связана небольшая ошибка. Проявляется она в том, что если даже установить specular в нулевое значение, подсветки все равно будут присутствовать в материале. Как уже говорилось выше, зеркальные свойства материала реализованы шейдером misss_skin_specular, который имеет два слоя отражений. При определении материала SSS Fast явно задаются начальные значения только для первого слоя, значения для второго слоя остаются по умолчанию. А по умолчанию второй слой вовсе имеет ненулевое значение отражения. Поэтому, когда мы убираем зеркальные подсветки первого слоя, подсветки от второго слоя все равно остаются. Исправить ошибку просто — нужно отредактировать subsurface.mi — дописать "secondary_weight = 0" для шейдера "specular", то есть принудительно обнулить отражения от второго слоя. В конце статьи я дам ссылку на исправленный файл.
Та же ошибка имеет место и в материале для Maya (misss_fast_simple_maya) и "лечится" точно также — обнулением отражений от второго слоя.

Advanced options:

lightmap_gamma (Lightmap gamma curve)— параметр управления формой gamma-кривой для освещения, сохраняемого в lightmap. Если gamma = 1.0, в lightmap сохраняется обычное диффузное освещение, рассчитанное по закону Ламберта. Если gamma меньше 1.0, форма кривой "уплощается", что в конечном итоге приводит к осветлению lightmap. Если gamma больше 1.0, форма кривой будет заостряться, что приведет к концентрации рассеянного света вблизи точки падения луча, то есть к затемнению lightmap. На практике используются значения gamma в пределах от 0.4 до 0.8.

Мы уже знаем, что SSS Fast Material использует два независимых шейдера - сэмплера misss_lambert_gamma, один для расчета диффузного не рассеянного освещения и второй — для расчета lightmap. Параметр lightmap_gamma является на самом деле параметром шейдера misss_lambert_gamma. Так вот, к чему я веду — при расчете диффузного освещения мы не можем изменять lightmap_gamma для диффузного не рассеянного освещения, поскольку при объявлении материала ему жестко задано значение, равное 1. Поэтому для настройки гаммы освещения нам доступен только один параметр из двух возможных — для lightmap.



Сверху вниз: lightmap_gamma = 0.1, 1, 5

SSS Fast Material имеет ошибку, связанную с lightmap_gamma — изменение этого параметра никак не сказывается на результате. Ошибка вызвана тем, что при определении материала в subsurface.mi неверно вызывается одна из переменных интерфейса материала. Чтобы исправить ситуацию, открываем в текстовом редакторе subsurface.mi, ищем declare phenomenon material "misss_fast_simple_phen", далее — shader "lm_sample" misss_lambert_gamma" и затем заменяем строчку "diffuse_curve" = interface "a.diffuse_curve" на строчку "diffuse_curve" = interface "a.lightmap_gamma".

В конце статьи содержится ссылка на исправленный subsurface.mi.

indirect (Scatter indirect illumination) — позволяет учесть в рассеянии непрямое освещение от фотонов и final gathering и сохранить его в lightmap. Значительно увеличивает как реализм рендера, так и время его расчета. Использование этой возможности полезно только в том случае, если непрямое освещение дает существенный вклад в общее освещение или является единственным источником освещения.

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



Расчет освещения с final gathering,
вверху — indirect off, внизу — indirect on

scale_conversion (Scale conversion factor)— простой линейный делитель всех расстояний. Позволяет увязывать единицы измерения для различных сцен, с целью одинакового визуального проявления материала вне зависимости от масштаба объектов, к которым он применяется. Например, если материал разработан в сцене с единицами измерения миллиметр и затем используется для объекта с единицами измерения сантиметр, фактор нужно установить равным 10 (1 мм = 1/10 см).
Изменение этого параметра также позволяет быстро регулировать степень проявления подповерхностного рассеяния для всего материала сразу, что может быть удобно при настройке.
Значение scale_conversion по умолчанию равно 1, что предполагает миллиметры в качестве единиц измерения сцены. Рекомендую при работе со всеми Fast SSS материалами и шейдерами использовать именно миллиметры (и реалистичные размеры объектов, разумеется).

scatter_bias (Scatter Bias) — определяет изотропию подповерхностного рассеяния, знакомую нам по модели физического рассеяния (параметр g, определяющий распределение вероятности рассеяния по углам) и может изменяться в пределах от -1 до 1. Если scatter_bias = 0, рассеяние происходит равномерно во всех направлениях (изотропное рассеяние), при scatter_bias = 1 происходит рассеяние преимущественно вперед, при scatter_bias = -1 — рассеяние "назад".

falloff (Falloff strength) — задает форму затухания рассеянного освещения вдоль радиуса. Большие значения задают более быстрое и резкое затухание, мЕньшие значения — более плавное и гладкое затухание и создают ощущение более короткого радиуса рассеяния, чем оно есть на самом деле. Поэтому, при уменьшении falloff может потребоваться увеличение радиуса рассеяния для компенсации этого эффекта. Для значений falloff от 1.0 до 10.0 все сэмплы в пределах радиуса рассеяния имеют приблизительно одинаковый весовой коэффициент. Для величин от 0.1 до 1.0 сэмплы вблизи границы площадки рассеяния имеют меньшие весовые коэффициенты.
Уменьшение falloff приводит к затемнению рассеивающих слоев, причем передний слой гораздо более чувствителен к изменениям.

screen_composite (Screen "soft" compositing of layers) — позволяет определить способ сложения вкладов от различных типов освещения в материале. Когда галочка в чекбоксе установлена, используется Screen compositing, этот режим аналогичен режиму смешивания слоев"screen" в Photoshop. В отключенном положении все вклады просто суммируются по величине (add), что часто может привести к появлению засветок. Add - режим можно использовать, если рендер выполняется в HDRI файл для последующей нелинейной тоновой коррекции (tonemapping).

Шейдеры группы miss_fast

Основными "строительными" модулями для SSS — материалов являются шейдеры misss_fast_shader (SSS Fast Render Shader), misss_skin_specular (SSS Specular Reflection for Skin) и misss_lambert_gamma (SSS Lambert Gamma). Они специально разработаны для того, чтобы с их помощью можно было создавать новые материалы со свойствами подповерхностного рассеяния.

Misss_fast_shader (SSS Fast Render Shader)

Misss_fast_shader имеет модульную структуру, которая позволяет "каскадировать" любое (разумное :) число основных SSS - шейдеров друг с другом.

Спецификация misss_fast_shader:

color "misss_fast_shader" (
color texture "lightmap",
color texture "depthmap",
shader "bump",
shader "diffuse_illum",
color "diffuse_color",
shader "specular_illum",
scalar "diffuse_weight",
color "front_sss_color",
scalar "front_sss_weight",
scalar "front_sss_radius",
color "back_sss_color",
scalar "back_sss_weight",
scalar "back_sss_radius",
scalar "back_sss_depth",
scalar "scale_conversion",
boolean "screen_composit",
boolean "output_sss_only",
scalar "falloff",
integer "samples",
)
apply material
version 4

Назначение параметров шейдера соответствует аналогичным, которые мы уже рассмотрели на примере материала SSS Fast Material.

Рассмотрим подробнее его "строительные" свойства.

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

Shader "bump"— параметр должен определяться шейдером или материалом. Здесь недостаточно использовать просто растровую или процедурную карту. Обусловлено это тем, что misss_fast_shader должен знать оригинальное направление нормалей и направление нормалей после применения bump, поскольку расчет подповерхностного рассеяния может выполняться только с не искривленными нормалями. Другими словами, использование шейдера или материала для bump гарантирует учет bump на этапе расчета lightmap и его сохранение в карте. В интерфейсе 3ds max bump уже реализован как материал, остается только войти в его свойства и назначить карту.

Shader "diffuse_illum"— предназначен для определения алгоритма расчета освещения поверхности от источников света. Обычно, для этого должен быть использован шейдер misss_lambert_gamma (SSS Lambert Gamma), если оставить этот параметр неопределенным, то, по умолчанию, он и будет использован. Однако здесь можно задавать любой шейдер, рассчитывающий освещение — не только Lambert, но и, например, Phong, Ward, Cook-Torrance, Blinn и другие (напоминаю, эти шейдеры по умолчанию скрыты и не появляются в списке шейдеров редактора материалов, но их можно открыть, отредактировав файл base.mi).
Именно здесь нужно подключать (каскадировать) еще один misss_fast_shader, если требуется создание материала с дополнительными рассеивающими слоями.

Shader "specular_illum" — предназначен для встраивания шейдера, который будет рассчитывать зеркальные отражения и подсветки поверхности. Как правило, для этой цели лучше использовать misss_skin_specular (SSS Specular Reflection for Skin), поскольку он оптимизирован для расчетов с органическими материалами (учитывает закон Фреснеля). Но ничто не мешает использовать для этой цели любой другой подходящий шейдер. Если шейдер не указать явно, зеркальные свойства рассчитываться не будут.

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



Диаграмма построения материала

Материал, представленный на диаграмме, имеет 4 SSS — слоя, 2 зеркальных слоя, один слой диффузного не рассеянного освещения, расчет lightmap и не рассеянного диффузного освещения выполняется при помощи двух независимых шейдеров miss_lambert_gamma. Каскадируя бОльшее число шейдеров, можно получить и более сложный материал.
Каскадирование возможно потому, что рассеяние рассчитывается на основе lightmap, а не на основе цвета, возвращаемого diffuse_illum и поэтому через него можно подключать то, что нам нужно.

В 3ds max создание подобного материала может быть выполнено через mental ray Connection в свойствах стандартных материалов. Шейдер misss_fast_shader должен быть назначен свойствам поверхности и каскадирован с другими шейдерами в соответствии с диаграммой.

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

Хочу особо отметить два момента.
Первый — каскадирование miss_fast_shader нужно выполнять только через diffuse_illum. В принципе, не исключен и другой способ построения материала, например, при помощи Mix, Blend или Composite. Но в этом случае слои будут перемешиваться в несколько ином порядке — зеркальные отражения могут оказаться под диффузными, что нежелательно. Каскадирование шейдеров через diffuse_illum избавлено от этого недостатка.

Второе — сколько бы дополнительных рассеивающих слоев мы не создавали, все они будут работать с одной и той же парой передняя /задняя поверхность объекта и с одной и тоже парой lightmap/depthmap, если положение камеры неизменно.

Шейдер misss_lambert_gamma (SSS Lambert Gamma)

Спецификация misss_lambert_gamma (SSS Lambert Gamma): color "misss_lambert_gamma" (
color "ambient",
color "ambience",
color "diffuse",
boolean "indirect",
scalar "diffuse_curve",
integer "flip",
integer "mode",
array light "lights"
)
version 4
apply texture

В основе этого шейдера лежит mib _ illum _ lambert : diffuse — диффузный цвет, рассчитываемой рассчитываемый по закону Ламберта, ambient и ambience умножаются друг с другом для получения результирующего фонового цвета. Одним из недостатков освещения по Ламберту является высокая контрастность освещения. Это следствие того, что в расчете освещения используется косинус угла между направлением нормали и направлением на источник — освещение изменяется от максимума до нуля в пределах 90 градусов, то есть быстрее, чем это происходит в реальной жизни. В качестве альтернативы misss_lambert_gamma можно использовать так называемый "оборачивающий" шейдер, рассчитывающий освещение в пределах углов, больших 90 градусов. Для mental ray (Maya и Max) такой шейдер написан, получить его можно по адресу: http://www.sandstrom.on.to, в разделе Downloads: JS_wrapmaterial.

Параметр flip может принимать значения: 0, lightmap рассчитывается для поверхности, у которой нормали "смотрят" на камеру; 1 — нормали от камеры; 2 — lightmap будет рассчитана для обеих сторон поверхности. Использование flip может быть полезным при расчетах рассеяния в тонких объектах, таких как листья деревьев.

Остальные параметры мы уже рассмотрели на примере SSS Fast Material.

Misss_skin_specular (SSS Specular Reflection for Skin) и материал miss_fast_skin_phen (SSS Fast Skin Material)

Шейдер misss_skin_specular (SSS Specular Reflection for Skin) рассмотрим в составе материала miss_fast_skin_phen (SSS Fast Skin Material):

material "misss_fast_skin_phen" (
color texture "lightmap",
color texture "depthmap",
string "lightmap_group",
scalar "lightmap_size",
integer "samples",
shader "bump",
struct "d" {
color "ambient",
color "overall_color",
color "diffuse_color",
scalar "diffuse_weight",
color "front_sss_color",
scalar "front_sss_weight",
scalar "front_sss_radius",
color "mid_sss_color",
scalar "mid_sss_weight",
scalar "mid_sss_radius",
color "back_sss_color",
scalar "back_sss_weight",
scalar "back_sss_radius",
scalar "back_sss_depth"
},
struct "s" {
scalar "overall_weight",
scalar "edge_factor",
color "primary_spec_color",
scalar "primary_weight",
scalar "primary_edge_weight",
scalar "primary_shinyness",

color "secondary_spec_color",
scalar "secondary_weight",
scalar "secondary_edge_weight",
scalar "secondary_shinyness",

scalar "reflect_weight",
scalar "reflect_edge_weight",
scalar "reflect_shinyness",
boolean "reflect_environment_only",
shader "environment"
},
struct "a" {
scalar "lightmap_gamma",
boolean "indirect",
scalar "scale_conversion",
scalar "scatter_bias",
scalar "falloff",
boolean "screen_composit"
},
integer "mode", # light selection mode 0..2
array light "lights"
)

Создание реалистичного материала кожи является одной из трудных задач компьютерной графики. Исследования в этой области ведутся уже довольно давно, и к настоящему времени основные требования к модели материала уже определены. Такая модель должна учитывать подповерхностное рассеяние, минимум, от трех слоев — верхнего (dermal), имитирующего рассеяние света кожей, подкожного (epidermal), имитирующего рассеяние в мускульных тканях, и рассеяние от задней поверхности для тонких частей тела (например, — ушей, кистей рук) при освещении сзади. Кроме того, кожа должна обладать зеркальными отражениями, имитирующими отражения от жирового слоя кожи и отражения от "мокрой" кожи. Это приводит к необходимости иметь два слоя зеркального отражения: один для широких и размытых отражений и второй — для тонких, но достаточно резких сильных подсветок. Также необходимо учитывать и тот факт, что отражение должно быть сильнее для света, падающего под малыми углами к поверхности кожи и меньше, если свет падает на поверхность под углами, близкими к перпендикулярным (закон Фреснеля).

Материал miss_fast_skin_phen (SSS Fast Skin Material) в полной мере позволяет реализовать все эти ключевые свойства кожи. Он содержит три рассеивающих слоя, два слоя зеркальных отражений, позволяет делать отражения размытыми, учитывать непрямое освещение и т.д.

Назначение параметров miss_fast_skin_phen таких, как lightmap, depthmap, lightmap_group, lightmap_size, samples, bump, ambient, lightmap_gamma, indirect, scale_conversion, scatter_bias, falloff и screen_composit соответствует аналогичным параметрам материала miss_fast_simple_phen.

Остальное рассмотрим подробнее.

Нас, прежде всего всего, интересует группа параметров struct "s". Именно она отвечает за свойства зеркальных отражений, а ее параметры соответствуют параметрам шейдера misss_skin_specular.

Оverall_weight — общий весовой коэффициент для всех типов зеркальных отражений. Универсальный регулятор, позволяющий быстро изменять силу всех типов specular - отражений материала. Хорошее место, чтобы поместить растровую карту зеркальных отражений.

Edge_factor — параметр устанавливает размер (ширину) зеркальных отражений на краях объекта, где угол между направлением падающего света и нормалью к поверхности велики (почти перпендикулярны) и таким образом, влияет на силу проявления Фреснелевских отражений. Чем больше значение edge_factor, тем меньше размер и интенсивность отражений на краях. Величина edge_factor учитывается для краевых отражений всех "зеркальных" слоев.

Primary_spec_color и primary_weight — цвет и весовой коэффициент подсветок первого зеркального слоя.

Primary_edge_weight — дополнительный множитель для отражений на краях объекта (Фреснелевские отражения) для первого слоя. Окончательное значение отражений вблизи краев для первого слоя будет определяться суммой значений edge_factor и primary_edge_weight.

Primary_shinyness — значение показателя экспоненты для расчета подсветок. Чем больше его значение, тем меньше и резче световой блик на поверхности и наоборот. По умолчанию, первый слой имитирует широкие подсветки небольшой интенсивности со значением primary_shinyness = 5.

Secondary_spec_color, secondary_weight, secondary_edge_weight, secondary_shinyness — параметры второго зеркального слоя, аналогичны по назначению соответствующим параметрам первого слоя. Второй слой предназначен для воспроизведения относительно сильных небольших по размеру подсветок. Значение secondary_shinyness по умолчанию равно 33.

Reflect_weight и reflect_edge_weight — параметры, определяющие размытость отражений, если они не равны нулю, то будут рассчитываться glossy отражения для обоих слоев. Эти параметры требуют включения рейтресинга, поскольку для построения отражений сэмплируется окружение материала. Параметры позволяют "привязать" материал к окружению, что очень важно для реализма материала кожи. Может быть, не менее важно, чем подповерхностное рассеяние. Трассирование окружения лучше и быстрее выполнять, определив шейдер локального окружения environment при помощи карты типа Gradient Ramp или HDRI и включив Reflect_environment_only = on. Значения Reflect_weight и reflect_edge_weight не должны быть большими — кожа все-таки не зеркало, но достаточными, чтобы передать оттенок цвета окружения.

Reflect_shinyness — размер и степень размытости отражений окружения, значение 0 соответствует чистым зеркальным отражениям (без размытия. Если параметр не равен нулю, рассчитываются размытые отражения).

Reflect_environment_only — если включен, позволяет сэмплировать лучами только карту environment, если нет — трассируется настоящее окружение объекта в сцене.

shader "environment" — позволяет задавать локально для объекта карту окружения.

Как уже отмечалось выше, особенностью этого материала является наличие трех рассеивающих слоев:

Первый слой — front sss layer имитирует рассеяние света в верхнем кожном покрове (Epidermal skin layer). Параметры front_sss_color, front_sss_weight и front_sss_radius описывают цвет, вес и радиус рассеяния в эпидермисе. По умолчанию значения этих параметров соответствуют характерным признакам кавказской ("белой") расы: желтоватый цвет с весом 0.5 и радиусом рассеяния от 5 до 10 мм.

Второй слой — mid sss layer воспроизводит рассеяние от подкожного "мясного" слоя (subdermal skin layer). По умолчанию, параметры mid_sss_color, mid_sss_weight и mid_sss_radius описывают цвет, вес и радиус рассеяния, характерные для кавказской расы — красный/оранжевый цвет слоя, вес = 0.5 и радиус рассеяния от 10 до 25mm.

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

Библиотека материалов 3ds max содержит еще одну разновидность рассеивающего материала — miss_fast_skin_phen_d (SSS Fast Skin Material+Displace). Он полностью идентичен miss_fast_skin_phen, но поддерживает использование карт displacement.

Рассмотрим использование материала кожи на примере.
Сцена содержит модель женской головы с тремя текстурными картами для цвета, зеркальных отражений и рельефа (bump), освещенную по стандартной схеме из трех источников света — ключевого, заднего и заполняющего. Единицы измерения сцены — миллиметры, размер модели головы по высоте около 30 сантиметров. Вот так выглядит сцена со стандартными материалами.



Стандартный материал (phong)
с картами для цвета, отражений и рельефа

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



Материал кожи со значениями по умолчанию

Выглядит не очень. Посмотрим, что можно с этим сделать.
Сначала займемся настройкой рассеяния от первого слоя. Первый слой должен передавать "восковые" свойства кожи. Лучше всего настраивать его, назначив карту bump и балансируя вклад первого слоя с вкладом слоя диффузных не рассеянных отражений. Я назначил карту цвета слою Unscattered diffuse color, эту же карту слою Epidermal (top) layer scatter color и карту рельефа шейдеру bump. Для упрощения настройки отключены вклады от среднего и заднего слоев — их вес а установлен ы в 0. Зеркальные подсветки пока оставляют желать лучшего, но не отключались, поскольку так легче видеть bump.



Величина bump слишком велика, ее нужно уменьшить. Что касается растровых карт для не рассеянного цвета и первого рассеивающего слоя, то лучше использовать не цветные, а серые карты или слабо насыщенные по цвету карты, поскольку сама по себе кожа имеет бледно-серый цвет. Почти весь цвет создает рассеяние от нижележащего подкожного ("мясного") слоя.
Главная задача этого этапа — как можно лучше передать игру света на bump, регулируя радиус рассеяния первого слоя и относительные вклады (веса) слоя не рассеянного освещения и первого рассеивающего слоя. Кожа должна иметь вид, как будто она покрыта тонким слоем воска.
Пробуя различные значения bump, радиуса рассеяния первого слоя и весов слоя не рассеянных отражений и первого рассеивающего слоя, я пришел к следующим их значениям:

  • multiplier для шейдера bump — 0.7;
  • unscattered diffuse weight — 0.5;
  • epidermal (top) layer scatter weight — 0.7;
  • epidermal (top) layer scatter radius — 8 мм;



Брови как будто нарисованы на воске. Чтобы устранить этот эффект, я создал еще одну grayscale-карту из карты цвета, оставив на ней только брови и ресницы на белом фоне и отрегулировав значение серого при помощи levels (Photoshop), немного осветлив все изображение. Эту карту я использовал для Overall diffuse coloration.



Смысл этих действий — создать маску, блокирующую рассеяние в требуемых областях.

Использованная схема размещения растровых карт не единственная. Другой способ состоит в том, чтобы поместить карту цвета только в Overall diffuse coloration (карта должна быть цветной) и регулировать цвет первого слоя рассеяния и диффузный цвет. Недостаток этого способа — рассеяние будет изменяться вдоль поверхности, и даже полностью блокироваться в темных областях растровой карты, если они есть.

Пора включить в игру второй слой и настроить оттенок кожи. Меняя значение веса и радиуса рассеяния, я пришел к следующим их значениям:

  • Subdermal layer scatter color R = 242, G = 74, B = 51 (красноватый оттенок, а не оранжевый, как задано по умолчанию);
  • Subdermal layer scatter radius = 45 мм;
  • Subdermal layer scatter weight = 0.5



Цель этого этапа — получить нужный оттенок цвета кожи. Особое внимание следует обращать на цвет "терминатора" — границы между освещенной и темной областью. Он должен содержать достаточно цвета.
Обратите внимание внимание, как изменился цвет "терминатора" от освещения сзади (верхняя часть головы). Пожалуй, засвет великоват, я немного уменьшу интенсивность заднего освещения.
Включаем третий слой и настраиваем его вес и радиус рассеяния. Этот слой даст "подсветку" ушей и задней границы шеи. Значения, на которых я остановился:

  • Back surface (through) scatter color по умолчанию;
  • Back surface (through) scatter weight = 1.74;
  • Back surface (through) scatter radius = 40 мм;
  • Back surface (through) scatter depth = 30 мм



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



Очень сухая кожа :).

Включаем первый слой отражений и настраиваем широкие подсветки:

  • Overall specular Weight, использована растровая карта, блокирующая отражения на бровях;
  • Edge narowness и Specular Color #1 по умолчанию;
  • Specular Weight #1 = 0.35;
  • Specular Edge Weight #1 = 0.8;
  • Shininess #1 = 2;



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



Для второго слоя отражений я изменил только Specular Weight #2 = 0.2 и Shininess #2 = 50.
Можно использовать карты зеркальных отражений, поместив их в Overall Specular Weight. Хорошая мысль использовать зеркальную карту для bump и немного размытых отражений Reflection Weight = 0.1, Reflection Glossiness = 10 (последнее может серьезно замедлить расчет и потребовать больших значений AA).



Добавим немного ambient occlusion и отражения от окружения (синий Gradient Ramp в Local Environment), увеличим размер карты до 100%, samples = 256 и Lightmap gamma curve = 1.



Вместо ambient occlusion можно использовать final gathering, а вместо градиентной заливки для окружения — карту HDRI.



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



"The Final Battle". Автор: Max Kor

Статья автора работы:
"The Making of The Final Battle"

Создание собственных материалов SSS Fast

Материалы miss_fast_simple_phen (SSS Fast Material), и miss_fast_skin_phen (SSS Fast Skin Material) обладают богатыми возможностями. Но что, если возникнет необходимость в создании материала с четырьмя и более рассеивающими слоями? Или материала с какими-либо иными свойствами?

Один из способов решения проблемы — "сборка" шейдеров в редакторе материалов 3ds max на основе стандартного материала. Сделать это можно следующим образом.

1. Выбираем в редакторе материалов свободный стандартный материал и разворачиваем у него mental ray Connection.

2. Отключаем "замок" у слота "Surface" и назначаем ему SSS Fast Render Shader (mi). Мы создали два рассеивающих слоя у материала. Если требуется бОльшее количество слоев, то нужно воспользоваться слотом "Diffuse Illum" и снова назначить ему SSS Fast Render Shader (mi). В результате материал будет иметь 4 рассеивающих слоя. Если необходимо нечетное количество слоев, то вклады от любого слоя или слоев можно отключать, обнуляя их вес.
Каскадируя SSS Fast Render Shader (mi) через слот Diffuse Illum можно построить материал с любым количеством слоев.

3. Возвращаемся к mental ray Connection и, нажав слот Light Map (группа Advanced Shaders), выбираем из появившегося списка Material/Map Browser шейдер SSS Lightmap Write (mi). Этот шаг необходим для того, чтобы генерировались карты lightmap и depthmap.

Примечание. Для того чтобы иметь возможность собирать собственный материал SSS Fast, должен быть выполнен ряд обязательных условий:

  • в качестве активного рендера должен быть установлен mental ray;
  • в Preference на закладке mental ray должно быть разрешено использование расширений: Preference > mental ray > General > Enable mental ray Extensions = on (установлена галочка в чекбоксе);
  • нужно открыть шейдера SSS Fast, отредактировав subsurface.mi

Пример. Соберем и настроим материал, аналогичный SSS Fast Skin Material.

1. mental ray Connection > Surface назначаем SSS Fast Render Shader (mi). Настраиваем значения параметров этого шейдера следующим образом:

  • Overall diffuse color = белый цвет;
  • Unscattered diffuse weight = 1, это необходимо, поскольку через слот Diffuse Illum будет подключен еще один SSS Fast Render Shader;
  • Front surface scatter color = (RGB 242, 128, 51), что соответствует цвету второго рассеивающего слоя материала Fast Skin;
  • Front surface scatter weight = 0,4;
  • Front surface scatter radius = 25 мм;
  • Back surface scatter color = (RGB 178, 26, 26);
  • Back surface scatter weight = 0,5;
  • Back surface scatter radius = 25 мм;
  • Back surface scatter depth = 25 мм

Рассеивающие слои первого шейдера воспроизводят свойства среднего и заднего рассеивающего слоев SSS Fast Skin.

Теперь идем к слоту Specular Illum и назначаем ему SSS Specular Reflection for Skin (mi). Для его параметров устанавливаем те же значения, что и у параметров зеркальных отражений SSS Fast Skin (группа 2-Layer Specularity and Reflections).

Далее, слоту Diffuse Illum назначаем еще один (второй) шейдер SSS Fast Render Shader (mi) и настраиваем его параметры таким образом, чтобы воспроизвести свойства диффузного не рассеянного освещения и рассеяния от первого слоя Fast Skin:

  • Diffuse Illum назначаем шейдер SSS Lambert Gamma (mi);
  • Overall diffuse color = белый цвет;
  • Unscattered diffuse weight = 0,3;
  • Front surface scatter color = (RGB 255, 217, 153), что соответствует цвету первого рассеивающего слоя материала Fast Skin;
  • Front surface scatter weight = 0,5;
  • Front surface scatter radius = 8 мм;
  • Back surface scatter weight и radius = 0, вклад от этого слоя нам не нужен;

Остальные значения оставляем по умолчанию.

Возвращаемся к mental ray Connection и слоту Light Map назначаем SSS Lightmap Write (mi) со следующими значениями параметров:

  • Light map group = любое имя, оно будет использоваться для передачи карт освещения между шейдерами, например, "A";
  • Write to file = 0, если используется автоматическое создание и передача карт освещения и запись карт в файл не производится, 1 и 2 — если нужна запись карт в файлы, тогда во всех слотах шейдеров Lightmap нужно явно указывать имя и путь файла.

Преимущество использования этого параметра в том, что можно просчитать и сохранить карту освещенности в файл один раз и затем открывать этот файл только для чтения (опция Open as read-only есть у слота lightmap шейдера SSS Fast Render), то есть карта освещенности будет считываться из файла, а не пересчитываться. Для этого перед первым расчетом устанавливаем Write to file = 1, после расчета и записи карт освещения в файл — Write to file = 0. Можно даже попробовать удалить SSS Lightmap Write после создания файлов с картами освещения — это гарантированно избавит нас от пересчета.

  • Scatter Bias = 0,12;
  • Sampler уже имеет назначенный SSS Lambert Gamma (mi), его параметры оставляем по умолчанию

Карту bump следует подключать через первый шейдер, во втором шейдере ее можно просто отключить (установить None).

Материал готов к работе. Его схема выглядит следующим образом:



Схема собранного из шейдеров SSS Fast материала, реализующего функциональность SSS Fast skin

Помимо возможности создания произвольного числа рассеивающих и зеркальных слоев, преимущества построения собственного материала состоят в том, что все настроечные параметры шейдеров доступны для редактирования. Более того , мы можем заменять шейдеры misss_fast_shader (SSS Fast Render Shader), misss_skin_specular (SSS Specular Reflection for Skin), misss_lambert_gamma (SSS Lambert Gamma) и bump shader своими собственными . Например, замена misss_lambert_gamma на шейдер Illum Phong в шейдере SSS Lightmap Write позволит экспериментировать с рассеянием зеркальных отражений. Замена шейдера этого же типа в Diffuse Illum misss_fast_shader позволяет реализовать иную схему расчета диффузного не рассеянного освещения, например, при помощи "оборачивающего" шейдера JS_wrapmaterial или Illum Phong и так далее.

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

В качестве альтернативы можно декларировать собственный материал, создав интерфейс для настроечных параметров, аналогично тому, как это сделано для miss_fast_simple_phen и miss_fast_skin_phen. Это позволит сгруппировать в одном месте настроечные параметры, сделав удобным их редактирование. В качестве примера файл subsurface_mod.mi содержит SSS Fast Cascade Material, который аналогичен SSS Fast Skin, но позволяет каскадировать произвольное число misss_fast_shader, то есть определять произвольное число рассеивающих и зеркальных слоев.

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

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

Сочетание материалов и шейдеров группы miss_physical и группы SSS Fast позволяет решать самый широкий спектр задач, связанных с расчетом подповерхностного рассеяния.

Ссылки на дополнительную литературу по теме:

1. "The Making of The Final Battle"

2. Stiven Stahlberg "Human skin shading"

3. Форум "Skin shading"

4. Форум "misss tests", посвященный вопросам использования SSS Fast Skin в Maya.
Особенно интересна 22 страница форума, где обсуждается применение карт для различных свойств кожи компьютерного персонажа Hulk.

Файлы:

1. subsurface_mod.mi — отредактированный оригинальный subsurface.mi, в нем открыты все шейдеры и все их свойства, содержит исправленный материал miss_fast_simple_phen (SSS Fast Material) и нестандартный материал SSS Fast Cascade Material для каскадирования произвольного числа слоев. Для использования это файл нужно поместить в папку 3dsmax7mentalrayshaders_standardinclude и переименовать его в subsurface.mi, перед этим не забудьте сделать резервную копию оригинального subsurface.mi.

2. файл сцены test.max с тестовым объектом и примерами материалов SSS Fast Cascade Material, настроенных как miss_fast_simple_phen (SSS Fast Material) и miss_fast_skin_phen (SSS Fast Skin Material).

Пока все. До встречи.

18 мая 2005 Г.

Mental ray 3.3 3ds max. 4. SSS Fast

Mental ray 3.3 3ds max. 4.
SSS Fast

, mental ray / SSS Physical (miss_physical), .
SSS Physical , , . . , , , SSS Physical , , "" .

mental ray .

:

  • misss_fast_shader (SSS Fast Render Shader), ( , );
  • misss_skin_specular (SSS Specular Reflection for Skin), ;
  • misss_lambert_gamma (SSS Lambert Gamma), ;
  • misss_lightmap_write (SSS Lightmap Write), ;
  • misss_call_shader (SSS Passthrough Shader), .

:

  • miss_fast_simple_phen (SSS Fast Material);
  • miss_fast_skin_phen (SSS Fast Skin Material);
  • miss_fast_skin_phen_d (SSS Fast Skin Material+Displace).

, 3ds max.

, subsurface.mi — declare shader "gui" "hidden".

lightmap depthmap. Lightmap , depthmap (z-). . , lightmap RGB , depthmap -. , . RGBA 32- .

, , . , — . , , .

3ds max tif, inf_disp , 32- .

Lightmap . , lightmap - , . , — "" , "" — , — , .

. — . .




, . , , . , SSS-, , , . , .

misss_lightmap_write. , .

, , , , , . , .



. , "" , .

Lightmap . , misss_lambert_gamma. , , . , lightmap , . .

, lightmap depthmap , "" , .

SSS Fast " " — , miss_physical "" .

SSS Fast , GI, .

.

miss_fast_simple_phen

miss_fast_simple_phen (SSS Fast Material), .

, , misss_fast_shader, misss_skin_specular, misss_lambert_gamma bump. lightmap depthmap, . , , .



— (Blinn),
— SSS Fast Material

. "" "Screen". : , , , . ( overall color) . "" .

:

material "misss_fast_simple_phen" (
color texture "lightmap", 3ds max
color texture "depthmap", string "lightmap_group",
scalar "lightmap_size",
integer "samples",
shader "bump",
struct "d" {
color "ambient",
color "overall_color",
color "diffuse_color",
scalar "diffuse_weight",
color "front_sss_color",
scalar "front_sss_weight",
scalar "front_sss_radius",
color "back_sss_color",
scalar "back_sss_weight",
scalar "back_sss_radius",
scalar "back_sss_depth"
},
struct "s" {
color "specular",
scalar "exponent"
},
struct "a" {
scalar "lightmap_gamma",
boolean "indirect",
scalar "scale_conversion",
scalar "scatter_bias",
scalar "falloff",
boolean "screen_composit"
},
integer "mode", # light selection mode 0..2,
array light "lights",
)



SSS Fast Material 3ds max



SSS Fast Material

SSS Fast Material (mi) Parameters:

lightmap depthmap — , . lightmap depthmap. , .
, "lightmap", "depthmap" . lightmap , . , 500500, lightmap 1000, — 500. 32 .
( "lightmap" ), .





lightmap . ""
.



. — 8- 32- . "" HDRShop

, . , . , , .
(, notepad) , .

lightmap_group (Scatter group) — . lightmap/depthmap , lightmap_group. .
, lightmap_group, , lightmap_group . , , . , lightmap_group.

( ), , lightmap_group. , "" "" .



— . , lightmap_group —



, lightmap_group. ( ) —

lightmap_size — lightmap, . , 50% , , lightmap .

samples (Number of samples) — () lightmap, . Samples — . , , — 32 .



— samples = 16,
— samples = 256

: samples, lightmap.

bump (Bump shader) — , (bump — ) . mental ray Bump (3ds max), .



bump

Mode () — : 0 — , 1 — Lights , 2 — , Lights.

Lights () — / .

Mode Lights 3ds max / .
, Fast SSS 3ds max .

, Diffuse Sub Surface Scattering:

ambient (Ambient/Extra light) — . Ambient - lightmap , . , HDRI ambient occlusion.



ambient occlusion
( )

ambient occlusion . , .

overall_color (Overall diffuse coloration) — : unscattered disffuse color + Front surface color + Buck Surface scatter color, . overall diffuse coloration ( ) . , , , . , diffuse_color.

diffuse_color (Unscattered diffuse color) — , , . . Adobe Photoshop — overall_color, — unscattered diffuse color, . SSS Fast material misss_lambert_gamma (SSS Lambert Gamma).

diffuse_weight (Unscattered diffuse weight)— , . , . Photoshop weight . .

front_sss_color (Front surface scatter color) front_sss_weight (Front surface scatter weight) — front () .

front_sss_radius (Front surface scatter radius)— . , Scale conversion factor. . , .

back_sss_color (Back surface scatter color) back_sss_weight (Buck surface scatter weight) — .

back_sss_radius (Buck surface scatter radius) — .

back_sss_depth (Back surface scatter depth) — , . , "" . . , . Back surface scatter depth , .

front_sss back_sss lightmap. SSS Fast Material misss_lambert_gamma ( ).

Specular reflections:

SSS Fast Material misss_skin_specular (SSS Specular Reflection for Skin). , primary_spec_color primary_shinyness, ( ).

specular (Specular color) — .

exponent (Shininess) — , — , phong Blinn. , , — .



bump,
overall diffuse coloration specular

SSS Fast Material . , specular , . , misss_skin_specular, . SSS Fast , . . , , . subsurface.mi "secondary_weight = 0" "specular", . .
Maya (misss_fast_simple_maya) "" .

Advanced options:

lightmap_gamma (Lightmap gamma curve)— gamma- , lightmap. gamma = 1.0, lightmap , . gamma 1.0, "", lightmap. gamma 1.0, , , lightmap. gamma 0.4 0.8.

, SSS Fast Material - misss_lambert_gamma, lightmap. lightmap_gamma misss_lambert_gamma. , lightmap_gamma , , 1. lightmap.



: lightmap_gamma = 0.1, 1, 5

SSS Fast Material , lightmap_gamma — . , subsurface.mi . , subsurface.mi, declare phenomenon material "misss_fast_simple_phen", — shader "lm_sample" misss_lambert_gamma" "diffuse_curve" = interface "a.diffuse_curve" "diffuse_curve" = interface "a.lightmap_gamma".

subsurface.mi.

indirect (Scatter indirect illumination) — final gathering lightmap. , . , .

GI, indirect , , .



final gathering,
— indirect off, — indirect on

scale_conversion (Scale conversion factor)— . , , . , , 10 (1 = 1/10 ).
, .
scale_conversion 1, . Fast SSS ( , ).

scatter_bias (Scatter Bias) — , ( g, ) -1 1. scatter_bias = 0, ( ), scatter_bias = 1 , scatter_bias = -1 — "".

falloff (Falloff strength) — . , — , . , falloff . falloff 1.0 10.0 . 0.1 1.0 .
falloff , .

screen_composite (Screen "soft" compositing of layers) — . , Screen compositing, "screen" Photoshop. (add), . Add - , HDRI (tonemapping).

miss_fast

"" SSS — misss_fast_shader (SSS Fast Render Shader), misss_skin_specular (SSS Specular Reflection for Skin) misss_lambert_gamma (SSS Lambert Gamma). , .

Misss_fast_shader (SSS Fast Render Shader)

Misss_fast_shader , "" ( :) SSS - .

misss_fast_shader:

color "misss_fast_shader" (
color texture "lightmap",
color texture "depthmap",
shader "bump",
shader "diffuse_illum",
color "diffuse_color",
shader "specular_illum",
scalar "diffuse_weight",
color "front_sss_color",
scalar "front_sss_weight",
scalar "front_sss_radius",
color "back_sss_color",
scalar "back_sss_weight",
scalar "back_sss_radius",
scalar "back_sss_depth",
scalar "scale_conversion",
boolean "screen_composit",
boolean "output_sss_only",
scalar "falloff",
integer "samples",
)
apply material
version 4

, SSS Fast Material.

"" .

misss_fast_shader, shader . misss_fast_shader , .

Shader "bump"— . . , misss_fast_shader bump, . , bump bump lightmap . 3ds max bump , .

Shader "diffuse_illum"— . , misss_lambert_gamma (SSS Lambert Gamma), , , , . , Lambert, , , Phong, Ward, Cook-Torrance, Blinn (, , , base.mi).
() misss_fast_shader, .

Shader "specular_illum" — , . , misss_skin_specular (SSS Specular Reflection for Skin), ( ). . , .

, SSS - :



, , 4 SSS , 2 , , lightmap miss_lambert_gamma. , .
, lightmap, , diffuse_illum , .

3ds max mental ray Connection . misss_fast_shader .

, misss_fast_shader , , , . , , , . , . , , , misss_fast_shader .

.
miss_fast_shader diffuse_illum. , , , Mix, Blend Composite. , . diffuse_illum .

— , / lightmap/depthmap, .

misss_lambert_gamma (SSS Lambert Gamma)

misss_lambert_gamma (SSS Lambert Gamma): color "misss_lambert_gamma" (
color "ambient",
color "ambience",
color "diffuse",
boolean "indirect",
scalar "diffuse_curve",
integer "flip",
integer "mode",
array light "lights"
)
version 4
apply texture

mib _ illum _ lambert : diffuse , , ambient ambience . . , 90 , , . misss_lambert_gamma "" , , 90 . mental ray (Maya Max) , : http://www.sandstrom.on.to, Downloads: JS_wrapmaterial.

flip : 0, lightmap , "" ; 1 — ; 2 — lightmap . flip , .

SSS Fast Material.

Misss_skin_specular (SSS Specular Reflection for Skin) miss_fast_skin_phen (SSS Fast Skin Material)

misss_skin_specular (SSS Specular Reflection for Skin) miss_fast_skin_phen (SSS Fast Skin Material):

material "misss_fast_skin_phen" (
color texture "lightmap",
color texture "depthmap",
string "lightmap_group",
scalar "lightmap_size",
integer "samples",
shader "bump",
struct "d" {
color "ambient",
color "overall_color",
color "diffuse_color",
scalar "diffuse_weight",
color "front_sss_color",
scalar "front_sss_weight",
scalar "front_sss_radius",
color "mid_sss_color",
scalar "mid_sss_weight",
scalar "mid_sss_radius",
color "back_sss_color",
scalar "back_sss_weight",
scalar "back_sss_radius",
scalar "back_sss_depth"
},
struct "s" {
scalar "overall_weight",
scalar "edge_factor",
color "primary_spec_color",
scalar "primary_weight",
scalar "primary_edge_weight",
scalar "primary_shinyness",

color "secondary_spec_color",
scalar "secondary_weight",
scalar "secondary_edge_weight",
scalar "secondary_shinyness",

scalar "reflect_weight",
scalar "reflect_edge_weight",
scalar "reflect_shinyness",
boolean "reflect_environment_only",
shader "environment"
},
struct "a" {
scalar "lightmap_gamma",
boolean "indirect",
scalar "scale_conversion",
scalar "scatter_bias",
scalar "falloff",
boolean "screen_composit"
},
integer "mode", # light selection mode 0..2
array light "lights"
)

. , . , , (dermal), , (epidermal), , (, , ) . , , "" . : , . , , , , ( ).

miss_fast_skin_phen (SSS Fast Skin Material) . , , , ..

miss_fast_skin_phen , lightmap, depthmap, lightmap_group, lightmap_size, samples, bump, ambient, lightmap_gamma, indirect, scale_conversion, scatter_bias, falloff screen_composit miss_fast_simple_phen.

.

, , struct "s". , misss_skin_specular.

verall_weight — . , specular - . , .

Edge_factor — () , ( ) , . edge_factor, . edge_factor "" .

Primary_spec_color primary_weight — .

Primary_edge_weight — ( ) . edge_factor primary_edge_weight.

Primary_shinyness — . , . , primary_shinyness = 5.

Secondary_spec_color, secondary_weight, secondary_edge_weight, secondary_shinyness — , . . secondary_shinyness 33.

Reflect_weight reflect_edge_weight — , , , glossy . , . "" , . , , . , environment Gradient Ramp HDRI Reflect_environment_only = on. Reflect_weight reflect_edge_weight — - , , .

Reflect_shinyness — , 0 ( . , ).

Reflect_environment_only — , environment, — .

shader "environment" — .

, :

— front sss layer (Epidermal skin layer). front_sss_color, front_sss_weight front_sss_radius , . ("") : 0.5 5 10 .

— mid sss layer "" (subdermal skin layer). , mid_sss_color, mid_sss_weight mid_sss_radius , , — / , = 0.5 10 25mm.

— . , , .

3ds max — miss_fast_skin_phen_d (SSS Fast Skin Material+Displace). miss_fast_skin_phen, displacement.

.
, (bump), — , . — , 30 . .



(phong)
,

.



. , .
. "" . , bump . Unscattered diffuse color, Epidermal (top) layer scatter color bump. 0. , , bump.



bump , . , , , - . ("") .
bump, () . , .
bump, , :

  • multiplier bump — 0.7;
  • unscattered diffuse weight — 0.5;
  • epidermal (top) layer scatter weight — 0.7;
  • epidermal (top) layer scatter radius — 8 ;



. , grayscale- , levels (Photoshop), . Overall diffuse coloration.



— , .

. , Overall diffuse coloration ( ) . — , , .

. , :

  • Subdermal layer scatter color R = 242, G = 74, B = 51 ( , , );
  • Subdermal layer scatter radius = 45 ;
  • Subdermal layer scatter weight = 0.5



. "" . .
, "" ( ). , , .
. "" . , :

  • Back surface (through) scatter color ;
  • Back surface (through) scatter weight = 1.74;
  • Back surface (through) scatter radius = 40 ;
  • Back surface (through) scatter depth = 30



. , .



:).

:

  • Overall specular Weight, , ;
  • Edge narowness Specular Color #1 ;
  • Specular Weight #1 = 0.35;
  • Specular Edge Weight #1 = 0.8;
  • Shininess #1 = 2;



, (, ..)



Specular Weight #2 = 0.2 Shininess #2 = 50.
, Overall Specular Weight. bump Reflection Weight = 0.1, Reflection Glossiness = 10 ( AA).



ambient occlusion ( Gradient Ramp Local Environment), 100%, samples = 256 Lightmap gamma curve = 1.



ambient occlusion final gathering, — HDRI.



.
:



"The Final Battle". : Max Kor

:
"The Making of The Final Battle"

SSS Fast

miss_fast_simple_phen (SSS Fast Material), miss_fast_skin_phen (SSS Fast Skin Material) . , ? - ?

— "" 3ds max . .

1. mental ray Connection.

2. "" "Surface" SSS Fast Render Shader (mi). . , "Diffuse Illum" SSS Fast Render Shader (mi). 4 . , , .
SSS Fast Render Shader (mi) Diffuse Illum .

3. mental ray Connection , Light Map ( Advanced Shaders), Material/Map Browser SSS Lightmap Write (mi). , lightmap depthmap.

. SSS Fast, :

  • mental ray;
  • Preference mental ray : Preference > mental ray > General > Enable mental ray Extensions = on ( );
  • SSS Fast, subsurface.mi

. , SSS Fast Skin Material.

1. mental ray Connection > Surface SSS Fast Render Shader (mi). :

  • Overall diffuse color = ;
  • Unscattered diffuse weight = 1, , Diffuse Illum SSS Fast Render Shader;
  • Front surface scatter color = (RGB 242, 128, 51), Fast Skin;
  • Front surface scatter weight = 0,4;
  • Front surface scatter radius = 25 ;
  • Back surface scatter color = (RGB 178, 26, 26);
  • Back surface scatter weight = 0,5;
  • Back surface scatter radius = 25 ;
  • Back surface scatter depth = 25

SSS Fast Skin.

Specular Illum SSS Specular Reflection for Skin (mi). , SSS Fast Skin ( 2-Layer Specularity and Reflections).

, Diffuse Illum () SSS Fast Render Shader (mi) , Fast Skin:

  • Diffuse Illum SSS Lambert Gamma (mi);
  • Overall diffuse color = ;
  • Unscattered diffuse weight = 0,3;
  • Front surface scatter color = (RGB 255, 217, 153), Fast Skin;
  • Front surface scatter weight = 0,5;
  • Front surface scatter radius = 8 ;
  • Back surface scatter weight radius = 0, ;

.

mental ray Connection Light Map SSS Lightmap Write (mi) :

  • Light map group = , , , "A";
  • Write to file = 0, , 1 2 — , Lightmap .

, ( Open as read-only lightmap SSS Fast Render), , . Write to file = 1, Write to file = 0. SSS Lightmap Write .

  • Scatter Bias = 0,12;
  • Sampler SSS Lambert Gamma (mi),

bump , ( None).

. :



SSS Fast , SSS Fast skin

, , . , misss_fast_shader (SSS Fast Render Shader), misss_skin_specular (SSS Specular Reflection for Skin), misss_lambert_gamma (SSS Lambert Gamma) bump shader . , misss_lambert_gamma Illum Phong SSS Lightmap Write . Diffuse Illum misss_fast_shader , , "" JS_wrapmaterial Illum Phong .

, , .

, , , miss_fast_simple_phen miss_fast_skin_phen. , . subsurface_mod.mi SSS Fast Cascade Material, SSS Fast Skin, misss_fast_shader, .

, . , ( ) ( bump).

, , . , , .

miss_physical SSS Fast , .

:

1. "The Making of The Final Battle"

2. Stiven Stahlberg "Human skin shading"

3. "Skin shading"

4. "misss tests", SSS Fast Skin Maya.
22 , Hulk.

:

1. subsurface_mod.mi — subsurface.mi, , miss_fast_simple_phen (SSS Fast Material) SSS Fast Cascade Material . 3dsmax7\mentalray\shaders_standard\include\ subsurface.mi, subsurface.mi.

2. test.max SSS Fast Cascade Material, miss_fast_simple_phen (SSS Fast Material) miss_fast_skin_phen (SSS Fast Skin Material).

. .