What is a normal map?
Updated · 6 min read
A normal map is a texture that stores a surface direction (a "normal") in each pixel instead of a colour. Its red, green and blue channels hold the X, Y and Z of that direction, so the renderer lights tiny bumps, scratches and seams as if they were modelled, without adding any polygons.
This guide explains how that works, why most normal maps are light blue, the difference between tangent-space and object-space maps, the OpenGL vs DirectX green-channel issue, and how a normal map differs from bump and displacement maps.
Try it on your own model
Upload a GLB, OBJ, FBX, STL or PLY file (or pick a sample), describe the look, and let AI paint it from every side.
Open the AI 3D Texturing StudioHow a normal map works
A normal is the direction a surface faces, pointing straight out of it. Lighting depends on it: a surface that faces the light is bright, and one that turns away is darker. On a plain low-poly model, the normal changes smoothly across each triangle, so a flat panel lights up flat.
A normal map replaces that smooth normal with a new one for every pixel. The geometry stays exactly the same, but the shading now tilts pixel by pixel, so rivets, pores, wood grain or brick joints catch the light like real relief.
How a direction becomes a colour
Each part of a direction runs from -1 to +1, but a colour channel only runs from 0 to 1. So the value is squeezed: colour = direction × 0.5 + 0.5, and the shader reverses it when it reads the map. The glTF 2.0 spec spells it out: red maps to X, green to Y, blue to Z.
| Channel | Stores | Colour range | Direction range |
|---|---|---|---|
| Red | X (left / right tilt) | 0 to 1 | -1 to +1 |
| Green | Y (up / down tilt) | 0 to 1 | -1 to +1 |
| Blue | Z (straight out of the surface) | 0.5 to 1 | 0 to +1 |
Why normal maps look blue or purple
On most surfaces, most pixels point almost straight out. "Straight out" is X = 0, Y = 0, Z = 1, which encodes to the colour (0.5, 0.5, 1.0), or about (128, 128, 255) in an 8-bit image: a light blue-violet. Only slopes shift the colour, so edges facing one way turn pinkish (more red) and edges facing up turn greenish (more green).
That is why a normal map does not look like a photo of the surface. It holds data, not colour, so it must be loaded as Non-Color (Blender) or linear data, never as sRGB. Loading it as a colour image is the most common reason a normal map shades strangely.
Tangent space vs object space
The direction in each pixel has to be measured relative to something. There are two common choices:
| Tangent space | Object space | |
|---|---|---|
| Directions are relative to | The surface at that point (its normal, plus a tangent and bitangent that follow the UVs) | The whole object’s own X, Y and Z axes |
| Typical look | Mostly light blue | A rainbow of colours |
| Works on a bending, animated mesh | Yes | Poorly, because the map does not follow the deformation |
| Can be tiled or reused on other models | Yes | No, it only fits the mesh it was made for |
| Needs tangents | Yes (computed from the UVs if the file has none) | No |
| Where you see it | Games, glTF/GLB, most engines and renderers | Some baking and static-mesh workflows |
Tangent-space maps are the default almost everywhere. Blender’s manual calls them the most common type because they survive object transforms and mesh deformation. glTF supports only tangent-space normal maps: if a GLB has no tangents, the viewer computes them with the MikkTSpace method from the mesh and its UVs.
Because tangent space is built from the UVs, a tangent-space normal map only fits the UV layout it was made for. Re-unwrap the model and the old map no longer lines up. If UVs are new to you, see UV unwrapping explained.
OpenGL vs DirectX normal maps
There are two conventions for the green channel, and they are exact opposites:
- OpenGL (Y+, "green up"): Blender, Unity, Godot, three.js and the glTF format. The Blender glTF manual lists glTF normal maps as "tangent space, +Y up".
- DirectX (Y-, "green down"): Unreal Engine and some other DirectX-based tools.
Red and blue are the same in both. If bumps look pushed in when they should stick out, or the light seems to come from below, the map is in the other convention. The fix is to invert the green channel, which most texture tools and our normal map generator can do with one switch.
Normal map vs bump map vs displacement map
| Bump (height) map | Normal map | Displacement map | |
|---|---|---|---|
| Stores | One grey value per pixel: height | Three values per pixel: a direction | One grey value per pixel: height (or a vector) |
| What it changes | Shading only | Shading only | Moves the actual vertices |
| Changes the outline (silhouette) | No | No | Yes |
| Cost | Cheap | Cheap | Needs a dense or subdivided mesh |
| Typical use | Simple surface detail, older pipelines | Real-time detail in games, web and AR | Film, close-ups, real geometry for 3D printing |
A bump map only says how high each pixel is, so the renderer has to work out the slope from neighbouring pixels. A normal map stores the slope directly, in two directions, which gives more control over how light bends. Unity’s manual describes both as kinds of bump mapping.
The big limit of both: the edge of the model does not change. Look at a normal-mapped brick wall from the side and its outline is still perfectly flat. When the silhouette has to change, or the detail must be printed, you need real geometry or displacement.
How normal maps are made
- Baked from a high-poly model. Artists sculpt a detailed version, then bake its surface directions onto the low-poly game model’s UVs. This gives the most accurate result.
- Made from an image. A tool reads the texture’s brightness as height and turns the slopes into a normal map. It is fast and works well on stone, wood, fabric and other textures where light and dark follow the relief, but it is a guess from shading.
- Painted or sculpted directly in texturing apps that paint height or normal detail as layers.
Make a normal map in your browser
From a texture or photo: our free normal map generator turns an image into a tangent-space normal map, with strength and detail settings, an OpenGL / DirectX switch and a moving-light preview. The image is processed on your device.
For a whole 3D model: in the AI 3D Texturing Studio, first paint the model’s colour with AI, then press Make PBR maps. The studio builds a normal map from the painted texture (with a Bumpiness slider), plus roughness, metal and ambient-occlusion maps. While the PBR preview is on, the GLB you download carries the normal map in glTF’s normal slot, and PBR maps (PNG) saves it as a separate image. Like any image-based normal map, it is estimated from the texture’s light and dark areas, not baked from extra geometry.
To see how the normal map fits next to the other maps, read PBR maps explained.
Paint a model, then add normal detail
Texture a model with AI and make its normal, roughness and AO maps in the browser.
Open the studioQuestions
Why is a normal map blue?
Because most pixels point straight out of the surface. That direction (X 0, Y 0, Z 1) is stored as the colour 0.5, 0.5, 1.0, a light blue. Only the slopes add red or green.
What is the difference between a normal map and a bump map?
A bump map stores only height (one grey value per pixel) and the renderer works out the slope. A normal map stores the slope itself as a direction in three channels. Neither changes the model’s outline.
Does a normal map change the shape of the model?
No. It only changes how light falls on the surface. The geometry and the silhouette stay the same. To change the shape you need a displacement map or more geometry.
Why do my normal map bumps look like dents?
The map is probably in the other green-channel convention. OpenGL maps (Blender, Unity, Godot, glTF) and DirectX maps (Unreal Engine) differ only in green. Invert the green channel and it will look right.
Can a GLB file contain a normal map?
Yes. glTF 2.0 has a normalTexture slot for a tangent-space normal map, stored as linear data. A GLB can pack that image inside the file next to the base colour texture.
Ready to texture something?
Upload a GLB, OBJ, FBX, STL or PLY file (or pick a sample), describe the look, and let AI paint it from every side.
Start texturingStep-by-step tutorials
Keep reading
PBR maps explained: albedo, normal, roughness, metallic and AO
PBR maps explained for beginners: what albedo, normal, roughness, metallic and ambient occlusion maps do, how a GLB stores them, and how AI textures fit in.
UV unwrapping explained (and why it matters for AI texturing)
UV unwrapping explained simply: what UVs are, why seams and islands exist, what texel density means, and what UV problems do to AI texturing, with fixes.
What is a GLB file? (and how it differs from glTF)
A GLB file is a 3D model in glTF 2.0’s binary format. What a GLB holds, how the file is built, GLB vs glTF compared in a table, and how to open or edit a GLB.
What is AI texturing? A plain-English guide for beginners
AI texturing paints the surface of a 3D model from a text prompt. Learn what it is, how it works, what it is good and bad at, and how to try it on your model.
Sources
Checked 2026-10-17. Other tools change their features and prices often, so check their own pages too.
- Khronos Group, glTF 2.0 specification: Normal Texture (encoding, tangent space, MikkTSpace)
- Blender Manual 4.1: glTF 2.0 (normal map is tangent space, +Y up)
- Blender Manual 4.1: Normal Map node (tangent, object and world space)
- Unity Manual: Introduction to normal maps (bump mapping)
- LearnOpenGL: Normal Mapping (RGB encoding, tangent space)
- MikkTSpace tangent space reference implementation
- Adobe Substance 3D: Normal mapping