Normal Map Baking for Game Models

A properly baked normal map makes a 3,000-poly low-poly model indistinguishable from a million-poly high-poly original. A bad normal map introduces dark bands on edges, seams at UV boundaries, and flat surfaces under side lighting. Technically, [Normal map](https://en.wikipedia.org/wiki/Normal_mappi

Our competencies

Other studio services

Frequently Asked Questions

Latest works

  • image_games_mortal_motors_495_0.webp
    Game development for Mortal Motors
    1504
  • image_games_a_turnbased_strategy_game_set_in_a_fantasy_setting_with_fire_and_sword_603_0.webp
    A turn-based strategy game set in a fantasy setting, With Fire and Sword
    1005
  • image_games_second_team_604_0.webp
    Game development for the company Second term
    635
  • image_games_phoenix_ii_606_0.webp
    3D animation - teaser for the game Phoenix 2.
    716

A properly baked normal map makes a 3,000-poly low-poly model indistinguishable from a million-poly high-poly original. A bad normal map introduces dark bands on edges, seams at UV boundaries, and flat surfaces under side lighting. Technically, Normal map baking takes minutes. Baking it correctly requires specific settings, understanding of tangent space, and the ability to anticipate artifacts before they appear. We have been in the gamedev pipeline for over 5 years and have baked assets for 15+ games, including mobile and PC projects. Our expertise ensures a clean result that passes QA in any engine.

Why artifacts occur on normal maps?

Tangent space mismatch – baking normal maps

This is perhaps the most non-obvious cause of a "correct" normal map that looks wrong in-engine. Marmoset Toolbag, xNormal, Substance Painter, and each engine use their own tangent space conventions. Unity (Standard and URP/HDRP) – MikkTSpace. Unreal Engine – also MikkTSpace, but with specific handling of hard edges in UE4 vs UE5. Godot – MikkTSpace. If a map is baked in one tangent space and imported into an engine with another, you get incorrect lighting: strange highlights in wrong places instead of relief.

Solution: In Marmoset Toolbag 4, set Tangent Space → MikkTSpace. In Substance Painter, this is the setting when importing the mesh (Compute Tangent Space Per Fragment). Verify the result in the actual engine, not just in the tool's preview.

Hard edge + UV seam mismatch

Standard hard-surface geometry has hard edges (smoothing group breaks) at constructive edges. If the UV seam does not coincide with these edges, the baker will interpolate normals across the seam – result: a dark or light band along the edge. The rule: every hard edge must be a UV seam, and every UV seam on hard-surface must be a hard edge. This is mandatory, not a recommendation.

In Blender, this is done via Edge → Mark Sharp + Mark Seam on the same edges. In Maya – Mesh Display → Soften/Harden Edge and UV Seam on coinciding edges. In 3ds Max – Smoothing Groups + UV seam following the same logic.

Cage and projection misses

For complex geometry with concave shapes, floating parts, or large discrepancy between HP and LP in Marmoset Toolbag, you must work with Bake Groups. Each floating part is a separate group with an individual cage offset. Without this, the baker casts rays through incorrect geometry and gets black spots or inverted normals in intersecting areas.

How to configure baking in Marmoset Toolbag 4?

Marmoset Toolbag 4 is the main tool for production bake. Settings for final baking:

  • Samples: 512 for 4096 maps, 256 for 2048. Lower values cause 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 geometry from the back side. Too small – misses on parts with large offset from LP.

For floating geometry: separate Bake Group for each floating group. Max Frontal Distance = slightly larger than distance from LP surface to farthest point of floating object. Rear Distance = minimal.

In xNormal, we use the same approach but via a .hnmap file with cage settings for each asset. xNormal is faster on large scenes and useful for batch baking when you need to bake 50+ objects simultaneously.

Comparison of baking tools:

Tool Speed Tangent Space Features
Marmoset Toolbag 4 High MikkTSpace Best preview, cage support
xNormal Very high Standard (configurable) Best batch bake, open source
Substance Painter Medium Per Fragment Integration with texturing

How to verify the normal map before delivery?

We always check the baked map in the actual engine, not just in Marmoset. Reason: the Toolbag preview uses its own PBR renderer, which can mask issues that become visible under standard lighting in the engine.

Example artifact: a streak on a hard edgeIf the hard edge and UV seam do not match, a dark or light stripe appears on the edge. This is detectable at grazing angle lighting in the engine.

Verification checklist:

  • Lighting from three sides: key, side, backlight
  • Extreme angles: camera nearly parallel to the surface (grazing angle)
  • Check edges: no dark streaks along hard edges
  • Check seams: no visible seams along UV boundaries

If the map passes in-engine testing, it is ready. We guarantee that following these steps yields a clean normal map without artifacts.

What is included in the work

  • Consultation on high-poly and low-poly geometry preparation
  • Setting up the bake project in Marmoset Toolbag 4 / xNormal based on the task
  • Baking all required maps: Normal, Ambient Occlusion, Cavity, Curvature, Thickness, World Space Normal
  • QA in the target engine (Unity, Unreal, Godot)
  • Delivery of source files (.fbx, .tga, project files)
  • Adjusting UV if necessary

Timeline estimates

Asset Maps Duration
Simple prop (weapon, tool) Normal + AO 2–6 hours
Medium-complex object (vehicle, parts) Full PBR 4–10 hours
Character (one UV tile) Full PBR 1–3 days
Complex asset with floating parts Full PBR 2–4 days
UDIM character (4–6 tiles) Full PBR per tile 3–6 days

Cost is calculated individually. Input needed: high-poly (FBX/OBJ), low-poly with ready UV, information about the target engine.

Contact us to discuss your project and get pipeline consultation. Request an evaluation of your asset based on references — it takes one day.