301. Запекание нормалей: То, про что все стесняются говорить

Запекание нормалей это камень преткновения практически для всех начинающих (и не очень) 3D-художников. Как правило, все сначала отправляются читать 4-х страничный  манускрипт про нормали на render.ru, в котором много воды, а многие рецепты уже устарели. Сравнительно недавно Leonardo Lezzi сделал небольшую и очень полезную памятку “No More Wrong Normal Maps”, которая описывает основные аспекты запекания нормалей.

Мы разберём  запекание нормалей на примере Substanсe Painter и возможные проблемы. Но об этом позднее. Давайте сначала тезисно разберём теорию.

Геометрия Hi-Poly и Low-Poly моделей

1. Запекаемые детали на Hi-poly не должны иметь поверхностей, расположенных перпендикулярно плоскости запекания. Такие поверхности станут невидимыми при запекании. Чтобы этого избежать, необходимо делать пологий угол наклона поверхности. Пример:

На верхней картинке представлен случай, когда детализация на объекте имеет большое количество поверхностей, расположенных перпендикулярно плоскости запекания (другими словами – весь рельеф выполнен под 90 градусов к low-poly модели). При запекании такой модели мы получим.. равномерную, чистую карту нормалей. Почему так происходит? Из каждой точки поверхности Low-poly модели испускаются лучи (в положительную и отрицательную сторону от нормали поверхности), и то, что они встречают на своём пути и будет перенесено на карту нормалей. Как не сложно догадаться, лучи будут проходить вскользь поверхностей, расположенных под 90 градусов к поверхности запекания. Они не пересекаются с лучами.

Именно по этой причине делают скосы на болтах, выемках и прочем рельефе (нижняя картинка).

Практический пример:

2. Геометрия Low-Poly и Hi-Poly не должны сильно отличаться. Стоит избегать моментов, когда заметная часть Low-Poly модели находится в пустоте. На таких местах будут возникать артефакты. Особенно это заметно на острых углах. Чтобы этого избежать, добавляйте дополнительную геометрию на Low-Poly модели, приближая её по силуэту к Hi-Poly. Пример:

3. По каждой острой грани (sharp edges) должен проходить шов развёртки (seam edges). Соответсвенно, каждый остров развёртки должен должен находится в пределах одной группы сглаживания (не должно быть острых граней, проходящих через остров).

Этого можно достичь следующим способом:

  • Настраиваются все острые грани на объекте
  • Все острые грани помечаются как швы
  • Затем добавляются, при необходимости, дополнительные швы, чтобы получить корректную развёртку

 

Развёртка

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

2. Выдерживайте расстояние между островами развёртки, чтобы избежать артефактов на швах развёртки. Рекомендуемые значения расстояний между островами (margin/padding) для Unity в зависимости от размера текстуры:

  • 256 px – 2px
  • 512 px – 4px
  • 1024 px – 8px
  • 2048 px – 8 px
  • 4096 px – 16 px

3. Если у вас на развёртке есть наложенные друг на друга острова, то сдвиньте их на 1 UDIM за пределы UV-пространства, оставив на развёртке только одну “копию” острова. Острова, находящиеся за пределами развёртки не будут участвовать в запекании и их можно будет легко вернуть на место после запекания. Примечательно, что в Substance Painter на сдвинутые на 1 UDIM острова будет корректно накладываться текстура, но по этим островам нельзя рисовать.

Алгоритмы запекания

1. Average Normals – при запекании нормали поверхности усредняются, что позволяет качественно запечь фаски с Hi-poly модели. При это планарные детали (объекты на Hi-poly, находящиеся на поверхности) начинают смещаться и деформироваться. Длина проникновения лучей при запекании регулируется константным значение (причём некоторые программы позволяют задавать разное значение для лучей, исходящих в положительном и отрицательном направлении от нормалей).

2. Cage – запекание с дополнительной моделью-клеткой (cage), которая ограничивает собой длину лучей при запекании, а не значением, как при запекании Average Normals. Результаты запекания аналогичны Average Normals – хорошие фаски, плохие планарные детали.

Результат запекания аналогичен Average Normals

3. Planar/Offset – запекание планарных деталей. При запекании лучи испускаются по направлению нормалей (перпендикулярно плоскости полигонов), длина лучей регулируется константным значением. Позволяет качественно запечь планарные детали, но не печёт фаски.

Как качественно запечь и фаски и планарные детали?

Как говорилось выше, фаски хорошо запекаются при использовании средних нормалей (average normals) или cage, а планарные детали необходимо печь без этих опций (Planar/Offset). Отсюда следует, чтобы получить качественную карту нормалей по всей модели, необходимо скомбинировать две карты, запечённые разными алгоритмами. Как это сделать, мы рассмотрим на примере Substance Painter.

1. Добавляем суффикс _Average к названию Texture Set’а. Это позволит нам запечь несколько вариантов карт без перезаписи.

2. Оставляем при запекании только Normal с флагом “Average Normals”. Остальные параметры настраиваются по ситуации.

3. Убираем суффикс _Average в названии Texture Set’а.

4. Запекаем все карты без флага “Average Normals”.

5. В “Texture Set Settings” выставляем Normal mixing “Replace”.

6. Создаём два слоя заливки (Fill Layer) для карт нормалей.

7. На слое Normals_Average отключаем все каналы, кроме “Normal” и назначаем Normal Map’у, запечённую по средним нормалям (с суффиксом _Average).

8. На слое Normals_Planar отключаем все каналы, кроме “Normal” и назначаем Normal Map’у, запечённую БЕЗ средних нормалей.

9. Добавляем на эти слои маски.

10. Добавляем на маску слоя Normals_Average “Paint” и “Anchor Point

11. На маске слоя Normals_Planar добавляем “Fill”.

12. У “Fill” указываем в “Grayscale” источник “Anchor Points/Normal_Average mask” и в уровнях нажимаем кнопку “Invert”.

13. Теперь при рисовании в “Paint” маски слоя Normal_Average чёрным цветом будет проявляться слой Normals_Planar. Для удобства контроля можно временно включить канал “Color” в слое Normals_Planar и задать любой контрастный цвет.

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

Вернуться к энциклопедии