Создание карты нормалей в Blender пошагово

Как сделать карту нормалей в blender

Содержание статьи

Как сделать карту нормалей в blender

Карта нормалей – ключевой инструмент для добавления детализации в низкополигональные модели без увеличения количества полигонов. В Blender её можно создать несколькими способами, но наиболее точный результат даёт метод с использованием высокополигональной и низкополигональной версий одной модели. Этот процесс требует настройки Bake в режиме Normal с параметром Space: Tangent, чтобы нормали корректно проецировались на UV-развёртку.

Для начала подготовьте две модели: high-poly (с детализацией) и low-poly (базовая сетка). Убедитесь, что UV-развёртка low-poly оптимизирована – избегайте наложений и растяжений, иначе нормали будут искажены. В настройках Bake выберите Selected to Active, где high-poly – активный объект, а low-poly – выделенный. Параметр Ray Distance (обычно 0.01–0.1) определяет, насколько близко лучи проецирования будут искать пересечения с high-poly.

После запекания проверьте карту в режиме Material Preview или Rendered. Артефакты в виде резких переходов или «шумных» областей указывают на проблемы с UV или настройками Bake. Используйте Normal Map Node в шейдере с цветовым пространством Non-Color и подключите его к Normal Map входа ноды Principled BSDF. Для корректировки интенсивности детализации регулируйте параметр Strength в ноде.

Если high-poly модель отсутствует, альтернативный метод – генерация карты нормалей из текстуры высот (Height Map) через ноду Bump или плагин CrazyBump. Однако такой подход уступает по точности и требует дополнительной настройки контрастности исходного изображения. В любом случае финальную карту экспортируйте в формате PNG (16-bit) для сохранения градиентов без потерь.

Подготовка модели и настройка сцены для работы с нормалями

Настройте сцену для корректного рендера нормалей:

  • Переключитесь в режим Cycles или Eevee с включенным Screen Space Reflections и отключенными тенями (Shadows: None в настройках света).
  • Добавьте источник света типа Sun с интенсивностью 1.0 и углом 0° – строго перпендикулярно модели (ось Z). Это обеспечит равномерное освещение без искажений.
  • Включите Scene > Color Management > View Transform: Standard и отключите гамма-коррекцию (Gamma: 1.0), чтобы избежать цветовых сдвигов в карте нормалей.
  • Для тестирования используйте материал с шейдером Normal Map (подключите ноду Normal Map к Normal входному слоту BSDF), предварительно загрузив тестовую текстуру (например, RGB(128,128,255) для плоской поверхности).

UV-развертка критически влияет на качество карты нормалей. Разверните модель с учетом следующих параметров:

  1. Используйте метод Smart UV Project с углом 66° и Island Margin: 0.02 для автоматической развертки, затем вручную скорректируйте швы (Mark Seam) вдоль естественных границ модели (например, подмышки, воротник).
  2. Избегайте растяжения UV-островов – в режиме UV Editing включите Stretch to UV Bounds и выровняйте острова по пиксельной сетке (удерживайте Ctrl при масштабировании).
  3. Для мелких деталей (пуговицы, складки) создайте отдельные UV-острова с увеличенным масштабом (в 2–4 раза) и расположите их в свободных областях текстуры, чтобы сохранить детализацию.

Проверьте развертку с помощью ноды UV Grid в материале – линии сетки должны оставаться прямыми и равномерными.

Создание высокополигональной и низкополигональной версий объекта

При работе с хайполи следите за топологией: избегайте треугольников и n-гонов, особенно в зонах сгибов или острых граней. Используйте модификатор Remesh с параметром Voxel Size 0.01–0.05 для автоматической оптимизации сетки перед финальной доводкой. Экспортируйте модель в формате .obj или .fbx для дальнейшей обработки.

Низкополигональная версия (лоуполи) создается на основе хайполи с упрощенной геометрией. Начните с базовой формы, используя примитивы или инструмент Retopology в режиме Snapping с привязкой к поверхности. Оптимальное количество полигонов зависит от целевой платформы: для мобильных устройств – 500–2000, для ПК/консолей – 5000–20000. Используйте Decimate с параметром Planar для упрощения плоских поверхностей без потери формы.

При ретопологии уделяйте внимание зонам с высокой кривизной: колени, локти, углы предметов. Здесь оставляйте больше полигонов, чтобы избежать артефактов при наложении карты нормалей. Инструмент LoopTools (активируется в настройках аддонов) поможет равномерно распределить петли ребер. Проверяйте топологию в режиме Wireframe и Face Orientation – синие грани должны быть направлены наружу.

После завершения лоуполи примените модификатор Subdivision Surface с уровнем 1–2 для сглаживания формы перед запеканием. Это позволит карте нормалей точнее передать детали хайполи. Убедитесь, что обе версии модели имеют одинаковое расположение в сцене и масштаб – смещение даже на 0.1 единицы приведет к несовпадению нормалей.

Для проверки соответствия используйте инструмент Shrinkwrap, наложив лоуполи на хайполи с параметром Project и режимом Above Surface. Визуальные несовпадения устраняйте вручную, корректируя вершины или добавляя дополнительные петли ребер. Экспортируйте лоуполи в тот же формат, что и хайполи, с включенными нормалями и UV-разверткой.

Финальный этап – UV-развертка лоуполи. Используйте Smart UV Project с параметром Angle Limit 66° и Island Margin 0.03 для минимизации швов. Размещайте UV-острова в пределах 0–1 пространства, избегая наложений. Для сложных объектов применяйте ручную развертку с инструментом Follow Active Quads или аддон UV Packmaster для оптимальной упаковки.

Настройка модификатора Shrinkwrap для проецирования деталей

Добавьте модификатор Shrinkwrap к низкополигональной модели через панель Modifiers (Properties > Modifiers). В качестве целевого объекта выберите высокополигональную модель, с которой будут проецироваться детали. Установите режим проецирования Project – он обеспечивает точное перенесение геометрии без искажений, в отличие от Nearest Surface Point, который может создавать артефакты на острых углах.

Включите параметр Negative или Positive, чтобы указать направление проецирования: первый смещает вершины внутрь целевой модели, второй – наружу. Для большинства случаев оптимален Negative, особенно если низкополигональная сетка оборачивает высокополигональную. Отрегулируйте Offset в пределах 0.001–0.01 единицы Blender, чтобы избежать пересечения граней или потери деталей.

Активируйте Keep Above Surface, если требуется сохранить исходную форму низкополигональной модели без провалов в целевую геометрию. Для сложных объектов с вогнутыми участками используйте Limit в режиме Axis (например, Z-axis), чтобы ограничить проецирование по одной оси и предотвратить нежелательные деформации.

Проверьте результат в режиме Edit Mode, переключаясь между отображением Wireframe и Solid. Если на границах модели появляются разрывы, увеличьте значение Subdivision Surface перед Shrinkwrap или добавьте вспомогательные петли (Loop Cuts) в проблемных зонах. Для финальной карты нормалей экспортируйте UV-развертку после применения модификатора, чтобы избежать смещения текстурных координат.

Выбор и применение правильного алгоритма выпечки нормалей

Blender предлагает три основных алгоритма выпечки нормалей: Tangent Space, Object Space и World Space. Каждый из них решает конкретные задачи. Tangent Space – универсальный выбор для большинства случаев, особенно при работе с деформируемыми моделями (персонажи, одежда). Нормали в этом режиме сохраняют корректность при анимации, так как рассчитываются относительно поверхности меша. Object Space подходит для статичных объектов с жесткой геометрией (например, архитектурные элементы), где важна точность деталей без искажений при трансформации. World Space редко используется в игровых движках, но может быть полезен для специфических задач, таких как создание карт освещения для сцен с фиксированным положением объектов.

При выборе алгоритма учитывайте целевую платформу. Для Unreal Engine и Unity рекомендуется Tangent Space с настройкой MikkTSpace в параметрах выпечки. Этот стандарт обеспечивает совместимость с большинством шейдеров и корректную работу с динамическим освещением. Если модель экспортируется в Substance Painter или Marmoset Toolbag, проверьте документацию этих инструментов – некоторые версии требуют предварительной настройки UV-развертки с учетом non-overlapping islands и минимального разрешения текстуры не ниже 1024×1024 для избежания артефактов.

  • Для Tangent Space:
    • Убедитесь, что UV-развертка не содержит перекрытий и имеет достаточный отступ (margin) – минимум 4 пикселя для текстуры 2048×2048.
    • Используйте 32-bit float формат для карты нормалей, чтобы сохранить точность градиентов.
    • Включите Selected to Active при выпечке с высокополигональной модели на низкополигональную, чтобы избежать искажений.
  • Для Object Space:
    • Запекайте нормали только для объектов без анимации – любое вращение или масштабирование приведет к некорректному отображению.
    • Экспортируйте карту в OpenEXR, если требуется максимальная точность для постобработки.

Ошибки при выпечке часто связаны с неверными настройками Ray Distance и Extrusion. Для большинства случаев значения по умолчанию (0.1 для Ray Distance и 0.0 для Extrusion) работают некорректно. Начните с Ray Distance = 0.01 и увеличивайте его с шагом 0.005, пока артефакты не исчезнут. Extrusion должен соответствовать толщине деталей на высокополигональной модели – например, для рельефа глубиной 0.5 единиц Blender установите значение 0.55–0.6. Если на карте появляются черные пятна, проверьте направление нормалей на обеих моделях (Shift+N для пересчета) и убедитесь, что низкополигональная модель полностью охватывает высокополигональную.

После выпечки обязательно проверьте карту нормалей в шейдере. В Blender используйте нод Normal Map с цветовым пространством Non-Color и режимом Tangent для Tangent Space или Object для Object Space. Для диагностики артефактов временно подключите карту нормалей к выходу Emission – это позволит увидеть искажения без влияния освещения. Если на стыках UV-островов заметны швы, увеличьте margin или используйте плагин UV Packmaster для оптимизации развертки.

Для сложных моделей с мелкими деталями (например, броня или механизмы) рассмотрите возможность выпечки нормалей в несколько этапов. Разделите высокополигональную модель на части по функциональным зонам (рукава, нагрудник, шлем) и запекайте каждую отдельно с последующим объединением карт в Photoshop или GIMP с использованием масок. Это снижает нагрузку на видеокарту и позволяет точнее контролировать параметры Ray Distance для разных участков. При финальной сборке используйте bilinear filtering для сглаживания переходов между частями карты.

Настройка параметров текстуры и разрешения карты нормалей

Разрешение карты нормалей напрямую влияет на детализацию рельефа. Для большинства игровых моделей достаточно 1024×1024 или 2048×2048 пикселей, но при работе с высокополигональными объектами (например, персонажами AAA-класса) используйте 4096×4096. Увеличение разрешения свыше этого значения редко оправдано – оно повышает нагрузку на GPU без заметного улучшения визуального качества. В Blender выбирайте разрешение в панели Image Texture при создании новой текстуры или в настройках Bake (Render Properties → Bake → Output → Resolution).

Формат хранения карты нормалей критичен для совместимости и производительности. Оптимальный выбор – OpenEXR (32-битный float) для промежуточных этапов, так как сохраняет максимальную точность данных. Для финального экспорта используйте PNG (16-битный) или TGA (24/32-битный), если требуется альфа-канал. Избегайте JPEG – сжатие с потерями искажает нормали, создавая артефакты. В настройках экспорта (Image → Save As) отключите сжатие и выберите Non-Color в цветовом пространстве, чтобы Blender не применял гамма-коррекцию.

Параметр Рекомендуемое значение Примечание
Цветовое пространство Non-Color Исключает автоматическую коррекцию, сохраняя данные нормалей в линейном пространстве.
Тип нормалей Tangent Space Стандарт для игровых движков; Object Space используйте только для статичных объектов.
Смещение (Bias) 0.0–0.5 Корректирует артефакты на стыках полигонов; начинайте с 0.1 и увеличивайте при необходимости.
Радиус (Ray Distance) 0.01–0.1 Определяет, как далеко луч "ищет" поверхность; слишком большое значение размывает детали.

При настройке Bake Type в Blender выбирайте Normal и укажите пространство нормалей: Tangent для большинства случаев или Object, если модель не будет деформироваться. Включите Selected to Active при запекании с высокополигональной на низкополигональную модель, предварительно выделив сначала низкополи, затем высокополи. Параметр Extrusion (0.1–0.5) помогает избежать "протечек" нормалей на краях UV-развертки – подберите значение экспериментально, начиная с 0.2.

Для проверки качества карты нормалей используйте нод Normal Map в шейдере материала. Подключите текстуру к входу Color нода, а его выход Normal – к входу Normal нода Principled BSDF. Включите режим Material Preview (Shift+Z) и вращайте камеру – артефакты проявятся как неестественные блики или "рябь" на поверхности. Если нормали выглядят перевернутыми, инвертируйте канал G (зеленый) в графическом редакторе или добавьте нод Invert с параметром Green в Blender.

Проверка и корректировка артефактов на готовой карте

Используйте инструмент "Clone Brush" в режиме "Stencil" для устранения локальных артефактов. Настройте кисть с мягкими краями (Falloff: Smooth, Strength: 0.3–0.5) и выберите эталонный участок без искажений. Работайте с разрешением карты не менее 2048×2048, чтобы избежать потери деталей при масштабировании.

Для корректировки швов примените модификатор "Seam Smooth" в редакторе изображений (Image Editor → Sidebar → Tools → Seam Smooth). Установите параметр "Blur Radius" в диапазоне 2–5 пикселей и активируйте опцию "Preserve Details". Это сгладит переходы без размытия мелких деталей.

Проверьте карту в режиме "Normal Map" с включённым освещением (Viewport Shading → MatCap). Артефакты в виде "ступенек" или "волн" на плоских поверхностях указывают на проблемы с кодированием нормалей. Используйте ноду "Normal Map" в шейдере с параметром "Strength" 0.8–1.0 для компенсации искажений.

Если артефакты вызваны некорректным рендерингом карты, пересоздайте её с параметрами: "Space" → "Tangent", "Method" → "Non-Color", "32-bit Float" для сохранения точности. Избегайте сжатия в формат JPEG – используйте PNG или EXR.

Для финальной проверки экспортируйте модель в игровой движок или рендер-движок (например, Unreal Engine) и протестируйте при разных углах освещения. Артефакты, незаметные в Blender, могут проявиться при динамическом освещении. При необходимости вернитесь к редактированию карты в Blender.

Сохраните резервную копию оригинальной карты перед правками. Используйте слои в Photoshop или Krita для неразрушающего редактирования – это позволит откатить изменения при ухудшении результата.

Экспорт и использование карты нормалей в игровом движке или рендере

Экспорт и использование карты нормалей в игровом движке или рендере

После генерации карты нормалей в Blender следующим шагом становится её экспорт в формат, совместимый с целевым движком или рендером. Наиболее универсальные форматы – .png (8/16 бит) и .tga (32 бита), поддерживающие альфа-канал и высокую точность данных. Для Unreal Engine и Unity рекомендуется использовать .png с глубиной цвета 16 бит, чтобы избежать артефактов сжатия. В Blender при экспорте через Image > Save As выберите режим Non-Color для цветового пространства, чтобы движок не применял гамма-коррекцию к карте нормалей.

При импорте в движок обратите внимание на параметры текстуры. В Unity установите тип текстуры Normal Map в инспекторе, а в Unreal Engine – Normal в настройках Texture Sample. Это автоматически конвертирует карту в пространство касательных (tangent space) или мировое (world space), если требуется. Для рендеров типа Cycles или Octane оставьте цветовое пространство Linear и отключите сжатие, чтобы сохранить точность нормалей.

  • Unreal Engine: Импортируйте карту через Content Browser, затем в настройках текстуры включите Compression Settings > Normalmap. Для материалов используйте ноду Normal в Material Editor, подключая её к Normal-входу шейдера.
  • Unity: В инспекторе текстуры выберите Texture Type > Normal Map и отметьте Create from Grayscale, если карта была сгенерирована в оттенках серого. В шейдере подключите её к Normal Map-слоту через ноду Sample Texture 2D.
  • Godot: Установите режим текстуры Normal Map в импортере. В шейдере используйте NORMAL-вход материала, предварительно декодировав карту через normal_map().

Карты нормалей в object space (мировое пространство) требуют привязки к конкретному мешу и не подходят для анимации. Их используют в статичных объектах, например, архитектуре или пропсах, где не нужна деформация. Для динамических моделей всегда выбирайте tangent space – такие карты корректно работают при трансформациях меша. В Blender при экспорте через Bake убедитесь, что в настройках выбран режим Tangent.

При тестировании карты в движке проверьте её влияние на освещение. В Unreal Engine используйте Lighting Only-режим вьюпорта, чтобы оценить нормали без текстур. В Unity включите Scene View > Shading > Normal для визуализации направления нормалей. Если на поверхности видны резкие переходы или "швы", увеличьте разрешение карты или перегенерируйте её с большим Ray Distance в Blender.

Для оптимизации производительности в реальном времени уменьшите разрешение карты нормалей до минимально приемлемого. Например, для фоновых объектов достаточно 512×512 пикселей, а для героев или оружия – 2048×2048. В Unreal Engine используйте Mipmaps и LOD-группы, чтобы автоматически подгружать текстуры нужного разрешения. В Unity примените Crunch Compression для мобильных платформ, но помните, что это может снизить качество нормалей.

Если карта нормалей выглядит "плоской" или не даёт ожидаемого объёма, проверьте UV-развёртку меша. В Blender убедитесь, что UV-острова не перекрываются и имеют равномерный масштаб. В движке используйте UV Checker-текстуру для диагностики искажений. Для сложных моделей с высокой детализацией рассмотрите вариант с несколькими картами нормалей разного масштаба (например, одна для крупных форм, другая – для мелких царапин) и смешивайте их в шейдере через Blend-ноды.

Вопрос-ответ:

Ссылка на основную публикацию