Baking Normal Maps for Game Models
Normal map is an illusion. It convinces the engine that a 3000-polygon low-poly sword has engraved runes and metal texture. Good normal map works invisibly. Bad—visible immediately: dark stripes along edges, seam down the middle of handle, "flat" character face under side lighting.
Technically normal map bakes in minutes. Baking correctly—that's knowledge of specific settings, tangent space understanding, ability to foresee artifacts before appearance.
Three artifact sources and how to eliminate them
Tangent space mismatch. Perhaps most non-obvious reason "correct" normal map looks wrong in engine. Marmoset Toolbag, xNormal, Substance Painter and each engine use their tangent space conventions. Unity (Standard and URP/HDRP)—MikkTSpace. Unreal Engine—also MikkTSpace, but with UE4 vs UE5 quirks. Godot—MikkTSpace. If map baked in one tangent space and imported to engine with different, get incorrect lighting: strange highlights not where they should be.
Solution: in Marmoset Toolbag 4 set Tangent Space → MikkTSpace (Blender/Unity/UE). In Substance Painter—setting on mesh import (Compute Tangent Space Per Fragment). Check result in actual engine, not just tool preview.
Hard edge + UV seam mismatch. Standard hard-surface geometry has hard edges (smoothing group breaks) on structural edges. If UV seam doesn't match these edges, baker interpolates normals across seam—result: dark or bright stripe along edge. One rule: each hard edge must be UV seam, each UV seam on hard-surface—hard edge. Not recommendation, mandatory.
In Blender—Edge → Mark Sharp + Mark Seam on same edges. In Maya—Mesh Display → Soften/Harden Edge and UV Seam on matching edges. In 3ds Max—Smoothing Groups + UV seam same logic.
Cage and projection misses. For complex geometry with concave forms, floating details (separate objects on top) or large HP/LP mismatch in Marmoset Toolbag need Bake Groups work. Each floating detail—separate group with individual cage offset. Without this baker casts rays through wrong geometry and gets black spots or inverted normals at intersection zones.
Baking settings in Marmoset Toolbag 4
Marmoset Toolbag 4—primary production baking tool. Final bake settings:
- Samples: 512 for 4096 maps, 256 for 2048. Lower—noise on complex transitions.
- Dilation: 32px for 4096, 16px for 2048. Critical for mip-map bleeding.
- Tangent Space: MikkTSpace (for most engines).
- Max Frontal / Rear Distance: individual per asset. Too large rear distance—baker captures reverse-side geometry. Too small—misses on details with large LP offset.
For floating geometry (rivets, overlays, decorative elements): separate Bake Group per floating cluster. Max Frontal Distance = slightly larger than LP surface to farthest floating object point. Rear Distance = minimal.
In xNormal use same approach but through .hnmap settings file per asset cage. xNormal faster on large scenes, useful for batch baking 50+ objects simultaneously.
Normal map QA before production handoff
Baked map must be checked in engine—not just Toolbag. Reason: Toolbag preview uses its own PBR render potentially masking issues invisible at standard engine lighting.
Check checklist:
- Three-way lighting: key, side, backlight
- Extreme angles: camera nearly parallel to surface (grazing angle)
- Edge check: no dark stripes along hard edges
- Seam check: no visible seams at UV boundary
If map passes engine check—it's ready.
Timeline guidelines
| Asset | Maps | Timeline |
|---|---|---|
| Simple prop (weapon, tool) | Normal + AO | 2–6 hours |
| Medium object (machinery, details) | Full PBR | 4–10 hours |
| Character (single UV tile) | Full PBR | 1–3 days |
| Complex asset with floating | Full PBR | 2–4 days |
| UDIM character (4–6 tiles) | Full PBR per tile | 3–6 days |
Cost calculated individually. Input needed: high-poly (FBX/OBJ), low-poly with ready UV, target engine info.





