Это вторая часть серии туториалов о картах нормалей. Первая часть находится здесь, но для понимания второй части читать её не обязательно.
Общий принцип запекания карты нормалей относительно прост: у нас есть lowpoly-модель с UV-координатами и highpoly-модель; мы переносим информацию о нормалях с highpoly на lowpoly. Благодаря этому lowpoly будет отражать свет так же, как highpoly.
Во время этого процесса программа запекания по сути испускает лучи из lowpoly, следуя по нормалям вершин и ища higpoly. Это самый важный аспект создания карт нормалей, и бОльшая часть проблем, возникающих при работе с картами нормалей, связан с ним.
Если вы не контролируете нормали вершин lowpoly-модели, то потеряете контроль над картой нормалей.
Плохая корреляция карт нормалей
Чтобы контролировать сглаживание lowpoly-модели, нам нужны разделённые (split) нормали вершин (для создания жёстких рёбер) или усреднённые (averaged) нормали вершин (для создания гладких рёбер).
Как оказалось, не все 3D-программы используют для усреднения нормалей вершин одинаковые вычисления. Это значит, что в разных 3D-редакторах lowpoly-модель будет выглядеть иначе, а её нормали вершин будут указывать немного в разных направлениях. Обычно это не представляет большой проблемы, потому что эти отклонения очень малы, но они влияют на внешний вид модели; и эти различия усиливаются при использовании карт нормалей, потому что карты нормалей изменяют нормали lowpoly-модели, которые в разных программах различаются.
Индустрия 3D-графики работает над устранением этой проблемы; недавно появился стандарт под названием Mikk space. Это метод вычисления нормалей вершин, который могут использовать все 3D-приложения, чтобы нормали вершин во всех 3D-программах выглядели одинаково. Однако нужно учесть, что пока его используют не все 3D-приложения.
Ещё один способ снижения этого влияния заключается в том, чтобы не очень сильно полагаться на карты нормалей при запекании. Попробуйте сделать так, чтобы lowpoly-модель больше напоминала highpoly-модель и используйте больше жёстких рёбер на плоских поверхностях. В таком случае карте нормалей не придётся выполнять всю работу и небольшие отклонения станут менее заметными.
Скос деталей карт нормалей
Когда компьютер усредняет направление нормали у нормалей вершин lowpoly-модели, большие изменения в углах поверхности могут «скосить» нормали lowpoly-модели и они больше не будут перпендикулярными поверхности lowpoly.
Так как программа запекания нормалей при поиске деталей highpoly использует направления нормалей lowpoly, то если эти направления будут скошенными, то они будут выглядеть скошенными на карте нормалей:
Это очень распространённая проблема, для которой найдено несколько решений. Идеального решения нет, всё зависит от геометрии.
1. В некоторых 3D-программах запекания существует опция повторного запекания (rebaking) этих частей с временным изменением нормалей lowpoly, чтобы они запекались без скоса. Например, такая опция есть в Marmoset Toolbag. Пользователь Reddit под ником Tanagashi любезно объяснил мне, что некоторые программы наподобие xNormal могут тесселировать lowpoly, чтобы добавить новые вершины и сделать нормали перпендикулярными к поверхности lowpoly, запекать карту нормалей в пространстве объекта, а затем преобразовывать её в касательное пространство на основании исходных нормалей lowpoly. С помощью новой карты нормалей программа может создавать маски для управления тем, где использовать исходную карту нормалей, а где созданную из тесселированной lowpoly-модели.
2. Добавление вершин сделает переход между нормалями вершин менее скошенным, потому что один угол в 90º будет разделён на несколько меньших градусов, делая второй переход менее скошенным. Очевидно, что это увеличивает количество полигонов, и поскольку вы добавляете геометрию, я рекомендую использовать эти дополнения для создания более интересного силуэта модели.
3. Разделение усреднённых нормалей вершин (делая ребро жёстким/используя отдельные smoothing groups): таким образом, каждая вершина будет иметь несколько нормалей, каждая из которых перпендикулярна к поверхности lowpoly. Не забывайте, что когда 3D-программа имеет разделённую нормаль вершины, то она на самом деле создаёт дубликат вершины, увеличивая таким образом количество вершин и немного снижая производительность. Кроме того, как мы увидим позже, жёсткие рёбра создают проблему «чёрных рёбер».
4. Можно изменять нормали моделей, чтобы изгибать нормали lowpoly, чтобы они были перпендикулярными нормалям highpoly. Помните, что не все программы позволяют использовать изменённые нормали (в Zbrush есть только усреднённые нормали, файлы OBJ и устаревшие FBX не содержат специальной информации о нормалях). По сути, существует два способа изменения нормалей:
- Взвешенные нормали (Weighted normals): это автоматический метод, похожий на усреднённые нормали вершин. Идея заключается в том, что при усреднении нормалей вершин не все грани должны иметь одинаковую силу: крупные грани «притягивают» к себе нормали вершин сильнее, чем мелкие грани. Благодаря этому крупные грани, которые обычно важнее, будут иметь более качественное проецирование деталей. Особенно хорошо это работает с highpoly-панелями.
- Собственные нормали (Custom normals): при помощи инструментов из 3D-редактора мы можем изгибать нормали lowpoly. Это относительно новая идея, для реализации которой не существует стандартизированных инструментов. Помните, что изгибание нормалей может создавать очень странное нежелательное затенение в других частях модели, поэтому эта техника обычно комбинируется с фасками (bevels). Некоторые люди называют эту технику «midpoly-моделированием».
Cage/baking distance
По умолчанию, испускаемые с поверхности lowpoly лучи проходят ограниченное расстояние, чтобы lowpoly не получала информацию о нормалях от далёких частей highpoly. Это расстояние обычно называется «frontal/rear distance», потому что лучи могут испускаться по направлению внутрь, наружу, или в обоих направлениях. На рисунке ниже это расстояние показано красным:
Некоторые 3D-приложения (например, 3ds Max) также позволяют использовать «клетку» (cage). Cage — это «копия» lowpoly-модели, которую можно модифицировать таким образом, чтобы она идеально заключала в себе highpoly. Также в некоторых случаях (не всегда) она позволяет нам менять направление лучей, не изменяя при этом исходные нормали вершин lowpoly. Это может помочь получит наилучшие граничные случаи запекания и избежать скосов; однако нужно помнить, что мы запекаем, используя не направление вершин нормалей, но в конечном итоге применим карту нормалей для изменения истинных нормалей lowpoly, поэтому результат может выглядеть странно.
Швы на рёбрах
Как мы видели, если имеется модель с жёсткими рёбрами (некоторые рёбра имеют больше одной smoothing group, или некоторые рёбра помечены как «hard»), то программа запекания разделяет нормаль вершин между двумя гранями. У этой операции есть хорошие и плохие стороны.
Хорошо в ней то, что нормали не усредняются, поэтому присутствует меньше искажений нормалей: нормали вершин полностью перпендикулярны к поверхности lowpoly. Также это может сделать lowpoly более красивой, если у неё есть грани под резкими углами, более подходящими для жёстких рёбер.
Плохо то, что теперь между нормалями существует пробел, и это может означать, что мы можем потерять информацию, если lowpoly имеет пробел в нормалях там, где она не может получить деталей highpoly. Более того, некоторые части проекции lowpoly могут пересекаться и конкурировать за одно UV-пространство. Оба эффекта создают шов вдоль ребра, заметность которого зависит от движка.
Однако этого можно легко избежать при помощи простого трюка: если две грани разделены жёстким ребром, то нужно поместить каждую грань на отдельный UV-остров, оставив между ними пространство. Чтобы снизить влияние проблемы разделённых нормалей, программы запекания пытаются немного дополнительной информации за пределами вершин нормалей, но для этого им требуется на текстуре дополнительное пространство. Если грани, разделённые жёстким ребром, соединены в UV, то для сохранения этой дополнительной информации на текстуре не будет места.
Заключение
Подготовив lowpoly-модель и сделав её как можно ближе к highpoly-модели, я начинаю работать над сглаживанием перед UV. Я задаю сглаживание для lowpoly (если объект органический, то я начинаю с полностью сглаженной модели, если он имеет твёрдую поверхность, то я задаю угол сглаживания в пределах 30-60º и настраиваю сглаживание, пока результат не будет выглядеть хорошо).
Подготовив сглаживание модели, я начинаю работать над UV, разделяя все жёсткие рёбра на отдельные UV-острова (чтобы избежать швов на рёбрах).
Если возникают ошибки со скосами, то я добавляю дополнительные рёбра (обычно я делаю фаски (bevel), чтобы сохранить округлость силуэта). Это срабатывает для большинства моих моделей, но я могу исправлять ошибки со скосами, если использую для запекания Marmoset Toolbag, или применяя собственные/взвешенные нормали.
При наличии ошибок проецирования я изменяю baking distance/cage, модифицирую lopoly/highpoly, чтобы они лучше подходили для запекания, или удаляю карты нормалей на отдельных очень жёстких частях, например, на концах конусов.
Следующая статья будет инструкцией по устранению проблем с запеканием карт нормалей и обсуждением наиболее часто встречающихся проблем и решений.
Автор: PatientZero