Запекание карты нормалей из материала в Cycles

18 августа 2017 7 комментариев Артем Слаква Материалы и текстуры


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

Если мы подумаем об этом, это не должно быть достаточно удивительно: поскольку Cycles основан на системе нодов, мы можем создавать материалы с бесконечным числом комбинаций, мы можем даже использовать одну карту нормалей для диффузного шейдера, а другую для глянцевого шейдера. Он обеспечивает полную свободу творчества… но это также означает, что Cycles не может определить, какая часть вашего материала связана с вычислением нормалей. Таким образом, инструмент запекания не имеет другого выбора, кроме как полностью игнорировать эффекты, созданные вашим материалом, когда вы выбираете тип запекания Normal.

Слишком большая свобода приводит к разочарованию! На самом деле, запекание нормалей, включая эффекты материала действительно полезны по крайней мере по двум причинам:

  • Если вы используете карту нормалей (normal map), чтобы получить детали из высокополигональной модели и карту рельефа (bump map), чтобы создать дополнительные детали, вы, вероятно, объедините их в своем материале (речь о Cycles). Но если вы хотите экспортировать свою модель в другой движок рендеринга, то некоторые из них (особенно рендеры реального времени) позволяют использовать либо карту нормалей, либо карту рельефа, но не обе одновременно. Вам не нужно выбирать одну карту или другую…
  • Если вы используете текстуры с высоким разрешением, может быть полезно объединить информацию с карты нормалей, карты рельефа и процедурных текстур в единую карту нормалей, чтобы уменьшить объем памяти и упростить ваш материал.
Нод Material Output имеет вход Displacement. Если вы используете данный слот в своем материале, то он деактивирует все другие слоты Normal для всех нодов. Но, поскольку это также явно указывает Cycles на то, как ваш материал влияет на геометрию объекта, тогда эффект смещения будет включен в процесс запекания.

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

Если вы просто хотите использовать normal to map, вы можете загрузить blend-файл. Файл содержит очень простой пример и саму группу нодов. Этот файл лицензируется под CC0 1.0 Universal, поэтому вы можете свободно использовать эту группу для своих собственных целей.

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

Как использовать группу normal to map

Группа normal to map предназначена для запекания информации о нормалях вашего материала в карту нормалей. Поэтому вы должны добавить ее непосредственно перед процессом запекания и затем удалить из своего материала.
bake-normal-1
Входной слот Normal соответсвует тому же входу, что и у стандартных BSDF-шейдеров, и он является нормалью, которую вы хотите запечь. Есть два выходных слота: цвет sRGB и Non-color. Вы должны использовать тот же выход, что и цветовое пространство текстуры, которую вы запекли. По умолчанию Blender создает текстуру в цветовом пространстве sRGB.

Я рекомендую вам использовать формат Non-Color: требуется меньше вычислений (не применяется гамма-коррекция), поэтому вы избежите некоторых проблем округления при расчетах. Вы можете изменить цветовое пространство вашей текстуры на панели свойств в редакторе UV/Image.
bake-normal-2

Для людей, использующих управление цветом Filmic Blender, sRGB помечен как sRGB EOTF, а Non-color как Non-Color Data.

Пошаговая инструкция использования группы normal to map:

  1. Добавьте группу «normal to map» к вашему материалу.
  2. Подключите вектор нормали который вы хотите запекать к входу Normal.
  3. Подключите выбранный выходной слот к шейдеру Emission.
  4. В редакторе UV/Image создайте новое изображение.
  5. На панели свойств в редакторе UV/Image выберите то же цветовое пространство, что и у выходного сокета.
  6. Добавьте нод Image Texture и укажите в нем только что созданное изображение (данный нод должен быть выделенным(активным)).
  7. В меню запекание выберите тип Emit.
  8. Нажмиет кнопку Bake.

bake-normal-3
Группа создает соответствующие цвета для представления информации о нормалях. Поэтому вы должны использовать шейдер Emission, как если бы объект излучал информацию о них. Поскольку чистый шейдер Emission не подвержен влиянию светлячков и отскокам света, вы можете использовать всего-лишь один сэмпл для рендеринга. Это означает, что процесс запекания экстримально быстрый!

Улучшение производительности

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

bake-normal-4lbake-normal-4r

В таблице ниже приведены некоторые данные о визуализации:

Материал Время рендеринга Пик используемой памяти
Оригинальный материал 16:03 1371 Mб
Запеченная карта нормалей 13:55 350 Mб

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

Известные проблемы

Из-за внутренних вычислений вы можете получить незначительные изменения между исходными нормалями, и вычисленными с помощью группы нодов Normal to map. Поскольку эти отличия минимальны, они совершенно незаметны.

Группа Normal to map сильно зависит от вращения и масштаба вашей модели. Не забудьте применить эти преобразования перед запеканием.

Самая раздражающая проблема исходит не от самой группы, а от процесса запекания. Если вы внимательно посмотрите на два изображения выше, они покажутся вам идентичными… но это не так! Если вы откроете эти изображения на отдельных вкладках при 100%-ом разрешении и будете переключаться между ними, вы заметите странный эффект: некоторые детали, похоже, скользят по поверхности! Посмотрите на гифку ниже, чтобы увидеть этот эффект:
bake-normal-5
Мне потребовался день, чтобы убедиться в том, что этот эффект не был создан группой Normal to map! На самом деле проблема связана с трансформацией карты рельефа в карту нормалей. Если обобщить, карта рельефа хранит информацию о высоте, в то время как карта нормалей сохраняет изменение высоты. Это означает, что если текстура содержит три пикселя для отображения карты рельефа, каждый пиксель представляет собой разную высоту. Для достижения такого же результата с помощью карты нормалей текстура должна содержать не менее двух пикселей для кодирования изменения высоты. Из-за этого мы и получаем небольшой сдвиг между картой рельефа и картой нормалей.
bake-normal-6
Поэтому, когда мы хотим преобразовать информацию о карте рельефа в информацию о карте нормалей, мы получаем смещение информации на финальной текстуре. Один из способов избежать этого — использовать текстуру с более высоким разрешением для окончательного запекания. Но это не всегда желательно.

Поэтому, если вы планируете использовать группу Normal to map, держите в голове этот нюанс, особенно если вы создаете рендер модели крупным планом.

Как работает группа Normal to map

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

Очевидно, что карта номралей не имеет ничего общего с цветом! Текстура нормалей — это изображение, и мы можем открыть его в редакторе изображений. Но это не изображение, потому что каждый пиксель (или, точнее, каждый тексель) не является цветовой информацией: это информация о нормалях.

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

Текстура нормалей содержит направления нормалей, учитывая исходные их направления (0,0,1). Это означает, что координаты должны быть в касательном пространстве. И в этом суть: Cycles представляет информацию о нормалях в мировом пространстве. Чтобы запечь карту нормалей, нам нужно преобразовать вектора нормалей из мирового пространства в касательное пространство. Итак, мы должны выполнить следующую операцию:

Nts = MNws

Где Nws — вектор нормали в мировом пространстве (тот, который создается материалом), M — матрица преобразований из мирового пространства в касательное пространство, а Nts — вектор нормали в касательном пространстве (тот, который мы хотим получить). Матрица трансформации M представляет собой матрицу 3×3, составленную в линию касательным вектором, бикасательным вектором и исходным вектором нрмали грани:
fx1
Cycles обеспечивает нас касательным вектором и вектором нормали для текущей грани. Мы можем легко вычислить бикасательным вектор как перекрестное произведение вектора нормали и касательного вектора. Однако Cycles не поддерживает матричные операции, но мы можем легко разложить эти операции:
fx2
И создать набор нодов для выполнения вычислений:
bake-normal-7
Все это могло бы быть намного проще, если бы нод Vector Transform работал с касательным пространством… может быть интересным улучшением в будущем.

Затем мы должны закодировать векторные координаты в значения цвета, чтобы создать окончательную текстуру нормалей. Поскольку вектор нормали является единичным вектором x, y и z, координаты находятся в диапазоне от -1 до 1. Мы должны преобразовать эти координаты в значения цвета между 0 и 1. Нод Vector Curves может сделать эту математику для нас.
bake-normal-8
Наконец, цветовое пространство sRGB означает, что Blender будет применять гамма-коррекцию 1/2.2, поскольку форматы файлов с глубиной цвета 8 бит на канал (PNG, JPEG…) должны предварительно кодировать значения цвета, подобные этому. Но поскольку текстура нормалей не содержит значений цвета, а состоит из векторных координат, мы должны предотвратить это, применяя обратную гамма-коррекцию 2.2. Использование нецветного пространства (non color space) для запекания текстуры прямолинейно, потому что мы сообщаем Blender, что хотим использовать линейное цветовое пространство (гамма-коррекция не требуется).

источник урока

О сайте

На данном сайте Вы сможете найти множество уроков и материалов по графическому
редактору Blender.

Контакты

Для связи с администрацией сайта Вы можете воспользоваться следующими контактами:

Email:
info@blender3d.com.ua

Следите за нами

Подписывайтесь на наши страницы в социальных сетях.

На сайте Blender3D собрано огромное количество уроков по программе трехмерного моделирования Blender. Обучающие материалы представлены как в формате видеоуроков, так и в текстовом виде. Здесь затронуты все аспекты, связанные с Blender, начиная от моделирования и заканчивая созданием игр с применением языка программирования Python.

Помимо уроков по Blender, Вы сможете найти готовые 3D-модели, материалы и архивы высококачественных текстур. Сайт регулярно пополняется новым контентом и следит за развитием Blender.