Запекание карт нормалей (Normal Map) для моделей игр
Normal map — это иллюзия. Она убеждает движок, что на поверхности 3000-полигонного low-poly меча есть выгравированные руны и текстура металла. Хорошая нормал-карта работает незаметно. Плохая — видна сразу: тёмные полосы по граням, шов посередине рукоятки, «плоское» лицо персонажа под боковым освещением.
Технически normal map запекается за минуты. Запекается правильно — это уже вопрос знания конкретных настроек, понимания tangent space и умения предвидеть артефакты до их появления.
Три источника артефактов и как их устранять
Tangent space mismatch. Это, пожалуй, самая неочевидная причина «правильной» нормал-карты, которая выглядит неправильно в движке. Marmoset Toolbag, xNormal, Substance Painter и каждый движок используют свои конвенции tangent space. Unity (Standard и URP/HDRP) — MikkTSpace. Unreal Engine — тоже MikkTSpace, но с особенностями обработки hard edges в UE4 vs UE5. Godot — MikkTSpace. Если карта запечена в одном tangent space и импортирована в движок с другим, получим некорректное освещение: вместо рельефа — странные блики не в тех местах.
Решение: в Marmoset Toolbag 4 выставляем Tangent Space → MikkTSpace (Blender/Unity/UE). В Substance Painter это настройка при импорте меша (Compute Tangent Space Per Fragment). Проверяем результат в самом движке, не только в preview инструмента.
Hard edge + UV seam несовпадение. Стандартная геометрия hard-surface имеет hard edges (smoothing group breaks) на конструктивных рёбрах. Если UV seam не совпадает с этими рёбрами, baker будет интерполировать нормали через seam — результат: тёмная или светлая полоса вдоль ребра. Правило одно: каждый hard edge должен быть UV seam, каждый UV seam на hard-surface — hard edge. Это не рекомендация, это обязательное условие.
В Blender это делается через Edge → Mark Sharp + Mark Seam на одних и тех же рёбрах. В Maya — через Mesh Display → Soften/Harden Edge и UV Seam на совпадающих рёбрах. В 3ds Max — Smoothing Groups + UV seam по той же логике.
Cage и projection misses. Для сложной геометрии с вогнутыми формами, флоатинг деталями (отдельные объекты поверх основной геометрии) или с большим расхождением между HP и LP в Marmoset Toolbag необходимо работать с Bake Groups. Каждая флоатинг деталь — отдельная группа с индивидуальным cage offset. Без этого baker cast лучи через неправильную геометрию и получает чёрные пятна или инвертированные нормали в зонах пересечения.
Настройки запекания в Marmoset Toolbag 4
Marmoset Toolbag 4 — основной инструмент для production bake. Настройки для финального запекания:
- Samples: 512 для 4096 карт, 256 для 2048. Ниже — noise на сложных переходах.
- Dilation: 32px для 4096, 16px для 2048. Критично для mip-map bleeding.
- Tangent Space: MikkTSpace (для большинства движков).
- Max Frontal / Rear Distance: индивидуально под каждый ассет. Слишком большой rear distance — baker захватывает geometry с обратной стороны. Слишком маленький — misses на деталях с большим offset от LP.
Для флоатинг geometry (заклёпки, накладки, декоративные элементы): отдельный Bake Group для каждой группы флоатинга. Max Frontal Distance = чуть больше расстояния от LP поверхности до дальней точки флоатинг объекта. Rear Distance = минимальный.
В xNormal используем тот же подход, но через .hnmap файл настроек cage для каждого ассета. xNormal быстрее на больших сценах и полезен для batch bake когда нужно запечь 50+ объектов одновременно.
QA нормал-карты до передачи в production
Запечённую карту обязательно проверяем в движке — не только в Marmoset. Причина: preview в Toolbag использует собственный PBR рендер, который может маскировать проблемы, незаметные при стандартном освещении в движке.
Чеклист проверки:
- Освещение с трёх сторон: ключевой, боковой, backlight
- Extreme angles: камера почти параллельно поверхности (grazing angle)
- Проверка граней: нет ли тёмных полос вдоль hard edges
- Проверка seam-ов: нет ли видимых швов по UV boundary
Если карта прошла проверку в движке — она готова.
Ориентиры по срокам
| Ассет | Карты | Сроки |
|---|---|---|
| Простой проп (оружие, инструмент) | Normal + AO | 2–6 часов |
| Среднесложный объект (техника, детали) | Full PBR | 4–10 часов |
| Персонаж (один UV tile) | Full PBR | 1–3 дня |
| Сложный ассет с флоатингом | Full PBR | 2–4 дня |
| UDIM персонаж (4–6 тайлов) | Full PBR per tile | 3–6 дней |
Стоимость рассчитывается индивидуально. На входе нужны: high-poly (FBX/OBJ), low-poly с готовым UV, информация о целевом движке.





