How-to · Cleanup
Baking Normal Maps from a High-Poly AI Mesh
Bake a normal map from a dense AI-generated mesh onto a retopologized low-poly in Blender Cycles: panel, Bake Type, Selected to Active, cage, margin, and common failures.
To bake a normal map from a dense AI mesh, place the low-poly (with clean UVs) and the original high-poly in the scene, select the high-poly then the low-poly as active, set Render properties > Bake > Bake Type to Normal with Selected to Active on, and bake into an image assigned in the low-poly’s material. The point for AI meshes: the dense generator mesh is the only place its small surface detail still exists once you reduce the count, so you bake it into a texture instead of keeping the triangles.
Version note. Setting names are from the Blender 5.2 LTS manual source (blender-v5.2-release branch), read 2026-11-08. Blender 4.5 LTS is also maintained but was not checked, and labels can move between versions. The manual’s baking page has no step list, so the sequence below is assembled from its setting descriptions.
Prerequisites
- A final low-poly with non-overlapping UVs (retopology in Blender, then UV and texture fixes). The manual says baking requires a UV map. Polycount’s baking guide adds that only one copy of any overlapping or mirrored UV shell should stay in the 0-1 square at bake time.
- The untouched original mesh, kept for this. If you remeshed the only copy, the detail is gone.
- Both objects aligned in the same position and at the same scale. Polycount calls resetting the low-poly’s transforms before a bake “very important”, because compounded rotation and scale make a messy local space; in Blender that is applying rotation and scale.
- Cycles as the render engine. The manual says Cycles uses the render settings (samples, bounces) for baking.
Two preparations are worth making on AI meshes. Join the source if it arrived as many objects: the manual notes a fixed CPU memory footprint for every object you bake from and suggests joining high-poly objects to avoid running out of memory. And consider reducing an extremely dense source: Polycount says triangles smaller than the bake pixels increase bake time significantly without improving the bake.
Steps
- Add a target image. On the low-poly’s material, add an Image Texture node with a new blank image sized for your target, and leave that node active and selected. The manual is blunt about this: if a material has no active and selected Image Texture node, “nothing will be baked for this material”, so a low-poly with several material slots needs one in each. The other Output Target is Active Color Attribute.
- Set the image to Non-Color. The manual’s color space page names baking normal maps as a case where images should be marked as non-color data, since they store data rather than colors. Do it now on the Image Texture node’s Color Space field.
- Select high-poly, then low-poly last so the low-poly is active. In Bake, enable Selected to Active. Rays are cast from the low-poly inward toward the high-poly.
- Set Bake Type to Normal. Space can be Object or Tangent. The manual calls Tangent the default and “the right choice in most cases”, since the map then works on animated objects too. The manual says the setting on the Normal Map node should match the one used for baking.
- Set the ray reach, using the table below.
- Set the margin. Under Margin, choose Extend or Adjacent Faces and a Size in pixels. The manual says a margin avoids discontinuities at UV seams caused by texture filtering and mip-mapping. Clear Image wipes the target first.
- Make a test bake. Polycount recommends testing at a smaller image size and lower quality until the errors are gone, then raising the settings for the final.
- Bake, save the image, and connect it through a Normal Map node.
- Bake color too, if needed. To carry the generator’s color onto the new UVs, use Bake Type Diffuse with Contributions set to Color only, leaving Direct and Indirect off. The manual says that with only Color selected you get the pass color, a property of the surface that does not depend on sampling. Any lighting painted into the AI base color comes along with it. Check metal parts afterward: StraySpark, which sells a bake add-on, says Cycles’ diffuse color pass is weighted by (1 − metallic), so baking base color this way turns fully metallic areas black, and that its own tool bakes through a temporary emission swap instead. Bake Type also lists Roughness, Emit and Ambient Occlusion (which ignores scene lights). The list has no Metallic entry.
Choosing the ray setup
No number in the manual tells you what distance to use, because it depends on how far your low-poly sits from your high-poly. Our suggestion: find the largest visible gap between the two surfaces, start a little above it, and change one value at a time.
| Setup | Field | What the manual says | Reach for it when |
|---|---|---|---|
| Cage off | Max Ray Distance | Rays conform to the mesh normals, which “produces glitches on the edges” but is preferable when baking into planes | The part is mostly flat panels |
| Cage on, automatic | Cage Extrusion | Rays start from a ballooned-out version of the low-poly; hard splits should be avoided | The default for a curved prop |
| Cage Object | A separate mesh | Must have the same topology (number of faces and face order) as the low-poly | Tight spots where one distance cannot suit the whole mesh |
Too much distance has a specific look. Polycount’s example is the gap between fingers: a large ray distance makes the baker pick up the neighboring finger, while a small one misses detail where the meshes sit further apart. If no single value works, its listed remedies include editing the cage by hand, or “exploding” the parts apart by the same offset on both meshes before baking and moving them back afterward.
Margin is linked to your UV layout. Blender’s Fraction margin method makes this checkable: per the manual, 1/1024 on a 1024-pixel texture gives each island 1 pixel of margin and keeps islands at least 2 pixels apart. Applied to an illustrative 2048 texture, a Fraction margin of 4/2048 leaves 4 pixels around each island and at least 8 between them, which tells you how large a bake Margin Size the layout can hold before neighbors collide.
Which way is green? Normal map conventions
The two common conventions differ only in the green channel, so a mismatch makes raised details look dented under moving light. What each destination documents:
| Destination | Convention | Source and action |
|---|---|---|
| Blender | OpenGL (Y up) by default for rendering and baking | Blender 5.2 Normal Map node, whose Convention setting also accepts DirectX maps |
| glTF / GLB | Tangent space, +Y up | Blender’s glTF page: keep Space Tangent and Swizzle R +X, G +Y, B +Z |
| Godot | OpenGL style (X+, Y+, Z+) | Godot docs: a DirectX-style map must have its Y axis flipped |
| Unreal | Reported as DirectX; no Epic page read | Forum reply on Epic’s own forum (Tangax, July 11, 2024) calls DirectX “the default in Unreal”; the thread’s asker cites an Epic article saying OpenGL for photogrammetry, so test yours |
| Unity | Not confirmed | Unity’s documentation was not read for this, and third-party pages in search results disagreed, so test yours |
To test, put the map on a mesh in the engine and move a light across a detail you know is raised. If it reads as a dent, flip the green channel in the engine’s texture settings or rebake with the green Swizzle inverted.
What goes wrong with AI meshes
These pair causes from the manual and Polycount with what to expect on generated meshes; the frequency on any given generator has not been measured.
| Symptom | Likely cause | What to do |
|---|---|---|
| Image stays blank | No active, selected Image Texture node in that material | Select the target node in every material slot |
| Out of memory or a crash | Many separate source objects, or an extremely dense source | Join the high-poly objects; reduce the source if it is far denser than the bake resolution |
| Stray shapes printed on the surface | Floaters or inner shells hit by rays | Clean the source with the repair steps |
| One part’s detail on another | Ray distance too long, or parts close together | Shorten the reach, use a Cage Object, or explode the parts |
| Black or empty patches | Rays stop short of the high-poly | Increase Max Ray Distance or Cage Extrusion |
| Lines along UV seams | Margin too small or islands too close | Raise Margin Size; repack with more space |
| Flat, washed or odd shading | Image not set to Non-Color, or UV Map on the node is wrong | Set Non-Color; the Normal Map node’s UV Map should match the texture’s |
| Shading breaks after the bake | UVs or triangulation changed afterward | Re-bake. Polycount warns that rotating or mirroring UVs after baking breaks the match, and recommends triangulating the low-poly before baking |
| Noisy surface | The generator’s surface was noisy | Smooth the high-poly first if that detail is unwanted. A bake reproduces the source as it is |
Tangent space is one more reason to export the mesh you baked on. The glTF specification says that when tangents are not specified, clients should calculate them with MikkTSpace, so a file with no stored tangents depends on the importer doing so. Blender’s glTF exporter has a Tangents option under Mesh.
After the bake
Build LODs from the baked low-poly, then check the result in your engine. Method choice is on retopology for AI 3D models, and this page is part of the Cleaning Up AI 3D Models section.
Stop when the low-poly shows the major surface detail in engine lighting at gameplay distance. Chasing exact visual match to a million-triangle source is wasted effort for assets that appear small.
Not verified
Unreal’s and Unity’s normal map convention from their own documentation, and Blender 4.5 LTS menu wording. The manual gives no recommended ray distance or margin size. Bake screenshots and visual diffs are planned, not done.
Sources
- Blender manual source (main): Cycles baking
- Blender LTS versions
- Blender 5.2 manual source: Render Baking
- Blender 5.2 manual source: Normal Map node
- Blender 5.2 manual source: Color spaces
- Blender 5.2 manual source: glTF 2.0
- Blender 5.2 manual source: UV operators (margin methods)
- Godot documentation: Standard Material 3D
- Khronos glTF 2.0 specification
- Polycount wiki: Texture Baking
- Epic Developer Community forum thread: OpenGL or DirectX for normal maps (July 2024)
- StraySpark devlog: why QuadriFlow rejects AI meshes (vendor of MeshPrep; diffuse pass and metallic note)