- •Часть 1. Метод фотонных карт. Final Gathering
- •1. Испускание фотонов
- •2. Трассировка фотонов
- •3. Создание фотонной карты
- •4. Использование фотонной карты при рендеринге
- •Параметры настройки фотонных карт в mental ray для 3ds max, закладка Indirect Illumination
- •Оценка освещения точки поверхности по заданному количеству фотонов
- •Окно настроек фотонных карт
- •Настройка глубины трассировки для фотонов
- •1. Построение Grid сетки в растровом пространстве изображения
- •2. Предварительная стадия расчета fg
- •3. Рендеринг
- •Диагностический рендер fg-расчета. Радиус 10см, fg Samples 1000
- •Интерфейс настройки параметров fg-расчета
- •Часть 2.
- •Интерфейс шейдера Ambient/Reflective Occlusion в 3ds max
- •Сцена освещена двумя стандартными точечными источниками света (omni light)
- •Шейдер ао назначен диффузным свойствам материалов
- •Все тени в сцене рассчитаны ambient occlusion
- •Настройка ambient свойств материала для использования ао
- •Источник света проявляет диффузные характеристики поверхности
- •Ambient occlusion в режиме 1, учитывается цвет окружения
- •Шейдер ambient occlusion назначен точечному источнику света. Другого освещения в сцене нет
- •Простой reflective occlusion с картой отражения на параметре Bright – шейдер "видит" затеняющую геометрию, но не может построить правильные отражения – вместо них мы видим черные пятна
- •Пример диаграммы более сложного материала, позволяющего получить отражения с помощью reflective occlusion
- •Материал с Reflective occlusion, позволяющий получить отражения
- •Еще один пример материала для reflective occlusion
- •Источник света – Skylight, расчет освещения выполнен при помощи Final Gather, время вычислений – 2 часа 15 минут
- •Часть 3. Физическая модель подповерхностного рассеяния в mental ray – sss Physical Material
- •Шейдер miss_physical
- •Скриншот тестовой сцены
- •Слева-направо: камера под углом 90, 45 и 35 градусов к нижней грани
- •Слева - направо: depth 1, 10, 20, 100
- •Слева - направо: depth 1, 10, 20, 100
- •Слева - направо: depth 1, 10, 20, 100
- •Сцена 1. Молоко в стеклянном стакане
- •Сцена 2. Горящая цилиндрическая свеча
- •Сцена 3. Кубическая свеча
- •Часть 4. Упрощенная модель подповерхностного рассеяния sss Fast
- •Рассеянный задней поверхностью свет освещает переднюю поверхность
- •Материал miss_fast_simple_phen
- •Вверху — объект со стандартным материалом (Blinn), внизу — с материалом sss Fast Material
- •Вид интерфейса sss Fast Material по умолчанию в 3ds max Вид интерфейса sss Fast Material со всеми открытыми слотами свойств
- •Для шейдера bump использована растровая карта
- •Рассеяние без и с использованием ambient occlusion (нижнее изображение)
- •Применены растровые карты для bump, overall diffuse coloration и specular
- •Расчет освещения с final gathering, вверху — indirect off, внизу — indirect on
- •Шейдеры группы miss_fast
- •Диаграмма построения материала
- •Стандартный материал (phong) с картами для цвета, отражений и рельефа
- •Материал кожи со значениями по умолчанию
- •"The Final Battle". Автор: Max Kor
- •Создание собственных материалов sss Fast
- •Часть 5. Запекание текстур (render to texture)
- •Интерфейсы шейдеров mib_lightmap_write и mib_lightmap_sample
- •Пример достаточно удачных текстурных координат Неудачные текстурные координаты - множество швов и несвязанных координатных областей. Редактировать их будет довольно сложно
- •Blend - материал, запеченный scanline Запеченная текстура
- •Запеченная текстура
- •Копируем перетягиванием запекаемый материал в сэмплер поверхности
- •Рендер с текстурой, запеченной из blend-материала при помощи mental ray Запеченная текстура теперь выглядит правильно
- •Текстура с освещением
- •Интерфейс rtt
- •Секция параметров General Settings
- •Секция параметров Objects to Bake
- •Секция параметров Output
- •Секция Baked Material
- •Секция Automatic Unwrap Mapping
- •Сцена с caustic-эффектом, рассчитанным по фотонной карте
- •Настройки для запекания caustic фотонной карты
- •Запеченная фотонная карта
- •Рендер с запеченной в текстуру фотонной картой
- •Редактирование вершин Cage
- •Карта нормалей
- •Модель с Normal bump map
- •Высокополигонный источник и низкополигонный объект - цель
- •Часть 6.
- •Сетка модели Рендер сцены с источниками света
- •Две поверхности, на которых будет выращен мех
- •Модификатор Hair and Fur, секция Selection
- •Отображение в видовом окне сгенерированных модификатором волосков
- •Окно редактора Style Hair
- •Окно предварительного просмотра Style Hair
- •Секция параметров Frizz
- •Влияние параметров Frizz
- •Рендер в режиме mp Prim c Shadow map
- •Рендер в режиме mp Prim с ray trace тенями
- •"Лабораторная крыса"
Диаграмма построения материала
Материал, представленный на диаграмме, имеет 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 сантиметров. Вот так выглядит сцена со стандартными материалами.