What Is a Bump Map? The Oldest Trick in Real-Time Lighting

7 min read · Last updated July 2026

A flat grayscale bump map on the left and, on the right, a stone surface rendered with that bump map showing lit bumps and dents on flat geometry
A grayscale image on the left; convincing lit relief on the right. The geometry underneath never changed.

Bump mapping is older than most of the engines that use it — Jim Blinn described it in 1978, and it still ships in materials today. The idea has aged well because it is almost absurdly cheap: a single grayscale image that tells the renderer how to light a surface as if it had detail, without adding a single polygon. This is what a bump map is, how bump mapping actually works, and — the part people skip — when it is still the right tool and when it quietly lets you down.

What a bump map stores

A bump map is one channel of grayscale. Brightness means height: white is raised, black is recessed, mid-grey is the resting surface. That is the whole file. It carries no colour and no direction — just an elevation value at every pixel, which is why a bump map is so small and so easy to paint or tweak by hand.

How bump mapping fakes depth

Diagram showing a grayscale height profile and arrows for surface normals tilting to follow the slope of the grayscale gradient
The renderer reads the slope of the grayscale and tilts the surface normal to match. Light then catches it like a real bump.

Here is the trick. The renderer does not read the grayscale value on its own — it reads how fast that value changes between neighbouring pixels. A sharp jump from dark to light is a steep slope; a gentle gradient is a gentle one. From that slope it tilts the surface normal, the direction the surface is treated as facing, before it runs the lighting. Tilt the normal and the light responds as though the surface rose or fell, even though every vertex stayed exactly where it was. A normal map skips the slope calculation by storing that tilted direction directly; a bump map makes the renderer do the maths from height.

Where bump maps fall short

Because a bump map only bends light, it never touches the outline of the object. Look along a bump-mapped surface at a grazing angle and the illusion breaks: the edge stays perfectly flat while the interior pretends to have depth. There is no self-shadowing between bumps and no occlusion — a deep crevice lights the same as a shallow scratch. Push the strength too far to compensate and the surface goes faceted and plastic. Those limits are exactly why normal and height maps exist, and why bump mapping stopped being the default for close-up hero surfaces.

Bump, normal, or height — a quick placement

The three fake detail in ascending order of cost and fidelity: a bump map perturbs lighting from grayscale; a normal map perturbs lighting from stored directions and holds up far better at glancing angles; a displacement map actually moves geometry so the silhouette and self-shadowing become real. If you want the head-to-head rather than a placement, the normal map vs bump map comparison lays it out side by side.

When a bump map is still the right call

Despite all that, the grayscale bump has stubborn advantages. It is trivial to generate procedurally — any noise function is already a bump map. It is tiny, which matters on mobile and for streaming. It is the easiest map to author or nudge by hand, because you are just painting light and dark. And it is the natural input for making other maps: a height field is a bump map, and both a normal and a displacement map can be derived from it. For shallow, subtle detail — paper grain, cloth weave, fine scratches, orange-peel paint — a bump map is often all a surface needs.

Close-up of matte painted metal and paper surfaces showing subtle fine bump detail like brush texture and grain under soft light
Shallow, low-contrast detail — grain, weave, fine scratches — is exactly where a cheap bump map still earns its place.

Making a bump map from any image

A bump map is just a tuned grayscale, so you can pull one from a photo in seconds: convert to luminance, then push the contrast so raised and recessed areas separate. The free height & bump map generator does this in your browser — the height map it produces is your bump map. From there you can feed it into the normal map generator if you decide the surface wants a normal instead.

Wiring a bump map into an engine

  • Blender — add a Bump node between the grayscale image and the Principled BSDF, set the image to Non-Color, and use Strength (and Distance) to control the effect.
  • Unreal — Unreal has no dedicated bump input; convert the height to a normal (or use BumpOffset for a parallax feel) and plug into the Normal pin. Real bump-style detail lives in the normal map.
  • Unity — the “Normal Map” slot is really a bump slot; assign a normal derived from your height, since Unity works in tangent-space normals rather than raw grayscale.

The through-line: most modern engines want the bump converted to a normal at import, so the grayscale is best thought of as the source the pipeline derives from.

Skip the grayscale-to-normal dance
Describe a surface and CraftPBR gives you the whole set — bump/height, normal, roughness, AO, metalness — already matched. Free to try, CC0.
Open Studio →

Try CraftPBR

  • Text-to-PBR — a prompt gives you height, normal, roughness, AO and metalness at once
  • Photo-to-PBR — turn a reference photo into a full material
  • Free toolsheight/bump, normal, seam editor
  • Engine export — Unity, Unreal, Blender, Godot, Three.js
  • CC0 license — yours to ship

Try CraftPBR free →

Frequently asked questions

What is a bump map?

A bump map is a single-channel grayscale image where brightness stands for height — light is raised, dark is recessed. The renderer reads that grayscale as a slope and tilts the surface normal to match, which fakes the lighting of bumps and dents without changing the actual geometry. It is the oldest and simplest of the surface-detail maps.

How does bump mapping work?

The renderer looks at how fast the grayscale value changes from pixel to pixel — the gradient — and uses it to perturb the surface normal before lighting. A steep change in brightness reads as a steep slope, so light catches it like a raised edge. Nothing about the mesh moves; only the direction the surface is treated as facing changes.

What is the difference between a bump map and a normal map?

Both fake surface detail by altering the normal, but a bump map stores one grayscale height value per pixel and the slope is computed at render time, while a normal map stores a full XYZ direction per pixel directly. Normal maps carry more information and look better at glancing angles; bump maps are cheaper, smaller, and easier to author or tweak by hand.

Is bump mapping still used?

Yes, though less often as the hero technique. Bump maps are still common for subtle, low-contrast detail, for procedural materials where a grayscale is trivial to generate, on mobile where the smaller data helps, and as a quick height input that a normal map is then derived from. For strong detail seen up close, a normal or height map usually replaces it.

What is a bump map used for?

Fine, shallow surface variation: the grain in paper, the weave in cloth, light scratches, orange-peel on paint, pores in plaster. Anything where you want the lighting to react to small detail but the silhouette never needs to change. When the bumps are deep enough that their outline should show, you move up to a height or displacement map.

How do I make a bump map?

Start from a grayscale version of your surface where brightness matches height, then adjust contrast so raised and recessed areas separate cleanly. You can paint one by hand, derive it from a photo, or generate one from a text prompt. Import it as linear / Non-Color data, never sRGB, so the height values are not gamma-corrected.