Шейдеры объемов позволяют включить в процесс визуализации внутренний объем объекта, путем описания характеристик прохождения света под поверхностью, и реализуются двумя способами –
- на основе прямого освещения, работает шейдер parti_volume
- на основе визуализации фотонов GI и Каустики, работают шейдеры parti_volume и parti_volume_photon.
оба шейдера имеют одинаковые настройки, но эффект от их применения различается. parti_volume позволяет показать проникновение в объем объекта прямого света от источника и не является физически точным (упавший на стеклянный объект луч, можно будет наблюдать, как продолжения луча от источника света, без учета коф. преломления материала), а эффект от parti_volume_photon будет физически точным, но требует дополнительных ресурсов от машины, так как идет обсчет каждого фотона.

рис № 11
на рисунке луч в объеме стеклянного объекта под цифрой «1» сгенерирован, как продолжение луча источника света. Луч «2» показывает физически точное распределение фотонов каустики в материале стекла, учитывая коф. преломления и, более того, назначенный шейдер фотонов prism_photon (дополнительный шейдер и в стандартный комплект Макса не входит – подробнее в уроке «Создание драгоценных камней») разложил свет на спектр, согласно значению дисперсии.
Алгоритм работы тут следующий: На материал объекта с шейдером поверхности glass(lume) назначен шейдер фотонов (prism_photon) , шейдер Volume (parti_volume) и шейдер Volume Photon (parti_volume_photon). Для объектов с назначенным шейдером parti_volume, начинает работать механизм ray marching, который и визуализирует прохождение света в объеме по двум направлениям – упрощенное для прямого света (луч «1») и используя визуализацию сгенерированных фотонов объема шейдером parti_volume_photon (луч «2»). Если отключить шейдер объемных фотонов, то второго луча не будет, если отключить шейдер объема, но не отключать шейдер объемных фотонов, то мы ничего не увидим, так как фотоны будут сгенерированы, но не визуализированы (ray marching, запускаемый parti_volume – не включен).
Настройки шейдеров parti_volume и parti_volume_photon.
рис № 12
Mode – (0 или 1) = рассчитывать эффект объема на весь объект =0 или на определенную в Height высоту = 1. Нужно заметить что расчет высоты идет от горизонта сцены, а не относительно габаритов объекта в документации на шейдер об этом как-то забыли упомянуть и во время тестирования шейдера мне это сильно попортило кровь.
Вот пример применения высоты заполнения в режиме «1»

белая сетка символизирует плоскость с Z=0 заполнение объекта началось над сеткой где z=1 метру , соответственно Height тоже равно 1 метру. Значение высоты может быть и отрицательным.
Scatter color – цвет фильтра для эффекта заполнения объема.
Extinction – коф. затухания эффекта в объеме.
r, g1,g2 — коф. описывающие рассеивание света внутри объекта: g1 и g2 – это два коф, которые описываю прохождение света относительно плоскости падения света :
рис № 13
точка «L» это точка падения света
для каждого g справедливы значения:
— обратное рассеяние: -1 < g < 0
— изотропное g = 0
— прямое рассеяние: 0 < g < 1
а r это составляющая по распределению затухания между g1 и g2, для g1 равно r, для g2 = (1-r).
Схематичный пример : g1=1, g2=0,3 r=0,5

рис № 14
при отрицательных значениях g форма пятна по идее должна принимать гантелеобразную форму, но на практике не получилось увидеть.
Non Uniform – при значении = 0 – сплошное заполнение, при 1 – наличествует шум (неоднородности)
!!! Примечание : осторожнее с применением карт и значений выходящим за рамки от 0 до1 – видно разработчики не позаботились о проверках на некорректные значения. Отрицательные значения гарантированно сносят Макс, карты не органичные в разбросе значений в пределах от 0 до 1 тоже могут привести к аварийному завершению программы.
Используя высоту и шум можно имитировать облачность и задымления в объемах произвольной формы(аналогично атмосферным контейнерам, но без ограничений к форме и возможностью использовать шейдер поверхности)
Например простейший вариант:

скачать сцену для Макс 2008
Min/Max Step Length — определяют качество расчета алгоритма заполнения чем меньше значения, тем детальнее визуализация.
Light Distance – значение которое используется алгоритмом для принятия решения использования минимального или максимального шага для просчета эффекта
No GI where direct – устанавливается для ускорения процесса визуализации, путем не учитывания GI фотонов.
Lights — позволяет указать источники от которых будет учитываться расчет эффекта, если галка не стоит то расчет для всех источников на сцене.
С помощью использования шейдера parti_volume можно имитировать полупрозрачные объекты имеющие слоистую структуру – например разные пластики, стекла и конечно драгоценные камни типа агатов, опалов, флюоритов итд.
А вот использование шейдера parti_volume_photon может вывести визуализацию на новый уровень, поскольку в объеме объекта для которого работает алгоритм ray marching, визуализируются все фотоны непрямой иллюминации (и GI и каустика) даже те которые сгенерированы другим объектом. Например заключив сцену с интерьерным решением в объем с назначенным шейдером parti_volume мы увидим абсолютно все фотоны непрямой иллюминации – ярко освещенные объекты приобретут ореолы (фотоны GI), сфокусированные в яркие пучки лучи (каустика) будут светиться. – то есть будет явный учет того что сцена находиться не в вакууме а в воздушной среде.
Но к сожалению во всем этом кроется большой минус – фотоны нужно уменьшать до микроскопических размеров (дабы сцена не была заполнена шариками из блудных фотонов) а их количество, генерируемое источником света увеличивать до запредельных величин.
Да, кстати – размер визуализированных фотонов указывается в настройках непрямой иллюминации в разделе Volumes:

размер и яркость одного фотона объема складывается из значения Максимального количества фотонов (GI и/или Каустики), которые его будут формировать и его визуального размера, что и позволяет настроить данный раздел.
Автор данной статьи попробовал сделать более менее законченную интерьерную сцену, где в объем комнаты источником света выпускалось 25 миллионов GI фотонов и 1 миллион каустик фотонов, что на самом деле было очень мало для данного решения – сцена обсчитаться не смогла с ошибкой нехватки ОЗУ. Насколько мне известно, при составлении карты фотонов тратиться порядка 25 байт на описание 1 фотона, плюс затраты памяти на систематизацию фотонов. Кароче такие расчеты не для 32 битных машин, тем более mental ни в какую не хочет юзать файл подкачки – только физическую ОЗУ.
Несмотря на большие затраты ресурсов, некоторую пользу от визуализации фотонов мы извлечем даже не на мощных машинах.
Создадим сцену для тестирования огранки драгоценных камней.
Смысл такого теста в том, что согласно коф преломления драгоценного камня, разрабатывается специальная огранка с задачей не давать свету проходить сквозь камень, а отражать как можно больше назад, что и дает красивую игру камня. Существует большое количество классических огранок камней, но вот если камню нужно придать какую-нибудь нестандартную форму, то рассчитать огранку под такую форму сложновато. Вот мы и создадим сцену, где наглядно будет вино поведение лучей света, которые отражает и преломляет форма огранки.
Данная сцена будет на самом деле очень простая и ее основа будет состоять из Бокса, который будет имитировать атмосферу, для визуализации фотонов каустики (а именно они нас и интересуют). Внутрь этой коробки мы и будем помещать тестовую модель камня.
Специфичность заключается в том, что нам нужно будет видеть входящий в камень поток фотонов (дабы наглядно видеть откуда идет поток света), поэтому нужно с одной стороны бокса поставить ширму из оптически непрозрачного материала, но который бы генерировал фотоны каустики, он то и даст нам поток фотонов, под который мы будем подставлять тестовый предмет. Ну и, естественно, источник света. Вот в общем и вся сцена.
Итак создадим материалы:
Атмосфера:
как видно шейдеры поверхности и затемнения представлены просто прозрачным материалом – аналог стандартного материала Макса с 100% прозрачностью. Назначен шейдер фотонов, в котором коф. преломления = 1 – дабы входящий поток света не преломлялся на входе, прозрачность = 100%, настройки шейдера объема можно оставить по умолчанию, нам он нужен только для запуска алгоритма ray marching.
Материал применяем на созданный примитив Box.
Далее материал ширмы:

тут нас поверхность совсем не интересует, но оставлять пустыми слоты нельзя, для этого есть специальный шейдер «transmat(physics)» который служит для создания объектов – пустышек, настроек шейдер не имеет. В слот фотонов назначается шейдер фотонов с максимальной прозрачностью и коф. преломления = 1. настройки шейдера объемных фотонов и шейдера объема можно оставить по умолчанию, либо параметр Scatter color установить белым. Данный материал назначаем на ширму – тонкую пластину, тоже бокс (плоскость нам не подойдет , так как не имеет объема). Эту пластину расположим внутри объекта атмосферы со стороны куда падает лучь света от источника.
Располагаем бокс атмосферы и ширму в нем на сцене, создаем источник направленного света, который освещает ширму. Главное не забыть все объекты включить в расчет каустики и включить этот режим в рендере.
Теперь создаем материал для тестового камня, можно взять любой из предустановленных – от трассироваемого (Raytrace) до архитектурно-дизайнерских с профилем стекла, а можно и на основе «mental ray», главное не забыть добавить шейдер объема и фотонов объема (о назначении слотов шейдеров и подключении к менталу стандартных материалов см. урок «погружение в ментал (шейдерный материал mental ray)»).
Теперь помещаем в бокс камень, применяем на него материал, рендерим:

чем меньше и чем менее интенсивны выходящие снизу (противоположной входящему лучу стороне) камня лучи, тем лучше огранка, под конкретный коф. преломления.
Скачать сцену под Max 2008
Можно сделать лучи более похожими на свет (яркими) поставив шейдер «Glare» на камеру:

слоты под шейдеры камеры находятся в меню настройки рендера (F10), закладке «Renderer»
к большому сожалению на тестовой сцене нельзя напрямую использовать мой любимый шейдер фотонов prism_photon , так как он генерирует только фотоны преломления, а фотонов отражения нет.:

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

которая находиться в настройках непрямой иллюминации и ни как нельзя ее путать с основной глубиной трассировки рендера.
Для тестовой программы глубина по умолчанию в 5 уровней явно маловата – нужно будет увеличить хотя бы до 10.
Во время подготовки сцены для иллюстрации к уроку:

с 5 уровнями трассировки вторая призма преломления и отражений не давала.
На этом вторую часть повещенную освещению закончу. Осталось рассмотреть GI и материалы послойного рассеивания.
С Уважением КАА.
kaa936@rambler.ru
