Существует множество способов создания и применения карт нормалей. Давайте рассмотрим известные мне способы их изготовления.
Не существует единственного правильного решения для каждой ситуации, я лично пользуюсь несколькими техниками, в зависимости от проекта, количества времени, требуемой производительности и т.д., и чаще всего они взаимозаменяемы. Я попытаюсь объяснить достоинства и недостатки каждого способа, но во многих случаях они будут очень схожими.
Предыдущие части:
Это норма: что такое карты нормалей и как они работают
Это норма — 2: как запекаются карты нормалей
Это норма — 3: типы карт нормалей
Это норма — 4: решение проблем с картами нормалей
Совершенно гладкие lowpoly
При таком способе все нормали низкополигональной модели усредняются: все рёбра считаются плавными или имеют одну группу сглаживания (smoothing group).
Это означает, что всю работу должна выполнять карта нормалей. Lowpoly-модель обычно сильно отличается от highpoly-модели, пока не будут наложены карты нормалей.
Основное преимущество этого способа — он очень прост для художников: не нужно заниматься разделением UV-островов, настраивать плавность модели или модифицировать нормали lowpoly. Достаточно создать lowpoly и highpoly, сгладить lowpoly и нажать на кнопку «Запечь».
Однако такой подход имеет некоторые недостатки:
- Важно правильно настроить касательное пространство (tangent space). Так как мы сильно зависим от карты нормалей, малейшие изменения в её настройке будут при таком способе особенно заметны. В целом, нужно сделать так, чтобы в качестве касательного пространства программы 3d-моделирования, запекания и рендеринга использовали Mikkts, и чтобы все модели экспортировались и импортировались соответствующим образом.
- Так как карта нормалей должна сильно сгибать нормали, карта нормалей, скорее всего, будет более разноцветной и иметь множество градиентов. То есть размер карты нормалей будет чуть больше, и с большей вероятностью будет содержать артефакты сжатия. Чтобы компенсировать это, при использовании данного метода обычно увеличивают разрешение карты нормалей или уменьшают степень её сжатия. Для игр на PC это не сильно снижает производительность, но для мобильных игр с большим количеством карт нормалей это может быть заметно.
- Если убрать карту нормалей модели, то обычно из-за этого она выглядит плохо (особенно если имеет множество острых рёбер).
- Добавление деталей карт нормалей текстурам (например, в Photoshop) может быть затруднено.
- Нормали lowpoly с большей вероятностью будут сгибаться и не совпадать с поверхностью highpoly, и выше вероятность появления искажённых деталей.
Этот способ я предпочитаю при работе над органическими моделями, потому что они обычно выглядят лучше при полном сглаживании, а над картой нормалей не приходится работать долго (так как поверхность органической модели обычно плавная и похожа на сглаженную lowpoly).
Модели с острыми рёбрами (с настроенными smoothing groups/hard edges)
При такой методике мы разделяем нормали некоторых вершин, задавая группы сглаживания или выбирая резкие рёбра. Некоторые люди любят настраивать остроту рёбер при помощи угла (обычно 30, 45 и 60º), но я предпочитаю задавать их вручную (параллельно думая о том, где будут находиться швы UV-развёртки).
Помните, что когда в модели есть острое ребро, UV должна быть разделена, чтобы избежать видимых линий вдоль рёбер на карте нормалей.
Недостатки:
- Обычно этот метод требует чуть больше работы, чем первый.
- Необходимо разделять UV в местах острых рёбер, чтобы избежать видимых линий вдоль этих рёбер, что может усложнить работу с некоторыми UV-островами (например, при ручном рисовании части модели, имеющей разделённые UV, могут появиться нежелательные швы). К счастью, в таких программах, как Substance Painter, Mari и 3D Coat, есть решения этой проблемы.
- Задание острых рёбер и разделение UV немного увеличивает количество вершин, однако обычно незначительно.
При таком способе мы не так сильно полагаемся на карту нормалей в управлении затенением модели, поэтому можем, например, удалить карту нормалей далёкого от камеры объекта, и он всё равно будет выглядеть прилично (показанный выше пример не самый лучший, но это может подойти для других моделей); или же можно использовать более мелкие или сжатые карты нормалей.
На плоских поверхностях мы можем использовать острые рёбра для привязки нормалей lowpoly к твердотельной (hard surface) модели. Если поверхности lowpoly и highpoly полностью совпадают (т.е. они обе плоские), то карта нормалей в этой области будет плоской, благодаря чему можно без проблем добавлять и удалять детали карты нормалей на текстуре.
Лично я использую этот метод чаще всего (потому что мне кажется, что у меня больше контроля и вариантов выбора, если что-то будет выглядеть некрасиво); и особенно когда есть жёсткие ограничения. В последнее время я старался не использовать их на некоторых твердотельных моделях, потому что им требуется множество острых рёбер, что увеличивает количество UV-островов и усложняет работу с ними.
Работа с настраиваемыми нормалями (и использование midpoly)
Существуют способы непосредственного изменения нормалей lowpoly-модели, но не во всех 3D-редакторах есть эта возможность и они довольно сильно различаются. Наиболее распространённый способ — использование взвешенных нормалей, благодаря которым программа автоматически переориентирует нормали в сторону более крупных граней. Ещё один способ модификации нормалей заключается в выборе грани и выравнивании нормалей её вершин с нормалью к грани, чтобы все они смотрели в направлении грани.
Важно правильно экспортировать, запекать и импортировать модели с настраиваемыми нормалями. Большинство 3D-движков понимает модели с настраиваемыми нормалями, однако по умолчанию эта опция обычно выключена.
Этот метод породил новый подход к моделированию под названием midpoly. Это скорее метод моделирования, а не текстурирования. В целом его смысл таков, что вместо генерирования деталей при помощи карт нормалей мы генерируем их, напрямую модифицируя нормали lowpoly.
При моделировании твердотельных моделей нам нужны большие гладкие поверхности с плавными переходами между ними (вместо резких рёбер, выглядящих менее реалистично). Мы можем получить схожий результат при помощи настраиваемых нормалей:
Сначала мы добавляем на ребро фаску (bevel), расположенную в месте перехода. Затем мы модифицируем нормали получившихся вершин так, чтобы они смотрели в сторону основных граней. При этом нормали lowpoly будут направлены к более крупным граням, а переход направлений нормалей будет ограничен ребром с фаской.
Настроив свою midpoly, мы можем комбинировать её с картами нормалей для удобного добавления деталей на плоских поверхностях. В зонах с фасками нормали сильно растягиваются, поэтому работа с картами нормалей в этих зонах вызывает сложности.
Вот сравнение трёх описанных в статье методов:
Другие методики и эксперименты
Существует ещё несколько методик, которые можно использовать для создания/применения карт нормалей. Я не буду в них углубляться, потому что сегодня они не так широко применяются, как описанные в статье, и я не особо с ними знаком.
- Пиксель-арт с картами нормалей: мы можем добавлять информацию о нормалях спрайтам пиксель-арта и освещать их, чтобы создать ощущение объёма. По сути, мы говорим каждому пикселю, куда он направлен, чтобы при попадании на него света он реагировал иначе, чем пиксели, направленные с другие стороны.
Я нашёл три способа реализации этой методики:
- Использование специальной программы, которая приблизительно преобразует цветовую информацию в ориентацию нормалей, например, такой.
- Создание версий спрайта в градациях серого, освещённого с разных сторон, и их использование для создания карты нормалей. Как мы знаем из второй части моей серии статей, карту нормалей можно считать сочетанием трёх изображений: освещённая слева модель хранится в красном канале, освещённая снизу/сверху — в зелёном канале, а освещённая спереди — в синем канале. То есть мы можем отрисовать спрайт, освещённый снизу/сверху, слева и спереди, и скомбинировать карту нормалей, используя эти изображения как её каналы, например, как в этой программе.
- Создание карты высот и применение программы, преобразующей её информацию в карту нормалей: похоже на предыдущую методику, но гораздо быстрее, потому что нам нужно создать только одну дополнительную текстуру вместо трёх.
- Рисованные вручную карты нормалей. Специально для тех, кто играет в Dark Souls и думает: слишком просто, надо пройти её вслепую. Такие методики обычно слишком медленны для применения в продакшене, и чаще всего лучше просто скульптить из плоскости Zbrush и экспортировать в карту нормалей. Вот некоторые из способов:
- Создание карты высот и использование специальной программы для преобразования её информации в карту нормалей (как и в примере с пиксель-артом). Вероятно, самый быстрый и более удобный способ создания карты нормалей по сравнению с рисованием вручную.
- По референсу сферы: при помощи сферы с картой нормали в качестве «палитры» мы можем сопоставить угол поверхности с соответствующим цветом на сфере.
- Использование специальных кистей: В Krita есть специальная кисть, преобразующая наклон карандаша в информацию карт нормалей.
- Композитинг карт нормалей при помощи текстур: используя библиотеку текстур карт нормалей, мы можем комбинировать их, чтобы добавлять детали в карты нормалей. Эти детали можно комбинировать вместе. Не забывайте, что смешивание карт нормалей — не такой простой процесс, как можно подумать.
- Фильтры изображений: некоторые программы могут аппроксимировать информацию карт нормалей на основе карт diffuse/albedo/basecolor. Обычно они неточны, но могут подойти для фоновых или мелких моделей.
- Matcaps: «маткапы» (Matcaps) — это упрощённые шейдеры, определяющие цвет пикселей на экране на основании направлений нормалей геометрии. Можно применить маткап к любой геометрии и отрендерить изображение, чтобы быстро сгенерировать текстуры карт нормалей. Это легко сделать в Zbrush для генерации повторяющихся текстур.
- Карты нормалей деталей: в некоторых случаях можно дополнять сгенерированную из highpoly карту нормалей новыми деталями (например, можно скомбинировать карту нормалей скульпта головы с текстурами пор кожи), и загружать эту дополнительную карту нормалей только на определённом расстоянии, чтобы снизить потребление памяти, сохраняя при этом детализацию вблизи.