Запікання карт нормалей (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, інформація про цільовий рушій.





