Skip to content
← Back to Blog 3d-modeling

Mikktspace Tangent Space in Blender: Fix Normal Map Seams and Baking Errors for Game Assets

By BitSoul3D5 min read185 views

If you've ever baked a perfect-looking normal map in Blender only to import it into Unity or Unreal Engine and see harsh seams at UV borders, you've hit the most misunderstood problem in game asset texturing: tangent space mismatch. The normal map isn't wrong — the tangent basis used to generate it doesn't match the one the engine uses to read it. The fix is straightforward once you understand Mikktspace.

Mikktspace Tangent Space in Blender: Fix Normal Map Seams and Baking Errors for Game Assets

Why Tangent Space Mismatches Break Normal Maps

Normal maps don't store world-space direction vectors. They store vectors relative to the surface — specifically, relative to a tangent frame made of three vectors: tangent (T), bitangent (B), and normal (N). Every renderer and baker computes this tangent frame slightly differently, and when baking and rendering use different calculations, seams and shading errors appear along UV splits.

The problem shows up most visibly at UV island borders. On one side of a seam, the tangent frame points one way; on the other, it points slightly differently. The normal map encodes the correct offset for the baker's tangent basis — but the renderer interprets it with a different basis, producing a discontinuity.

Historically, every engine and DCC tool had its own tangent space algorithm: 3ds Max, Maya, xNormal, and Blender each computed slightly different frames for the same mesh. This made cross-application normal map baking a minefield.

Why Tangent Space Mismatches Break Normal Maps — illustrated

Mikktspace Explained: The Game Engine Standard

Mikktspace is a tangent space algorithm developed by Morten S. Mikkelsen and published as part of his 2008 thesis. It was created specifically to give bakers and renderers a shared, deterministic tangent basis so that normal maps baked in one app render correctly in another — as long as both implement Mikktspace correctly.

Mikktspace is now the de facto standard across the game industry:

ApplicationMikktspace Support
Blender (Cycles/EEVEE baker)✅ Default since 2.80
Unity Standard, HDRP, URP✅ Default
Unreal Engine 5✅ Default
Godot 4 (StandardMaterial3D)✅ Default
Substance Painter✅ Default
xNormal✅ Available (select "MikkTSpace")
Marmoset Toolbag✅ Default

As long as your entire pipeline — from baker to engine shader — consistently uses Mikktspace, normal maps will render without seams. The problems arise when one step in your pipeline breaks the chain.

Setting Up Correct Mikktspace Baking in Blender

Blender's Cycles baker uses Mikktspace by default since version 2.80, but several easy mistakes can still break the tangent basis.

Step 1: Apply all transforms before baking. Unapplied scale is the most common cause of baking errors. Run Ctrl+A → All Transforms on your mesh before starting a bake.

import bpy

# Apply all transforms to selected objects before baking
for obj in bpy.context.selected_objects:
    bpy.context.view_layer.objects.active = obj
    bpy.ops.object.transform_apply(location=True, rotation=True, scale=True)

Step 2: Set the bake to "Tangent" space. In Properties → Render → Bake, set Space to Tangent (not Object or World). This is the default, but double-check.

Step 3: Triangulate before baking. Mikktspace is defined on triangles. Blender auto-triangulates during bake, but the triangulation during baking must match the triangulation during export. Add a Triangulate modifier (Method: Fixed, or Beauty) before exporting, and do not apply modifiers mid-pipeline without re-baking.

Step 4: Consistent UV seam placement. Place UV seams at hard edges (edges where the mesh has a sharp edge split). This ensures the tangent frame discontinuity at the UV seam coincides with the geometric discontinuity, hiding the transition.

Setting Up Correct Mikktspace Baking in Blender — illustrated

Exporting and Verifying in Unity, Unreal Engine 5, and Godot 4

Correct baking is only half the battle. The export and import settings must preserve the tangent data.

GLB / GLTF export from Blender: Use the built-in GLTF exporter. Under Geometry, enable Apply Modifiers and set Tangents to Include if your target engine needs precomputed tangents. For most engines, letting the engine compute tangents from the Mikktspace algorithm at import is fine — but if you see seams only in one engine and not another, forcing tangent export can resolve discrepancies.

Unity: Unity recomputes tangents at import using Mikktspace by default. In the mesh import settings, set Normals to Import (not Calculate) and Tangents to Calculate Mikktspace. If you set Tangents to Import, Unity uses whatever tangents are in the file; if the exporter wrote non-Mikktspace tangents, seams will appear.

Unreal Engine 5: UE5 computes tangents at import via its own Mikktspace implementation. No extra settings are required. The most common mistake is importing with Recompute Normals enabled — this discards your baked normal map data entirely. Leave normals set to Import Normals and Tangents.

Godot 4: Godot 4's StandardMaterial3D uses Mikktspace by default. When importing a GLB, Godot recomputes tangents if none are present. If you see seams after import, open the mesh import settings, enable Force Generate Tangents, save, and reimport.

Common Pitfalls and How to Fix Them

Here's a checklist of the most common Mikktspace-related baking failures and their fixes:

Getting Mikktspace right is a one-time investment. Once your pipeline consistently uses the same tangent basis — Blender bake → GLB export → engine import — normal maps just work, seam-free, across Unity, Unreal Engine 5, and Godot 4.

Need game-ready assets with clean UVs, correct tangent space, and baked normals already applied? Browse the BitSoul marketplace for hundreds of verified, engine-ready models in GLB and FBX format. Every asset on the BitSoul marketplace is tested for Mikktspace compatibility so you can drop it straight into your project without re-baking.


Need drop-in assets for this workflow? Grab the 67-model Weapons Bundle on the BitSoul marketplace and drop them straight into your project.

Tags: weapons

Skip the modeling — download it instead

A free BitSoul3D account gets you 2 GLB downloads every month for personal use plus 25 one-time AI Engine credits, no card required. PBR-textured GLB downloads with a full 3D preview before you buy, for Unreal, Unity, Godot or Blender — OBJ and 3D-printable STL come with any purchase or paid plan.

Browse 1,051 models — from $4.99 → or start free (2 downloads a month)