Texturing 7 min read

Normal vs Bump vs Displacement Maps

These maps all add surface detail without adding modelling work, but only one of them changes geometry. Knowing which is which explains most texturing confusion.

Vextrude Team

Updated Aug 21, 2026

Normal, bump, displacement and AO maps compared — Vextrude

These maps all add surface detail without adding modelling work, but only one of them changes geometry. Knowing which is which explains most texturing confusion.

Bump Maps Store One Number

A bump map is a greyscale image where each pixel means "how high is the surface here". White is raised, black is recessed, mid-grey is the base level.

At render time the shader uses the gradient of that greyscale image to perturb the surface normal — the direction the surface is considered to be facing — before lighting is calculated. Light then falls on the surface as if it had bumps.

The limitation follows from having only one channel. A bump map can express how high a point is, but not which direction a slope faces beyond what the gradient implies. Steep, directional detail tends to look soft, and the illusion collapses at glancing angles because the silhouette is still perfectly flat.

Bump maps remain useful for fine, non-directional texture — paper grain, brushed metal, subtle roughness — where cheapness matters more than accuracy.

Normal Maps Store a Direction

A normal map solves the bump map's problem by storing three numbers per pixel instead of one. That is why it looks lavender rather than grey: the red, green and blue channels encode the X, Y and Z components of the surface normal vector.

The characteristic colour comes from the default value. A perfectly flat surface has a normal pointing straight out, which encodes as roughly (128, 128, 255) — a pale blue-violet. Deviations from that colour are deviations from flat.

Because direction is stored explicitly rather than inferred, normal maps handle steep and directional detail far better. Rivets look like rivets from the side, not just from straight on.

There are two conventions. Tangent space maps are relative to the surface and work on deforming or rotating objects — this is what you almost always want. Object space maps are relative to the model's own axes: slightly faster, but useless if the mesh deforms. Object-space maps look rainbow-coloured rather than lavender, which makes them easy to spot.

Displacement Actually Moves Vertices

This is the important distinction. Bump and normal maps are lighting tricks — the geometry never changes, and a flat plane stays flat. Displacement maps move real vertices.

That gives correct silhouettes and genuine self-shadowing, and it is the only one of the four that survives being 3D printed, because it produces actual geometry rather than shading instructions.

The cost is resolution. Displacement can only move vertices that exist, so a plane made of two triangles cannot displace into anything. You need dense geometry or runtime tessellation, and that is expensive — which is precisely why normal maps dominate real-time work.

For 3D printing:

Only displacement is meaningful. Normal and bump maps affect how a renderer shades a surface and have no physical existence — a printed model carries none of that detail. If you want texture in a print, it has to be displacement or modelled geometry.

Ambient Occlusion Is Not a Surface Map

An AO map is greyscale like a bump map, but it stores something entirely different: how exposed each point is to ambient light. Creases, cavities and contact points are dark; open flat areas are white.

It does not affect the surface normal or the geometry at all. It multiplies ambient lighting, deepening the shadows that would naturally gather in recesses — grounding the object rather than adding relief.

The common mistake is using an AO map as a bump map because both are greyscale. The result looks wrong in a way that is hard to place: shading appears in the crevices, but the surface stays flat and the highlights do not move.

Modern PBR workflows often pack AO, roughness and metallic into a single image's three channels, which is worth knowing when a texture set arrives with fewer files than expected.

Why Your Normal Map Looks Inverted

Detail that should protrude appears sunken, or the whole surface looks subtly wrong. This is nearly always the green channel.

Two conventions exist for the Y axis. OpenGL expects green to increase upward; DirectX expects it to increase downward. A map authored for one and used in the other renders inverted, and every tool differs: Blender, Godot and most glTF viewers are OpenGL; Unreal and many older Direct3D pipelines are DirectX.

The fix is to invert the green channel — a one-step operation in any image editor, and an option in most map generators. Nothing else needs to change.

Two other causes worth checking. The texture must be loaded as non-colour data; if it goes through sRGB conversion the vectors are silently distorted. And normal maps must not be JPEG-compressed — artefacts that are invisible in a photograph become visible wobbles in a surface normal.


Generate your own maps

Turn a height image into normal, displacement, AO, specular and roughness maps in the browser.

Open Normal Map Generator