Дихроичное стекло в Corona Renderer

Дихроичное стекло в Corona Renderer

@marchik3d
Время пришло.

Салют!

Сегодня в текстовом формате, наконец-то, поговорим о дихроичном стекле и том, как имитировать его в наших фотореалистичных визуализациях без излишней головной боли (ну разве что чуть-чуть).

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

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

Кусочек теории

Чтобы воссоздать — надо понять.

Для начала давайте разберёмся с самим понятием дихроизма.

Дихроизм —раз­лич­ное по­гло­ще­ние ани­зо­троп­ным ве­ще­ст­вом све­та в за­ви­си­мо­сти от его по­ля­ри­за­ции (ани­зо­тро­пия по­гло­ще­ния). По­сколь­ку по­гло­ще­ние за­ви­сит так­же и от дли­ны вол­ны, дих­ро­ич­ные ве­ще­ст­ва ока­зы­ва­ют­ся раз­лич­но ок­ра­шен­ны­ми при на­блю­де­ни­ях по раз­ным на­прав­ле­ни­ям, от­сю­да и назввание (от греч. δίχροος – двух­цвет­ный)

Простым языком — вещество меняет цвет, реагируя на условия освещения/положение наблюдателя.

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

Конкретный тип для нас значения не имеет, так как мы не сможем полностью физкорректно воссоздать (в виде, пригодном для продакшена) ни один из них. Corona Renderer просто не располагает нужными шейдерами для имитации нюансов тонкоплёночной оптики.

А раз мы не можем использовать достоверную модель, мы будем имитировать очевидные свойства, всё равно наши зрители воспринимать результат будут эмпирически.

При таком подходе очень важно иметь под рукой как можно больше референсов того, что нам требуется воссоздать, поэтому получив в работу объект с такими элементами обязательно запросите референсы по конкретному типу покрытия (наименование плёнки, сайт производителя и т.д.).

Анализ референсов

Анализируя референсы выше, можем отметить что основных наблюдаемых свойств, которые характерны для большинства примеров всего 4:

1) Объекты в отражении стекла имеют цветной оттенок.
2) Объекты за стеклом имеют оттенок, отличный от первого.
3) При интенсивном освещении "тень" от стекла окрашена в третий оттенок.
4) При изменении угла наблюдения стекло проявляет иридисцентные свойства, то есть стекло меняет цвет/переливается.

Имитируя поочерёдно каждое из этих свойств мы и сможем добиться желаемого результата.

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

Инструментарий

Выделю основные инструменты, которые могут стать нам подспорьем.

Материал CoronaLegacyMtl — в отличии от CoronaPhysicalMtl он позволяет свободнее фейковать, задавая различные параметры для составляющих Reflection и Refraction независимо.

Галочка Thin в разделе Refraction материала CoronaLegacyMtl — убирает преломления как таковые, делая из нашего стекла плёнку, в некоторых случаях очень сильно помогает результату.

Материал RaySwitchMtl — в отдельных случаях поможет нам добиться нужного оттенка для "тени" нашего стекла.

Карта Falloff — позволит нам задать зависимость цвета от угла обзора (+ она имеет очень занятный баг, который мы сможем использовать нам на пользу)

Карта Gradient Ramp — позволит контролировать цвет отдельных областей нашего стекла, так же её можно использовать, чтобы "заремапить" другую карту, например Noise или Falloff.

Шейдер Sigertexmaps ThinFilm от Siger Studio — он собственно и создан для имитации тонкоплёночной оптики, но по итогу, я не использовал его ни в одном из вариантов, хотя в ряде случаев может пригодиться.

Галочка Enable в разделе Caustics Solver во вкладке Performance в настройках рендера — в отдельных случаях позволит очень точно имитировать референс, добавляя каустику отражений от нашего стекла на окружающие объекты.

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

Пример 1

Фотографии стекла с двумя видами наклеенной плёнки. Изображения из каталога магазина плёнок designerfilms.com

Итак, приступим.

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

Сейчас геометрия стекла выполнена в виде простого Plane, не имеющего толщины, применим в нему материал CoronaLegacyMtl.
Не будем трогать значения для Diffuse, включим отражения и выключим Fresnel, выставив значение IOR на 999, получив своего рода зеркальную плёнку, которая отражает весь свет.
Включив Refraction на 1.0 и галку Thin (no refraction) можем заметить что ничего не изменилось, стекло по прежнему отражает весь свет.

Ну а теперь сама магия:

Добавим в слот Reflection Color карту CoronaColor, предварительно задав ей красный цвет.

И вуаля! Мы получаем очень похожий на референсное изображение эффект.

Такое поведение шейдера является своего рода багом (ну а в нашем случае очень полезной фичей).

Насколько мне хватает моего понимания, CoronaLegacyMtl состоит из 5 слоёв, с приоритетом в порядке убывания: Reflection, Refraction, Translucency, Volumetric, Diffuse, каждый из которых перекрывает друг друга + в материале реализован принцип Energy conservation, то бишь сохранения энергии.

Простыми словами, на объект с применённым материалом попадает 100% света и все они до последнего процента распределятся между нашими пятью слоями (в зависимости от их настройки), света на выходе не станет больше и он не растворится бесследно в варпе.

Слой с отражениями имеет наивысший приоритет, поэтому когда мы отключаем френель (затухание отражений), то на слой Refraction ничего не остаётся, объект выглядит как непрозрачное зеркало.

Но стоит нам добавить карту CoronaColor, и отражаться станут не все 100% света, а только та часть спектра, которую мы зададим, соответственно всё остальное уйдёт в следующий по списку активный слой, то есть Refraction.

Ничего не мешает нам добавить ещё одну карту CoronaColor в слот RefractionColor и подкорректировать оттенок для стекла на просвет.

Таким образом, мы воссоздали 3 из 4-х необходимых нам свойств (1,2 и 4), которые наблюдаются на референсе. Остаётся только изменить оттенок для "тени" стекла.

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

Создадим CoronaRaySwitchMtl, применим его к стеклу, и добавим наш исходный материал во все слоты кроме первого - "Global Illumination"
Создам ещё один CoronaLegacyMtl, включим Refraction и добавим карту CoronaColor в Refrection Color, а сам материал подключим в слот Global Illumination в CoronaRaySwithMtl.

Можем заметить что на референсе наша тень имеет градиент цветов от фиолетового к синему, а верх бокса на переднем плане окрашен в розовый цвет, мы сможем реализовать это, заменив наш CoronaColor на GradientRamp, не забыв про правильные текстурные координаты у нашей модели стекла.

Добавим GradientRamp и откорректируем ползунки градиента на глаз со включённым интерактивом.

На данном этапе мы реализовали все 4 свойства, которые видим на референсе, дело за финальной доработкой.

Дополнительно мы можем добавить к нашему стеклу модификатор Shell, таким образом, мы создадим 2 слоя нашего стекла, что усилит насыщенность оттенков, но одновременно с этим затемнит его.

На итоговый результат могут так же оказать влияние параметры слоя Diffuse и слоя Translucency, так как по схеме, которую я объяснял выше, из общих 100% света, которые попали на материал, мы отсекли часть на "подкрашенные" отражения, часть на "подкрашенный" слой refraction, а остаток света от refraction просачивается на diffuse, а при активации транслюенции ещё и на неё:

Наглядно

На данном этапе в сравнении с референсом наше стекло выглядит следующим образом:

Ещё раз хочу заметить, что на результат очень сильно влияет освещение, чем ярче подсвечены объекты за стеклом, тем ярче будет зелёный оттенок, чем ярче объекты перед стеклом, тем ярче будут красные отражения.

Если нашей задачей стоит именно повторить внешний вид референса то открываем фотошопы и дорабатываем рендер.

Сильно углубляться в это не буду, обычная пост-обработка как и с любым кадром (ставь огонёчек под этой статьёй, если хочешь больше инфы по посту :D)

Абсолютно аналогичным способом, заменяя цвета получаем и жёлто-фиолетовую вариацию нашей плёнки:

Для изменения уже настроенного цвета очень удобно использовать крутилку Hue в карте CoronaColorCorrect


Пример 2

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

Для начала создаю тёмно-серый плейн пола, а на фон загружу рандомную экстерьерную HDRI карту с polyhaven.com и переключу её в режим проекции Dome для наглядности, привязав положение к dummy-объекту

HDRI карта пропущена через CoronaColorCorrect, для регулировки гаммы и экспозиции.
Добавим plane для стекла и применим к нему материал CoronaLegacyMtl с отключённым Fresnel и включённым Refraction и галочкой Thin, всё как прошлом примере.
Добавим карту Falloff со стандартными значениями в режиме Perpendicular/Parallel и вставим её в слот Source Map, вновь созданной карты Gradient Ramp.
Переключим параметр Gradient Type в режим Mapped, а из ползунков, вспоминая детский стишок, восстановим радужный градиент.

Таким образом мы создали карту, которая меняет цвет вдоль всего видимого спектра в зависимости от угла объекта по отношению к камере.

Применяем эту карту в слот Reflection Color и получаем, "переливающийся градиент" как для отражений, так и для преломлений.

А теперь я расскажу про "полезный баг" со встроенной картой Falloff, про который упоминал в начале, и который я обнаружил в процессе экспериментов.

Как вы могли заметить, при вращении камеры цвет тени от стекла не меняется, хотя очевидно, что угол между Z-осью камеры и объектом меняется вместе с цветом отражений и преломлений.

Напротив, если я выделю и буду вращать dummy, который управляет положением HDRI карты, а соответственно и света - цвет тени будет меняться вслед за ним.

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

Дабы проиллюстрировать, я заменю встроенную карту Falloff на OSL шейдер с абсолютно теми же параметрами, и он начинает работать как и ожидается, цвет тени меняется в зависимости от положения камеры, а вот на положение света он начинает реагировать очень странно, работая как Towards/Away.

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

Итак, вернём нашую родную "сломанную" карту Falloff и продолжим.

На данном этапе мы можем зайти в настройки рендера и во вкладке Performance включить Caustics Solver, отметив галочку Enable и Caustics from environment, так как у нас в сцене нет источников света, кроме карты окружения.

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

Скопируем наше стекло несколько раз, расположив копии под произвольными углами. В результате получим абсолютно потрясающий калейдоскоп из красок. Могу по 10 минут залипать :D

При желании, вместо нашего градиента можно использовать ThinFilm шейдер от Siger Studio, но я не вижу в нём особенных преимуществ, если у нас нет строго заданных толщин для плёнки, подбирать нужные оттенки всё равно придётся на глаз.

Вставляем в ReflectColor, задираем Saturation, опускаем Gamma, крутим IOR'ы и толщину плёнки на глаз.
При необходимости рандомизировать наши стёкла, пропустим градиент через карту CoronaMultiMap, оставим один вход, режим рандомизации поставим Instance или Mesh Element, и зададим Hue Random по вкусу, она будет сдвигать спектр для каждого отдельного стекла, давая ещё больше красок.
Осуществлять тонкую подстройку можно, как просто редактируя градиент, сжимая спектр или добавляя больше цветов, так и изменяя кривую карты Falloff, или задавая ей другие режимы и направления.

Эпилог

Используя такой подход в создании шейдера как базу, мы можем доработать сам "стекольный бутерброд" до более реалистичного состояния, добавив слой обычного архитектурного стекла с толщиной, получив честный refraction, торцы с фасками, несовершенства в канале glossiness/roughness, неровности в бампе и так далее.

Ниже представлены несколько визуализаций, которые я выполнил, используя описанные выше принципы. В качестве референсов использованы фотографии Timothy Kaye.

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

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

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

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

Файл сцены из 1 примера (max 2019+) + pdf

Behance

Corona Renderer Forum

3ddd

EN version