Все базовые свойства изложенные в диснеевском «трактате» от 2012 года Physically-Based Shading at Disney я так или иначе уже проговорил и показал реализацию этих свойств используя стадартный V-ray шейдер (VRayMtl). Пришло время поговорить о «тонких мирах».
Реализация шейдеров для тонкостенных объектов в СG. Это частный случай и он имеет ограниченную область применения. Как таковой физической основы за собой они не имеют, кроме шейдеров, которые имитируют интерференцию света в тонких средах.
Thin Film Interference
В быту данное свойство можно наблюдать на крыльях у некоторых насекомых, у масляных и бензиновых разводах на мокром асфальте, у мыльных пузырей, перламутра на ракушках, у оксидных пленок на поверхности металла и просветляющих пленок на оптических стеклах и т.д. Это явление называется «интерференция в тонких пленках».
Физика эффекта следующая — крылышко насекомого состоит из хитина, который, будучи прозрачным, 80% света пропускает и только 20% отражает. При этом лучи, отраженные от верхней и нижней поверхности, интерферируют, то есть складываются с усилением или ослаблением амплитуды. Поскольку крылышко не везде имеет одинаковую толщину, разные длины волн, в различных точках, совпадают по максимуму — отсюда и получаются радужные разводы на поверхности. По такому же принципу работает этот эффект на мыльных пузырях, у оксидной пленки на металле, бензиновой пленке на асфальте и т.д.
В V-ray данный эффект можно реализовать через OSL шейдер или плагин Thin Film от студии SIGGER. По моему мнению использовать OSL шейдер предпочтительней, так как он будет работать независимо от версии 3ds max, сцену с этим шейдером легко передать другому пользователю, так как фактически OSL это запрограммированная процедурная текстура и может «лежать» в папке с остальными текстурами к сцене, когда как Thim Film это плагин, который надо устанавливать, под нужную версию 3ds max.
Так же, путем нехитрых манипуляций с нодой Output, можно создать эффект интерференции стандартными инструментами 3ds max, тогда эта нода будет «разлагать» любую проходящую через нее текстурную карту, создавая различные цветовые переходы между оттенками серого у входящей текстуры. Примеры, в представленных в статье таблицах, были реализованы именно этим методом.
На этом обзор физически обоснованных, то есть PBR свойств, у шейдеров закончен. Далее я буду рассматривать реализацию в CG Thin thickness (англ. — тонкая толщина) поверхностей. Этот раздел не имеет прямого отношения к PBR принципам, поскольку это только средство оптимизации шединга, которое избавляет от сложных или ненужных вычислений, в частных случаях.
Thin geometry
Для начала я дам определение нескольким понятиям — Solid, Hollow и One-Side Geometry.
Определение Solid (англ. — сплошной) подразумевает собой что весь объем объекта это единый материал. В реальности, если разрезать полнотелый объект, так и будет. Но если же объект разрезать в 3d пространстве, то мы увидим… мы ничего не увидим… Это будет One-Side Geometry (англ. — односторонняя геометрия), но рендер система, в стандартных условиях, воспринимает этот объект как полнотелый.
Определение Hollow (англ. — пустотелый)— подразумевает собой что объект внутри пустой, с некоторой толщиной стенок. В реальности, при разрезе, действительно будет видна некоторая толщина. В 3d пространстве, при виртуальном разрезе 3d модели со стенками, мы увидим два объекта, один в другом. Это по прежнему будет One-Side Geometry, но с разной ориентацией нормалей. Такая «матрёшка» считывается рендер системой как пустотелый объект с определенной толщиной стенок.
В некоторых случаях, мы не видим толщины объекта, так как объект имеет замкнутый объем (воздушный шарик), либо она столь несущественна (лист бумаги), что на рендере это не будет заметно. Не разумно, для таких объектов применять модификатор Shell и настраивать ресурсоемкий SSS шейдер, если речь ведется об общих и средних планах кадра.
Для того чтобы избежать лишних вычислений были придуманы шейдерные решения, которые дают возможность достоверно рендерить One-Side Geometry, как будто она имеет некоторую толщину.
До этого раздела я рассматривал все свойства материалов в контексте «нормальной» геометрии объекта, когда 3d модель имеет видимую толщину — Solid geometry и это толщина учитывается шейдером, например при реализации SSS свойств материала, когда вычисляется насколько глубоко свет проникает в объем и как он ведет себя в этом объеме.
К тонкостенным объектам, физической толщиной которых можно пренебречь, можно отнести: пластиковые пленки, ткани, бумагу, растительность (листья, трава, лепестки), крылья насекомых, мыльные пузыри, в некоторых случаях стекло — думаю вектор мысли вам понятен. В CG эти объекты, как правило, реализуют через одностороннюю геометрию.
На коференции SIGGRAPH 2015 выступал Brent Burley с темой Extending the Disney BRDF to a BSDF with Integrated Subsurface Scattering . В этом докладе были представлены расширенные диснеевские принципы в шейдинге. Подробно был рассмотрен отдельный раздел для объектов с односторонеей геометрией, но фактически шейдинг для таких объектов не отличается от базовых PBR принципов, просто идет корректировка некоторых свойств.
Например персонаж из анимационного фильма Big Hero 6 . Очевидно что тут используется SSS шейдер, но персонаж не выглядит как мрамор, он выглядит как надувной шарик из тонкой ткани.
Так же очевидно, что честное решение геометрии персонажа из ткани с толщиной в миллиметр доставило бы ряд неудобств при ригинге, UVW мапинге, шейдинге и т.д. Поэтому для таких случаев диснеевский шейдер был доработан, что бы можно было достоверно рендерить One-Side Geometry, как будто она имеет некоторую толщину.
Какие свойства в настройках шейдера V-ray следует пересмотреть для случаев описанных выше?
Все зависит от материала и ситуации. К примеру, шейдерам пластиковой пленки или стекла электролампы, которые реализованы через одностороннюю геометрию необходимо сделать следующие поправки:
Выставить белый цвет для опций Refract и Reflect Значение IOR поставить равное 1.0 «разлочить» Fresnel IOR Скорректировать Fresnel IOR для пластика или стекла (пластик 1.55, стекло 1.52) Активировать опцию Reflect on back side Цвет у Diffuse черный
Таким образом объем и толщина объекта, а вернее её отсутствие, будут игнорироваться, поскольку IOR равен 1.0, но при этом за счет того, что «разлочена» опция Fresnel IOR отражения на объектах по прежнему будут присутствовать, а активная опция Reflect on back side будет давать отражения на обратной стороне геометрии.
Transmittance
Прозрачность для односторонней геометрии можно реализовать как через Refract, так и через Opacity. Для пластиковых пленок и тонкого стекла уместней использовать Refract, настройки смотрите выше. Для полупрозрачных тканей и бумаги — оптимальным решением будет реализовывать прозрачность через Opacity.
Transmittance colour
Для создании цветных пленок или стекла через одностороннюю геометрию, опцией Fog color, пользоваться не следует, для этих задач эта опция не подходит. Fog color определяет цвет основе на объеме объекта, в нашем случае объекты подразумеваются плоским или тонкостенными. Для определения цвета прозрачности материала его следует задавать напрямую в слоте Refract.
Transmission roughness
Transmission roughness, реализованное в V-ray опцией Refract glossy, на объектах с односторонней геометрией работает корректно, поэтому каких то дополнительных "твиков" VrayMtl не требует.
Translucency
В случае тонкостенных материалов, в бытовом употреблении, применяют термин — «транслюцентный материал», но по факту это все то же подповерхностное рассеивание света (SSS).
В V-ray, для односторонней геометрии и материалов с явными SSS свойствами (бумага, ткань, растительность, тонкий пластик и т.д. ) следует использовать стандартный VrayMtl шейдер в связке с VRay2SideMtl. Данная связка дает возможность корректно и быстро реализовать эффект подповерхностного рассеивания света для односторонней геометрии.
Прочие свойства, описанные в ранних частях обзора, будут работать с односторонней геометрией в «штатном» режиме, либо будут не актуальны, как например Attenuation (англ. — затухание) так как речь ведется об очень тонких поверхностях.