Что такое PBR? Часть II
В предыдущей статье, для себя и для неравнодушных, прояснил, что стоит за термином PBR.
Physically Based Shading (PBS)
Шейдер (англ. Shader – затеняющий), шейдинг (англ. Shading – затенение). В CG это определение перекочевало из области изящных искусств. Так называют технику штриховки карандашом, которая выявляет объем объекта.
Если мы нарисуем замкнутую линию, ну, например, пусть это будет круг (Аналогом в 3ds max может быть сплайн). Данная геометрическая фигура не дает нам никакого представления об объеме объекта и я уже не говорю о свойствах его поверхности и т.д.
Если нарисуем несколько замкнутых линий эллипсовидной формы, то они образуют каркас сферы (аналогом такого решения будет отображение сферического объекта в режиме «wire»). Текущее представление, уже может дать представление о форме объекта, но для людей с хорошим пространственным мышлением.
Если же начать наносить штрих, поверх конструктивного рисунка, выявляя границы между светом и тенью, добавляя полутени, а также обозначив границы у падающих теней, то получится объемно-пространственное изображение. Эти действия можно сопоставить с процессом рендеринга, а итог этих действий – с результатами рендеринга.
BxDF функции
Популярная и широко используемая в продакшен рендеринге рендер система V-ray долгое время применяла в стандартном шейдере VrayMtl следующие функции:
Phong
Blinn
Данные модели BRDF не имеют ничего общего с PBR, поскольку разработаны на основе эмпирических данных.
Удивительно, но да, большинство BxDF функций реализованы «на глазок». Другое дело функция GGX. Данная функция была выведена на основе физических измерений и в различных имплементациях используется во всех современных рендер системах, как в продакшене, так и в реалтайме.
GGX функция
Длинный «хвост» или эффект «дымки» вокруг основного блика обусловлен тем, что большинство объектов, которые встречаются в обычных бытовых условиях, не имеют идеальной полированной поверхности у них всегда имеются микрошероховатости, которые оказывают влияние на глянцевитость поверхности.
Этот недостаток у GGX функции был решен в R&D (англ. Research and Development — исследования и разработки) отделе студии Дисней, который модифицировал GGX функцию, «скрестив» её с зеркальной моделью Trowbridge-Reitz описанную в работе 1975 года «Average Irregularity Representation of a Rough Surface for Ray Reflection». Таким образом в GGX функции появилась переменная для управления «хвостом» блика. Самой функции дали название GTR (Generalized Trowbridge-Reitz) Продолжение следует…
Шейдинг что это такое
Ваша корзина в настоящее время пустая
Как это работает
Приобрести продукцию можно через Консультантов по красоте Mary Kay.
Тренды в макияже: Стробинг, шейдинг, бейкинг
В этом году как никогда прежде популярны техники в макияже, позволяющие скорректировать овал лица, сделать лицо более сияющим, подчеркнуть достоинства и скрыть недостатки на коже. Стробинг, шейдинг, бейкинг – в чем различие всех этих терминов, как подобрать идеальное средство для любого макияжа – читайте в этой статье!
Стробинг – техника легкого «подсвечивания лица». Результат должен выглядеть естественно: слегка увлажненная и сияющая кожа и рельефный овал лица.
Техника под названием стробинг, пожалуй, является самой популярной среди звезд и бьюти- блогеров благодаря своей простоте и эффективности. Техника получила свое название от специальной строб-лампы, используемой для фотосессий. Она дает яркие периодичные вспышки, тем самым «подсвечивая» лицо изнутри, и делая его более живым и сияющим.
Выбор средства:
Воспользуйтесь увлажняющим кремом на легкой основе, чтобы подготовить кожу к макияжу. «Подсвечивающее» средство может быть как кремовым (жидкий хайлайтер), так и пудровым (рассыпчатая пудра с мелкими мерцающими частицами, карандаши-стики). Кремовые средства наиболее часто используются для стробинга, так как они создают «влажный» эффект. Однако, если вы являетесь обладательницей жирной кожи – сухие средства станут для вас идеальным вариантом.
Техника нанесения:
Нанесите средство на выпуклые участки лица: носогубную складку и область вокруг глаз, на спинку носа, верхнюю часть скулы и над бровями для того, чтобы визуально «приподнять» лоб. Нанесите небольшое количество средства по центру верхнего века – такой прием позволит делать взгляд открытым и живым. Аккуратно растушуйте средство с помощью кончиков пальцев, кистью, либо спонжем.
Выбор средства:
Для затемнения определенных участков лица выбирайте средство на один-два тона темнее собственного цвета лица, а для высветления – на один-два тона светлее соответственно. Для шейдинга старайтесь выбирать средства с сатиновым, либо матовым финишем.
Техника нанесения:
Чаше всего для шейдинга используют пудру, либо тональную основу с матовым финишем. Используйте более темный оттенок на области под выступающими косточками скул, чтобы визуально уменьшить лицо. Если хотите сделать лицо более овальным – нанесите темный оттенок под мочки ушей. Сделать нос более узким позволит оттенение крыльев носа. Хотите визуально уменьшить широкий лоб – нанесите темный оттенок по линии роста ресниц. Для растушевки используйте кисти для макияжа, желательно с натуральным ворсом. Кремовые средства лучше взаимодействуют с кистями на синтетической основе.
Выбор средства:
В результате бейкинга – кожа лица должна получиться идеально ровной и матовой, поэтому в этой технике жидкие средства практически не используются. Используйте легкую основу под макияж, для того, чтобы подготовить кожу лица. Основными помощниками в создании бейкинга являются консилер, либо тональная основа и рассыпчатая пудра.
Техника нанесения:
Нанесите тональную основу на все лицо и затем плотным слоем нанесите консилер на область под глазами, центр лба, скулы, подбородок, переносицу, растушуйте его и дайте впитаться. С помощью кисти припудрите те зоны, где был нанесен консилер и затем припудрите все лицо. Слегка выделите скулы, переносицу, подбородок и середину лба с помощью хайлайтера. Итог – идеально ровный тон лица!
Cel‑shading: некоторые приёмы, о которых вы могли не знать
В этой статье мы напишем с нуля свой цел-шейдер (также известный как toon-шейдер) для Unity. По ходу дела я расскажу и покажу некоторые приёмы, которые, на мой взгляд, очень полезны, но которыми мало кто пользуется.
Для демонстрации я буду использовать персонажа из своего хобби-проекта. Если вы хотите повторять все шаги из статьи, вам понадобится модель с готовой развёрткой и diffuse-текстурой.
Для тех, кто не очень знаком с понятием цел-шейдинга, определение из Википедии.
Тип нефотореалистичного рендеринга, результатом которого является компьютерное изображение, в некоторой мере имитирующее результат рисования вручную. Cel — сокращение от celluloid (целлулоид — из этого материала делаются прозрачные листы, на которых рисуется традиционная мультипликация). Такой тип рендеринга часто используется для одушевления комиксов, для которых характерны жёсткие контуры, ограниченное число цветов, неплавные переходы светотени.
Итак, ключевые моменты цел-шейдинга:
Сразу оговорюсь, я не буду подробно разжёвывать синтаксис шейдерного языка HLSL и CG, потому что это тема для отдельной статьи, плюс на эту тему уже есть достаточно туториалов и мануалов. Я буду объяснять только то, что касается именно реализации цел-шейдинга.
Есть несколько основных подходов к написанию шейдеров. Некоторые предпочитают за основу брать Surface-шейдер, некоторые — Unlit-шейдер. Я покажу реализацию на основе Unlit-шейдера, который по умолчанию не использует никакую модель освещения. Освещение в цел-шейдинге достаточно простое, по этому мы напишем свою упрощенную модель, чтобы не тратить лишние ресурсы на рассчёт более сложного освещения, которое нам не нужно.
Итак, открываем Unity и создаем Unlit Shader…
При создании шейдера, Unity по умолчанию добавляет туда поддержку тумана. В нашем случае он не нужен, по этому давайте удалим все строки, связанные с туманом, в качестве небольшой оптимизации.
Создаем на основе шейдера материал, назначаем текстуру и применяем материал к нашей модели.
Туториал по Unreal Engine: Cel Shading
Благодаря физически точному рендерингу в Unreal Engine 4 удобно разрабатывать реалистичные игры. Модель рендеринга имитирует взаимодействие света с материалами, что приводит к созданию реалистичной картинки. Однако если вы хотите разработать игру со стилизованным внешним видом, то вам придётся исследовать другие техники.
Один из способов создания стилизации — использование cel shading (также известного как toon-шейдинг). Эта техника подражает затенению, обычно используемому в мультфильмах и аниме. Примеры её использования можно увидеть в таких играх, как Jet Set Radio, The Legend of Zelda: The Wind Waker и Gravity Rush.
В этом туториале вы научитесь следующему:
Примечание: В этом туториале подразумевается, что вы уже знакомы с основами Unreal Engine. Если вы новичок в Unreal Engine, то вам стоит изучить сначала туториал из десяти частей Unreal Engine для начинающих.
Приступаем к работе
Скачайте заготовку проекта и распакуйте её. Перейдите в папку проекта и откройте CelShader.uproject. Вы увидите следующую сцену:
Это персонаж, к которому мы будем применять cel shading. Прежде чем приступать, нужно разобраться, что же такое cel shading.
Что такое Cel Shading?
Cel shading — это процесс рендеринга с помощью нескольких полос цвета, а не непрерывного градиента.
Ниже представлен пример использования cel shading в The Legend of Zelda: Breath of the Wild. Заметьте, что cel shading реализован только для персонажа, а фон остался обычным.
На этом изображении есть три полосы: одна для теней, одна для средних тонов, и ещё одна для светлых участков.
Часто ошибочно считается, что cel shading применён, если у объектов есть контуры. Примером этого может служить Borderlands. Хотя эта игра имеет стилизованный внешний вид, на самом деле в ней нет cel shading. Это можно увидеть на изображении ниже. Заметьте, что в расцветке персонажа не используются полосы цвета.
Контуры не являются cel shading, но их часто используют совместно. Благодаря этому картинка становится похожей на нарисованную краской или тушью. Такой приём часто используется в играх с аниме-стилистикой, таких как Guilty Gear Xrd и Dragon Ball FighterZ.
В следующем разделе мы узнаем, как реализовать cel shading.
Способ реализации Cel Shading
Ограничение этого способа заключается в том, что на объекты с cel-шейдингом не могут влиять другие источники освещения. Кроме того, объекты не могут отбрасывать тени на объекты с cel-шейдингом.
Чтобы решить эту проблему, мы должны использовать другой способ. Вместо вычисления скалярного произведения мы будем вычислять освещённость поверхности. Затем при задании пороговых значений можно будет использовать это значение вместо скалярного произведения.
Теперь, когда вы знаете, что такое cel-шейдер и как он работает, настало время его создать.
Создание Cel-шейдера
В этом туториале cel shading будет эффектом постобработки. Постобработка (Post processing) позволяет изменять изображение после того, как движок закончит его рендеринг. Постобработку обычно используют для таких эффектов, как глубина резкости, motion blur и bloom.
Для создания собственного эффекта постобработки нам нужно воспользоваться материалом постобработки (post process material). Перейдите в папку Materials и создайте новый Material. Переименуйте его в PP_CelShader и откройте.
Чтобы преобразовать материал в материал постобработки, нужно изменить его домен (domain). Перейдите в панель Details и измените Material Domain на Post Process.
Первый шаг в создании cel-шейдера — вычисление освещённости каждого пикселя. Мы назовём это буфером освещения (lighting buffer).
Вычисление буфера освещения
Когда Unreal рендерит изображение на экран, то сохраняет проходы в буферы. Для вычисления буфера освещения нам нужно будет получить доступ к двум таким буферам:
Для доступа к этим буферам нужно использовать нод SceneTexture. Создайте его, выберите и перейдите в панель Details. Чтобы получить доступ к буферу Post Process Input, измените Scene Texture Id на PostProcessInput0.
Для доступа к Diffuse Color создайте ещё один нод SceneTexture. Измените его Scene Texture Id на DiffuseColor.
Буфер освещения должен содержать только значения в градациях серого (описывающие степени освещённости пикселей). Это значит, что нам не потребуется информация о цвете из обоих буферов. Чтобы отбросить цвета, соедините выход Color обоих нодов SceneTexture с Desaturation. Это полностью обесцветит оба буфера.
Для вычисления буфера освещения просто разделим SceneTexture:PostProcessInput0 на SceneTexture:DiffuseColor. Порядок здесь важен!
Затем используем Clamp, чтобы значения оставались в интервале от 0 до 1. Это упростит создание порогов, потому что мы будем знать возможные значения.
Вот визуализация буфера освещения:
Как вы видите, освещённые области ближе к белому, а неосвещённые — к чёрному.
Затем мы используем буфер освещения для создания порога.
Создание порога
В нашем cel-шейдере любой пиксель со значением больше 0,5 будет использовать обычный диффузный цвет. Пиксели со значениями меньше 0,5 будут использовать диффузный цвет половинной яркости.
Для начала создадим нод If. Он позволит нам сравнивать два значения. В зависимости от результатов сравнения мы сможем указывать разные выходы.
Далее соединим Clamp со входом A. Затем создадим Constant со значением 0.5 и соединим её со входом B.
Примечание: для изменения порога можно менять значение входа B.
Чтобы получить цвета, создадим SceneTexture и зададим для его Scene Texture Id значение Diffuse Color. Затем умножим Color на 0.5, чтобы получить диффузный цвет половинной яркости.
И наконец, соединим всё следующим образом:
Использование материалов постобработки
Чтобы использовать материалы постобработки, нам нужно создать Post Process Volume. Он обычно используется для управления такими эффектами постобработки, как баланс белого, насыщенность и контрастность.
Нажмите на Apply и вернитесь в основной редактор. Для создания Post Process Volume перейдите в панель Modes и выберите категорию Volumes. Затем перетащите Post Process Volume во Viewport, чтобы создать его.
Теперь нам нужно сказать Post Process Volume, чтобы он использовал cel-шейдер. Выбрав Post Process Volume, перейдите в панель Details. Затем найдите Rendering Features\Post Process Materials и нажмите на значок +. Так вы добавите в массив новый элемент.
Затем нажмите на раскрывающийся список Choose и выберите Asset Reference.
Это позволит выбрать материал. Нажмите на раскрывающийся список None и выберите PP_CelShader.
По умолчанию Post Process Volume воздействует только тогда, когда мы находимся внутри. Однако в нашем случае нужно, чтобы он влиял на весь мир. Для этого прокрутите до Post Process Volume Settings и включите Infinite Extent (Unbound).
Теперь, когда cel-шейдер применён ко всей игре, мы увидим следующее:
«Постойте-ка, это не похоже на тот cel-шейдер, который вы показывали раньше!»
Главная причина такого отличия в том, что движок применяет cel-шейдер после тональной компрессии. Чтобы исправить это, нам нужно попросить движок использовать cel-шейдер перед тональной компрессией.
Применение Cel Shading перед тональной компрессией
Прежде чем показать изображение игроку, Unreal выполняет процесс, известный как «тональная компрессия» (tonemapping). Одна из целей тональной компрессии — сделать изображение более естественным. Она берёт входной цвет, а затем использует кривую, чтобы сдвинуть его в новое значение.
Вот два изображения, до и после тональной компрессии:
Как вы видите, светлые участки до тональной компрессии слишком яркие. Однако после тональной компрессии яркие области становятся более мягкими.
Хотя тональная компрессия полезна для изображений, которые нужно отображать, мы не должны выполнять тональную компрессию для изображений, которые хотим использовать в вычислениях. Из-за смещения значений мы будем использовать не те значения, которые ожидаем.
Откройте PP_CelShader и убедитесь, что ничего не выбрано. Затем зайдите в панель и найдите раздел Post Process Material. Задайте Blendable Location значение Before Tonemapping.
Нажмите на Apply, а затем вернитесь в основной редактор. Цвета теперь выглядят гораздо лучше!
В следующем разделе мы научимся тому, как применять cel shading только к отдельным объектам.
Изолирование Cel Shader
Чтобы изолировать эффекты постобработки, нам нужно использовать функцию под названием Custom Depth. Как и Post Process Input с Diffuse Color, это тоже буфер, который можно использовать в материалах постобработки.
Прежде чем понять, что такое Custom Depth, вам нужно разобраться с буфером Scene Depth. Scene Depth хранит отдалённость каждого пикселя от камеры. Вот как выглядит визуализация Scene Depth:
Custom Depth хранит ту же информацию, но только для выбранных вами мешей. Вот его визуализация с викингом, отрендеренным в Custom Depth:
Сравнивая Scene Depth с Custom Depth, мы можем изолировать объекты. Если Scene Depth меньше, чем Custom Depth, то мы используем обычное изображение. Если Scene Depth больше Custom Depth, то используется изображение с cel-шейдингом.
Первый шаг — рендеринг викинга в Custom Depth.
Использование Custom Depth
Перейдите в World Outliner и выберите SK_Viking. Затем перейдите в панель Details и найдите раздел Rendering. Затем включите Render CustomDepth Pass.
Далее нам нужно выполнить сравнение глубин. Откройте PP_CelShader и создайте следующую схему:
Примечание: ноды Mask ( R ) являются масками компонентов (Component Mask). Они позволяют преобразовывать многоканальные данные в скалярные значения. Наложить маску на Scene Depth и Custom Depth нам нужно потому, что нод If для входов A и B принимает только скалярные значения.
Затем соедините выход сети cel shading с A > B. Наконец, соедините выход только что созданного If с Emissive Color.
Теперь cel shading будет применяться только к мешам, отрендеренным в Custom Depth.
Нажмите на Apply, а затем вернитесь в основной редактор. Вы увидите, что cel shading теперь выполняется только для викинга.
Сel-шейдер работает замечательно, но он довольно прост. Что, если нам понадобится большее количество полос? Что, если мы захотим создать более плавные переходы между полосами? Всё это можно реализовать с помощью таблиц поиска (lookup tables) (LUT).
Что такое «таблица поиска»?
В детстве мы учились тому, что такое умножение. Однако юный мозг не всегда мог выполнять такие вычисления. Поэтому вместо расчётов вы могли пользоваться таблицей умножения для «поиска» ответов.
По сути, это и есть LUT. Это массив значений (обычно предварительно вычисленных), к которым можно получить доступ с помощью входных данных. В случае таблицы умножения входными данными являлись множитель и множимое.
В контексте нашего cel-шейдера LUT — это текстура с неким градиентом. Вот четыре примера того, как может выглядеть LUT:
Пока мы вычисляем цвет тени, умножая диффузный цвет на 0,5. Вместо умножения на постоянную 0,5 мы будем использовать значение из LUT. Благодаря этому мы можем управлять количеством полос и их переходами. Понять, как будет выглядеть затенение, можно по внешнему виду LUT.
Прежде чем использовать LUT, нужно изменить некоторые из её параметров текстуры.
Изменение параметров LUT
Перейдите в папку Textures и откройте T_Lut_01. Вот, как выглядит LUT:
Первый параметр, который нам нужно изменить — это sRGB. При рендеринге Unreal преобразует все текстуры со включенным sRGB в линейный цвет. Это упрощает движку выполнение вычислений рендеринга.
Параметр sRGB полезен для текстур, описывающих внешний вид. Однако текстуры наподобие карт нормалей и LUT содержат данные, предназначенные для математических вычислений. Поэтому Unreal должен считать их значения уже верными. Если отключить sRGB, то Unreal не будет выполнять преобразование в линейный цвет.
Для этого снимите флажок sRGB. Этот параметр находится в разделе Texture.
Следующий параметр, который нам нужно изменить — способ тайлинга текстуры. Поскольку мы не будем отображать эту текстуру, то тайлинг ей не нужен. Более того, если оставить тайлинг включённым, то это добавит проблем при сэмплировании на краях текстуры. Например, если мы будем сэмплировать пиксель с левого края, то из-за тайлинга он попытается смешаться с правым краем.
Для отключения тайлинга измените значение X-axis Tiling Method на Clamp. Тоже самое сделайте для Y-axis Tiling Method.
И на этом мы закончили с параметрами. Теперь нам нужно использовать LUT в материале постобработки.
Использование LUT
Закройте T_Lut_01 и откройте PP_CelShader. Сначала удалите выделенные ноды:
Затем создайте Texture Sample и измените его Texture на T_Lut_01. Эта таблица LUT будет создавать три полосы с плавным переходом.
Как мы помним, для определения значений, которые нужно выводить, LUT используют входные данные. В нашем случае в качестве входных данных будет использоваться буфер освещения.
Чтобы реализовать это, соедините Clamp с UVs в Texture Sample.
Это работает, потому что значения буфера освещения и координаты текстуры находятся в интервале от 0 и 1. Например, если пиксель из буфера освещения равен 0,5, то LUT подаст на выход значение пикселя из середины текстуры.
Далее нам нужно умножить диффузный цвет на LUT. Для этого воссоздайте следующую схему:
Мы используем Append для преобразования вывода Texture Sample’s в четырёхканальный вектор. Это нужно нам, потому что мы не можем умножать трёхканальный вектор на четырёхканальный (SceneTexture).
Наконец, соединим всё следующим образом:
Теперь вместо умножения диффузного цвета на константу мы умножаем его на значение из LUT. Так мы контролируем количество полос цвета и их переходы (зависящие от LUT). Выводимое значение LUT определяется буфером освещения.
Нажмите на Apply, а затем закройте PP_CelShader. Теперь затенение будет иметь три полосы с более плавными переходами между полосами.
Ниже представлено сравнение того, как могут выглядеть различные LUT. Эти LUT тоже добавлены в проект.
Куда двигаться дальше?
Готовый проект можно скачать отсюда.
Как вы видите, материалы постобработки — очень мощный инструмент. Они позволяют создавать множество реалистичных и стилизованных эффектов. Если вы хотите больше узнать о постобработке, то изучите документацию по постобработке UE.















































