Mental ray 3.3 для 3ds max. Часть 2.

Свойства и использование Ambient/Reflective Ocllusion


В седьмой версии 3ds max, благодаря mental ray 3.3, появился новый шейдер Ambient/Reflective Occlusion. Это шейдер обладает рядом интереснейших возможностей, позволяющих использовать его для решения широкого спектра задач визуализации и рендеринга, включая имитацию GI. Рассмотрением его свойств и возможностей практического применения и посвящено данное небольшое исследование.

Начну немного издалека. Построение изображений (рендеринг) в трехмерной компьютерной графике опирается на расчет трех основных компонент цвета поверхности – окружающего освещения (ambient color), диффузного освещения от прямых источников света (diffuse color), а также – зеркальных и specular отражений/преломлений. Ambient освещение в стандартной модели затенения в 3ds max не предполагает наличия источников света и основывается на простом, #34;одноцветном", фоновом цвете, который просто добавляется к диффузному и specular освещению поверхности. Последнее вовсе не означает, что для ambient-компоненты материала нельзя задавать карту цвета, например – растровую или процедурную карту.

Расчет непрямого или глобального освещения (GI) является другим, физически корректным способом расчета ambient освещения – в данном случае "фон" рассчитывается как результат вторичных переотражений света от прямых источников между поверхностями трехмерной сцены. Назначение шейдера ambient occlusion лежит в этой же области – предложить еще одну возможность (или, если угодно – альтернативу) расчета ambient - освещения поверхностей трехмерных объектов.

Предлагаемая шейдером ambient/reflection occlusion схема расчета состоит в определении степени, или меры "затенения", или блокирования, точек поверхности окружающей геометрией в сцене.

Величина степени затенения рассчитывается по следующему правилу.

Для каждой точки поверхности, видимой в камеру, строится полусфера относительно ее нормали. Затем, через сферу, в сцену испускается в случайных направлениях некоторое количество лучей. Для испущенных лучей возможны только два варианта развития событий – либо они столкнутся с поверхностями других объектов и будут считаться "затененными" (occluded), либо они беспрепятственно выйдут за пределы сцены (или за пределы расстояния указываемого в настройках шейдера) и будут считаться "свободными", незаблокированными. В результате, степень затенения точки будет определяться как отношение числа заблокированных к общему числу испущенных лучей. Например, если всего испущено 10 лучей, только 5 из которых пересеклись в пределах сцены с другими объектами, то цвет точки будет иметь значение 50% серого, поскольку 50% лучей заблокировано другой геометрией. Как видим, все довольно просто.

Поскольку шейдер ambient/reflection occlusion (далее в тексте – АО) рассчитывает фоновое освещение, вполне логично сравнить возможности его алгоритма с расчетом полного глобального освещения методом final gathering + photon map. По сравнению с Final Gathering, АО не рассчитывает освещенность в точке пересечения с другой геометрией и не учитывает затухание света с расстоянием. А по сравнению с фотонными картами, АО не учитывает вторичных переотражений света между объектами. В силу указанных различий АО шейдер является корректной альтернативой расчета GI только в случае открытых сцен (экстерьеров) и дает неправильные результаты для закрытых сцен (интерьеров). Однако физическая корректность освещения в компьютерной графике не всегда является первостепенной задачей, чаще достаточно просто правдоподобности освещения. Такую правдоподобность АО вполне способен обеспечить. Допустимо также использовать АО совместно с фотонными картами, вместо FG. Хотя такой результат также будет далек от физической корректности, он может давать вполне убедительное и гладкое "псевдо-глобальное" освещение, причем время расчета будет гораздо меньше по сравнению с временем расчета методом FG + Photon Map.

Рассмотрим назначение параметров шейдера АО.

Прежде всего, я приведу спецификацию шейдера, как ее дает mental images:

color "mib_amb_occlusion" (
integer "samples" default 16,
color "bright" default 1 1 1 1,
color "dark" default 0 0 0 0,
scalar "spread" default 0.8,
scalar "max_distance" default 0,
boolean "reflective" default off,
integer "output_mode" default 0,
boolean "occlusion_in_alpha" default off
)
version 2
apply texture

Отсюда вытекает способ использования АО в сочетании с другими шейдерами для создания материала со сложными свойствами – mental ray phenomena или материалов 3ds max.

АО в результате вычислений может возвращать величину "color", т. е. цвет, и может принимать цвет от других шейдеров в качестве параметра для вычислений (параметры "bright" и "dark"). Результат вычислений шейдера ambient occlusion также может быть передан внешней функции-обработчику, например, для комбинирования результатов вычислений нескольких шейдеров в один общий результат.

АО может быть успешно использован для определения ambient-свойств материалов 3ds max. В этом случае результат вычислений АО будет сочетаться с диффузными, отражающими и преломляющими свойствами материала, по правилам, стандартным для материалов 3ds max.. Таков один из возможных способов реализации основной функции шейдера – "ambient occlusion", то есть затенение фонового освещения.

Еще один вариант использования АО – соединять его с другими шейдерами посредством "комбинирующих" материалов 3ds max, например – Shellac, Fallof, Mix и других. В этом случае АО может быть использован для определения любых свойств материала. Именно так реализуется функция reflect occlusion – для определения отражающих/преломляющих свойства материала используется сочетание АО, материала типа Raytrace и растровой карты для отражений.

Вполне возможно и одновременное использование обоих этих методов, в этом случае будет выполняться "полное" затенение, то есть и "ambient occlusion" и "reflective occlusion".

Наконец, третий способ использования шейдера АО – для целей компоузинга во внешних программах и пост-обработки изображений.

Интерфейсе шейдера АО в 3ds max выглядят следующим образом:



Интерфейс шейдера Ambient/Reflective Occlusion в 3ds max

Параметр Samples определяет число лучей, "выстреливаемых" из точки через поверхность сферического сегмента в окружающую сцену. Чем больше лучей, тем более гладким будет результат. На гладкость результата оказывают также влияние настройки антиалиасинга и величина параметра Spread (угол сферического сегмента, через который посылаются лучи).

Параметр Bright позволяет определить цвет для незаблокированных лучей (лучей, не встретивших препятствий при трассировке в сцене), а параметр Dark – цвет для лучей, встретивших препятствие. Наиболее часто используемое практическое значение величины Dark – черный цвет. Результирующий цвет точки определяется как отношение числа заблокированных лучей к общему числу испущенных лучей и с учетом значений цвета, заданных для Bright и Dark. Для определения значений Bright и Dark можно использовать не только простой цвет, но и растровые карты, шейдеры и материалы.

Параметр Spread определяет угловую величину сферического сегмента точки поверхности, через который посылаются сэмплирующие лучи. Изменяется в пределах от 0.0 до 1.0. Значение "0" определяет только одно направление испускания (один луч) – вдоль нормали к точке или вдоль направления отражения, что используется для reflective occlusion. Значение "1" определяет полусферу (угловая величина 180 градусов). Чем больше угловая величина сферического сегмента, тем больше потребуется лучей для получения гладкого результата. С другой стороны, чем уже конус лучей, тем более резко очерченными будут теневые переходы и наоборот. Использование целой полусферы дает интересный эффект самозатенения поверхностей, что с успехом может быть использовано для "проявления" рельефа поверхности или оттенения деталей поверхностей, содержащих многочисленные мелкие элементы – травы, волос и т.п.

Параметр Max distance указывает максимальную длину сэмплирующего луча и тем самым – максимальное расстояние в пределах которого проверяется наличие геометрии. Если его значение равно 0, границы области проверки определяются размерами сцены. Таким образом, явное указание Max distance может быть использовано для ускорения расчетов ambient occlusion.

Включение/выключение флага Reflective определяет направление, относительно которого строится сферический сегмент для испускания лучей. Если флаг установлен (Reflective on) сфера строится относительно направления отражения света, определяемого свойствами материала и геометрии поверхности. Используется для расчета reflective occlusion. Если флаг отключен (Reflective off), сфера строится относительно нормали в точке поверхности, шейдер рассчитывает ambient occlusion.

Параметр Type (output_mode) определяет режим, в котором работает шейдер: 0 – стандартный ambient occlusion, 1 – шейдер работает как и в режиме "0", но дополнительно выполняется сэмплирование Environment: в направлениях сэмплирующих лучей производится выборка цвета из карт, заданных для environment, и для каждого цвета рассчитывается весовой коэффициент в зависимости от того, заблокировано данное направление геометрией или нет. Затем все цвета суммируются с учетом их весовых коэффициентов, умножаются на цвет, заданный в Bright и суммируются с цветом Dark. Поскольку направления сэмплирующих лучей довольно случайны, получаемые из растровых карт окружения цвета могут сильно отличаться между собой. Это особенно актуально, если в качестве карты используется HDRI – приводит к более сильной, относительно "чистого" цвета, зашумленности изображений и потому требует бОльшего количества сэмплирующих лучей для получения результата той же степени гладкости. Одним из способов преодоления этого недостатка является сильное размывание карт фильтром Gaussian Blur в программах обработки изображений, например – Adobe Photoshop для LDRI или HDRShop для HDRI. Другой способ – использовать процедурные карты окружения, например -– Gradient и Gradient Ramp.

Type = 2 предназначен для расчета направлений "искривления" нормалей поверхностей. При Вычисляется усредненное значение незаблокированной нормали в пространстве мировых координат и относительно него вычисляются отклонения всех остальных нормалей в зависимости от их заблокированности. Такие отклонения кодируется цветом, красный цвет характеризует величину отклонения по мировой оси координат x, зеленый – по оси y и синий – z. Type = 3 делает тоже самое , но в координатном пространстве камеры. Последние два режима предназначены для использования во внешних программах компоузинга и пост-обработки. Прием довольно часто используется в кинопроизводстве для изменения свойств освещения.

Если параметр Return occlusion in alpha установлен в положение "on", создается растровая черно-белая карта значений ambient occlusion, которая помещается в альфа-канал изображения. Результат расчетов будет зависеть от установленного режима работы шейдера (значения параметра Type).

Теперь попробуем применить все это на практике. Рассмотрим вот такую сцену:



Сцена освещена двумя стандартными точечными источниками света (omni light)

Сцена содержит плоскость с установленным на нее автомобилем и освещена двумя точечными источниками света, всем объектам сцены заданы материалы типа Standard.

А вот что мы увидим, если зададим для свойств поверхности шейдер ambient occlusion:



Шейдер АО назначен диффузным свойствам материалов

Все детали получили дополнительные мягкие тени в результате самозатенения, делающие их вид более объемным. Поскольку "небо" над автомобилем совершенно чистое, светлые участки обеих сцен почти идентичны. Во втором случае цвет поверхностей изменился по той причине, что параметр bright и dark шейдера АО имеют значения по умолчанию – белый и черный соответственно. Основной диффузный цвет материала значения не имеет, поскольку в расчетах не учитывается.

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



Все тени в сцене рассчитаны ambient occlusion

Использование АО для определения диффузных характеристик поверхности не является использованием шейдера по прямому назначению, скорее – способом получения спецэффектов. Например, он хорошо подходит для реализации reflective occlusion. Кроме того, сочетание АО c другими материалами требует определенных усилий. Обусловлено это тем, что назначение "в лоб" карт и материалов для параметров "bright" или "dark" редко дает приемлемый результат. Здесь требуется комбинирование АО и материалов, например при помощи "оборачивающего" материала, такого как Shellac или Fallof.

Использование АО по прямому назначению предполагает определение с его помощью ambient – характеристик материалов. Для этого отключаются замки, блокирующие ambient и diffuse свойства материалов:



Настройка ambient свойств материала
для использования АО



В сцене нет источников света, кроме ambient-освещения, заданного через Rendering>Environment>Ambient

Для материалов "земли" и автомобиля заданы шейдеры АО в ambient – свойствах их материалов, сфере назначен обычный материал, без АО. Для того, чтобы остальные характеристики материалов тоже проявили себя (диффузные, зеркальные и т.д.), в сцене должен присутствовать хотя бы один реальный источник света. При этом все параметры освещения и материалов потребуется настраивать специально для совместного использования с АО. Это обстоятельство, наряду с тем, что все материалы в сцене должны будут иметь АО в ambient - свойствах (иначе будет как в случае со сферой), делает такой способ использования шейдера ambient occlusion довольно трудоемким занятием.



Источник света проявляет диффузные характеристики поверхности

Если в сцене установить хотя бы один источник света, диффузные характеристики поверхностей "вступают в игру" наряду с ambient occlusion. Как хорошо видно на последнем рисунке, там где поверхность хорошо освещена источником (в данном случае он сверху) превалирует диффузный цвет, а в областях слабо освещенных – тень, рассчитанная АО. Таким образом, очевидно, что необходимо приводить в соответствие цвета "dark" и "bright" шейдера АО и диффузный цвет.

Однако, существует способ автоматизировать до некоторой степени этот процесс. Для этого нужно переключить АО в режим 1 (mode=1), в котором он будет выполнять сэмплирование окружения и настроить цвет окружения.



Ambient occlusion в режиме 1, учитывается цвет окружения

Существует еще один способ использования ambient occlusion, наиболее удобный из всех – шейдер АО можно назначить источнику света. В этом случае необходимость специально редактировать материалы почти полностью отпадает.

Для случая точечного источника этот метод состоит в следующем. Создаем и помещаем в удобном месте сцены источник света. В свойствах источника Advanced effects включаем Ambient Only, при этом Diffuse и Specular свойства становятся недоступны и рассчитываться не будут – мы превращаем обычный источник света в чисто амбиентный (фоновый) источник. Далее отключаем освещение у источника вообще – в Light Type убираем галочку из бокса "On" и идем к свитку свойств mental ray Light Shader. Здесь щелкаем на кнопке с надписью Light Shader и в появившемся списке выбираем Ambient/Reflective occlusion. Включаем галочку в боксе "Enable" (разрешаем его использование) и перетаскиваем кнопку Ambient/Reflective Occlusion c кнопки Light Shader в свободный слот редактора материалов. Это нужно для того, чтобы иметь возможность редактировать параметры шейдера. Результат:



Шейдер ambient occlusion назначен точечному источнику света. Другого освещения в сцене нет

Как видим, такой способ позволяет правильно сочетать результат расчетов ambient occlusion и свойства материалов и освещения, к тому же прост и универсален – достаточно всего лишь поместить в сцену один ambient – источник.

Теперь посмотрим, как влияют параметры АО на результат.

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



Spread = 1

Spread = 0.5, сэмплирующие лучи испускаются через конус углом в 90 градусов:



Spread = 0.5

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

Для получения reflective ambient occlusion достаточно положить шейдер в слот Reflection материала 3ds max. Настройка шейдера несколько отлична – параметр Spread нужно выставлять в 0 для получения четких зеркальных отражений или задавать небольшое ненулевое значение в пределах 0.01 - 0.1 для получения размытого отражения, не требуется большого количества сэмплирующих лучей (Samples). В самом простом случае параметру Bright можно назначить растровую карту отражения и включить флаг Reflection.



Простой reflective occlusion с картой отражения на параметре Bright – шейдер "видит" затеняющую геометрию, но не может построить правильные отражения – вместо них мы видим черные пятна

Для того, чтобы АО шейдер мог правильно строить отражения, необходимо использовать его в сочетании с картой типа Raytrace. Комбинация шейдера и такой карты может быть выполнена разными способами. Например, при помощи "оборачивающего" материала типа Mix, диаграмма материала поверхности может выглядеть так:



Пример диаграммы более сложного материала, позволяющего получить отражения с помощью reflective occlusion

В качестве одной карты материала Mix выступает HDR изображение, которое используется для незаблокированных точек поверхности. Второй материал – mental ray Reflect, используется для расчета освещения заблокированных точек. Смешивание карт выполняет ambient occlusion, параметры которого настроены как в предыдущем случае.

Результат применения такого материала:



Материал с Reflective occlusion, позволяющий получить отражения

Теперь поверхность автомобиля правильно отражает окружение.

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

Сделать тоже самое для прозрачных материалов (refractive occlusion) пока невозможно. Дело в том, что в соответствии с алгоритмом АО - шейдера сэмплирующие лучи испускаются только над поверхностью, а для преломляющих материалов такие лучи нужно трассировать в противоположном направлении – под поверхность.

Приведенная диаграмма материала для reflective occlusion не единственна. Вот еще один пример на основе материала Fallof и Mix:



Еще один пример материала для reflective occlusion

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

Такие же комбинированные с шейдером ambient occlusion материалы можно создавать и для диффузных характеристик поверхностей.

Теперь сравним результаты и время расчета сцены с источником света SkyLight и реальными материалами, выполненный при помощи Final Gather, и расчет сцены с использованием ambient occlusion.



Источник света – Skylight, расчет освещения выполнен при помощи Final Gather, время вычислений – 2 часа 15 минут

Для настройки освещения с помощью ambient occlusion нужно "ловить" соотношение интенсивности прямого освещения и ambient – освещения. Для этого удобно воспользоваться возможностью Material Override прямо из рендера и настраивать параметры шейдера ambient occlusion. Для данной сцены интенсивность точечного источника, дающего прямое освещение составила 0.2, для параметров шейдера АО выбраны следующие значения: Spread = 0.8, Samples = 32, mode = 1 (сэмплируется Environment), Max distance = 150 см.

При таких настройках "чистый" ambient occlusion выглядит так:



Настроенный для сцены "чистый" ambent occlusion

Такие настройки были выбраны из-за особенностей материала кузова автомобиля – он относительно темный. Для более светлого материала настройки шейдера АО могут быть другими, с более насыщенными тенями.

Теперь выполним полный рендер сцены, с текстурами:



Расчет с ambient occlusion. В сцене два основных точечных источника света – один для обычного освещения, второй – только для ambient - освещения. Время – 21 минута



… и добавим немножко отражений, время рендера увеличилось до 33 минут



Для кузова автомобиля использован другой, более светлый материал

Ambient/Reflective Occlusion также можно попробовать использовать для рендера интерьеров, например, в связке с фотонными картами. Есть особенность, которую необходимо учитывать — интерьер представляет собой замкнутое или почти замкнутое пространство. Поэтому, если не указывать подходящее значение длины сэмплирующих лучей, рендер будет просто "черным прямоугольником", поскольку вся геометрия окажется заблокированной. Длину сэмплирующих лучей нужно подбирать в зависимости от того, как, или для чего планируется использовать шейдер. Например, для имитации глобального освещения, неплохой результат можно получить при длине сэмплирующих лучей (параметр Max distance) в 1 — 2 метра. Для случая сцены, рассматривавшейся в первой части обзора, это выглядит так (добавлен точечный ambient - источник в центре комнаты):



Рендер интерьера. Для имитации глобального освещения использован ambient occlusion, Max distance = 3 метра

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



Связка: фотонные карты + ambient occlusion

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

Дальнейшим развитием этой техники рендеринга является использование тройной связки "фотонная карта + FG + ambient occlusion". В этом случае мы имеем альтернативу Exposure control – управления освещением при помощи экспозиции. При этом на ambient occlusion возлагается роль постоянного константного освещения, которое можно просто добавить к глобальному освещению, рассчитанному фотонными картами и Final Gathering. Таким образом можно избавиться от засветов в ярко освещенных областях сцены (возле окон) и одновременно добиться того, что темные области сцены будут достаточно хорошо освещены. Можно считать, что в данном случае ambient occlusion позволяет имитировать способность человеческого зрения приспосабливаться к освещению в широком диапазоне интенсивностей.

На практике следует рассчитывать глобальное освещение и ambient occlusion за два отдельных прохода и затем комбинировать их в программе обработки растровых изображений, поскольку расчет освещения методом фотонная карта + FG + ambient occlusion за один проход выполняется очень долго.



Освещение рассчитано за два прохода. Первый – фотонная карта + FG, второй – только ambient occlusion c Max distance= 3 метра, рендеры сохранены в два отдельных файла в формате .tif. В Adobe Photoshop эти рендеры ложились в два слоя, основной слой – рендер с GI, второй слой – ambient occlusion, прозрачность слоя 32%, режим смешивания "Screen"



Для сравнения – рендер только с GI (фотонная карта + FG)

Ambient/Reflective Occlusion довольно широко используется для рендера по проходам (пассам) с последующей их сборкой в одно изображение во внешней программе обработки растровых изображений, например — в Adobe Photoshop или Shake. Существует довольно много вариаций этой техники, но в самом общем случае требуются следующие проходы:

  • рендер только с освещением от прямых источников света, возможно – с расчетом GI только фотонными картами, без FG
  • рендер только с ambient occlusion, без текстур и цвета, при этом шейдер может быть назначен в слот диффузных характеристик материала
  • рендер только ambient – освещения с текстурами и без АО
  • при необходимости – рендер с освещением от окружения, без текстур

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

На этом пока все. В следующий части будет рассмотрен шейдер SSS, его свойства и возможности.

До встречи.

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

iXBT BRAND 2016

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

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

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

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