Bump Map vs Normal Map: Which Should You Use?

Compare height-based bump and tangent-space normal maps fairly. Learn Blender node connections, Unity imports, conversion limits, and how to avoid doubling the same detail.

Published
Bump Map, Normal Map, PBR Materials
Bump Map vs Normal Map: Which Should You Use?

Use a bump map when you want to author or adjust relief as grayscale height in a supporting shader. Use a tangent-space normal map when your destination expects explicit surface directions, especially for baked game assets. Use actual geometry or displacement when the outline and real depth matter.

A grayscale bump map stores height; a normal map stores direction. Both alter shading without moving the mesh. A normal map generated from the same height image does not automatically contain more surface detail, and bump mapping also responds to moving lights.

How we compared the two techniques

This guide compares one task: adding shallow relief to a UV-mapped surface while preserving its mesh. We evaluate authoring, information carried, integration, compositing, and failure modes. Blender 4.5 LTS and Unity 6 documentation were checked on October 22, 2026.

Our original illustration uses the same periodic height field, derivative scale, light, and shading function for both paths. One path uses the computed normals directly; the other encodes them into 8-bit RGB, decodes, and normalizes them before shading. It isolates the representation difference. It is not a Blender render, bake-quality test, or GPU benchmark.

We publish SeamlessCanvas. Its photo-derived maps appear below as a starting workflow; they do not replace a mesh-specific high-to-low-poly bake.

Original analytical comparison: a height field, its RGB normal map, and matching shaded results from the same source and lighting

Height is shown at left, followed by its encoded normals. The final two panels use equivalent source slopes, so their small numerical differences come from RGB quantization. Different renderer filtering or tangent handling can introduce additional differences in a real project.

Decide from the job you need to finish

Your taskBetter starting choiceMain reason and limit
Paint shallow scratches, pores, or procedural grain in BlenderHeight through BumpEasy to edit and scale; final behavior depends on bump filtering and mapping
Transfer sculpted detail onto a low-poly game meshA baked tangent-space normal mapRecords directions relative to the target mesh; requires compatible UVs and tangents
Deliver relief to Unity's Normal Map inputTangent-space normal mapMatches the shader's expected input; grayscale must be converted first
Combine a baked bevel with separate fine grainBaked normal plus independent bump/detail normalsPreserves two editable detail scales; avoid applying the same relief twice
Make brick edges, tread, or a cliff outline protrudeGeometry or displacementChanges shape; bump and normal alone leave the outline unchanged
Start from one evenly lit material photographAn estimated height/normal pairUseful for a draft; pigment and illumination can be mistaken for geometry

There is no useful overall score here. A painted height field, a sculpt bake, and a photo-derived map have different information sources. A “normal wins” image comparison that gives only the normal path a detailed sculpt does not isolate the map technique.

What a bump map stores

In this article, “bump map” means a scalar height texture evaluated for shading. White conventionally represents higher points and black lower points, subject to inversion and the shader's scale. The shader samples changes in height and tilts its shading normal.

Blender's Bump node exposes Height, Strength, Distance, and a Normal input. This makes grayscale painting and procedural height particularly useful: you can change the height pattern without manually editing vector colors.

The important information is the slope, rather than brightness in isolation. A constant white map and a constant black map both have zero height gradient, so neither creates relief in an ordinary bump-only setup. Adding a constant to every height value leaves those slopes unchanged. Increasing contrast changes slopes and can strengthen the effect.

A bump map is not inherently limited to vertical lighting. Derivatives in both texture directions produce a tilted normal that responds to lights from different directions. Its limits come from representing a scalar height field, filtering, and the fact that the underlying surface remains flat at the scale of the added detail.

Grayscale also does not mean “necessarily 8-bit.” Height can use greater precision. Blender's displacement guide notes that 16- or 32-bit float bump images can improve results over commonly used 8-bit images, especially when gradients otherwise reveal stepping.

What a normal map stores

A normal map encodes a direction vector. For a common tangent-space map, red and green represent the local tangent directions and blue represents the outward direction. Approximately (128, 128, 255) is the familiar flat normal in an 8-bit unsigned RGB image.

Blender's Normal Map node converts that image into a shading normal. Its documentation requires matching UV coordinates for tangent-space maps and Non-Color image interpretation.

Two origins are worth separating. A normal map derived from height stores the slopes of that height field. A normal map baked from a detailed mesh records directions from another surface relative to the target mesh and can carry information absent from a photograph. Neither origin gives the low-poly mesh the source surface's actual silhouette.

Object-space normal maps use a different reference frame and often look more colorful. Do not choose Tangent simply because the file is called a normal map; check how the asset was authored.

Connect either map correctly in Blender

Keep base color and roughness constant while setting up relief. Use a UV-mapped plane or a simple rounded object and one area light, so a change in the relief path remains visible.

Original Blender routing diagram showing a height image through Bump, a normal image through Normal Map, and optional independent detail height

These are connection diagrams, not UI screenshots. Height enters Bump: Height; RGB normals enter Normal Map: Color. Both eventually produce a Normal output for the shader.

Route A: grayscale height through Bump

  1. Add an Image Texture, open the height map, and set Color Space: Non-Color.
  2. Connect Image Texture: Color → Bump: Height.
  3. Connect Bump: Normal → Principled BSDF: Normal.
  4. Start with a small Distance appropriate to the object's scale. Increase it until the relief is visible, then reduce it if ridges look inflated. Strength blends the effect; Distance sets the height multiplier.
  5. If raised marks appear recessed, compare with a known feature and use Bump's Invert option when appropriate.

Route B: RGB image through Normal Map

  1. Add a separate Image Texture, open the normal image, and set Color Space: Non-Color.
  2. Connect Image Texture: Color → Normal Map: Color.
  3. Select Tangent for an authored tangent-space map and use the UV map for which it was created.
  4. Connect Normal Map: Normal → Principled BSDF: Normal.
  5. Begin at Strength 1 for evaluating an existing asset. If it looks wrong, check color space, orientation, UVs, and tangent compatibility before increasing strength.

The Blender color-management guide explains why these numeric data images should bypass color conversion. An ordinary base-color image typically remains on the sRGB path.

Combine independent detail without doubling it

To add new fine grain over an existing normal map, connect Normal Map: Normal → Bump: Normal, feed the independent grain height into Bump: Height, then connect Bump: Normal → Principled BSDF: Normal.

Keep each contribution identifiable. If the normal map was generated from the exact same height map, adding that height again usually exaggerates the same relief. Disconnect each path in turn to check what it contributes. Do not average RGB normal-map colors to blend two direction fields; use a method designed for normal blending or compose height sources before conversion when appropriate.

Match normal conventions in Unity

Unity's normal-map introduction specifies Y+ normal maps, often called OpenGL format. “DirectX” commonly describes the opposite green-channel convention in texture exports. It is a convention label, not a statement that the map only runs through one graphics API.

For an existing RGB normal image, select Texture Type: Normal map in its importer and apply the setting. Leave grayscale conversion disabled for that already encoded normal map. Assign the imported asset to the material's Normal Map input.

For a true grayscale height image, Unity's Normal Map import settings provide Create From Grayscale, with Bumpiness and filtering controls. That creates normal information from height; simply renaming a grayscale file does not.

If the convention disagrees, the importer offers Flip Green Channel. Verify one known raised mark under a light from above and below before flipping it. A green-channel flip changes one direction component; it does not fix incorrect UVs, an object-space map, or every possible inside-out appearance. These settings apply in Unity's importer; verify the convention again when exporting from any generator.

Conversion, image quality, and performance limits

Height-to-normal conversion computes local gradients and encodes the resulting vectors. Its strength and pixel spacing matter. Resizing a height image or changing its UV scale can change how a given conversion reads, so compare at the intended texture resolution and surface scale.

Normal-to-height conversion is a reconstruction problem. The normal map does not carry absolute height, and edited or baked direction fields may not correspond to one globally consistent height field. Reconstructed height can drift or lose detail. Keep the original height or sculpt if it is available.

Use lossless source files where practical. Strong compression can introduce ridges into height or disturb normal directions; data import and appropriate normal-map compression matter as much as extension names.

Do not choose from a universal “bump is faster” rule. Runtime cost depends on shader implementation, samples, derivatives, texture format, compression, resolution, and hardware. A one-channel source image does not guarantee lower final memory use than an engine-compressed normal map. We have not run a timing or memory benchmark for these workflows. Profile the actual target if that difference affects delivery.

Troubleshoot the result by symptom

SymptomCheck firstWhat to try
Grayscale texture creates strange colored lightingWrong decoding pathUse Bump: Height, or convert to an RGB normal map
Surface appears swollen or deeply engravedExcessive strength or duplicated heightIsolate one relief route and reduce the height scale
Only the vertical lighting feels reversedY conventionVerify a known feature; test one green-channel flip
Seams appear on a baked assetUV layout, padding, tangent basis, mesh changesPreserve the bake target's triangulation and compatible tangents; rebake when needed
The center looks detailed but the outline is flatShading-only techniqueModel the edge or use properly configured displacement
Painted lettering becomes a raised ridgeColor was interpreted as heightRemove pigment-driven relief from the source height map

Real displacement changes surface positions and requires suitable geometry and renderer settings. Blender's displacement documentation separates true displacement from bump shading. Making a normal map stronger cannot recover missing parallax, real holes, or a displaced silhouette.

Start with a photo-derived pair when that fits

The SeamlessCanvas photo-to-PBR tool generates maps free after sign-in. Its current height output estimates relief from image luminance and local variation, and its normal output derives directions from that estimated height. It does not inspect an unseen high-poly mesh.

Use it to explore a stone, wood, or fabric material from a clean image. Start by using either the generated height through Bump or the generated normal through Normal Map. Check the result under moving light, remove false relief from shadows and color markings, then choose the path your destination supports.

For a character sculpt, hard-surface bake, or asset whose shading depends on its exact low-poly topology, use a dedicated baking workflow. For reflection finish rather than relief, follow the separate roughness map guide.

Frequently asked questions

Is a normal map always more accurate?

No. Its information source matters. A detailed sculpt bake can capture directions missing from a simple height image; converting that same height image to RGB does not discover additional shape. Import errors can make either route look worse.

Can I use a bump map in a normal-map slot?

Convert it first when the slot expects encoded RGB directions. Blender evaluates grayscale height through Bump; Unity can convert height through Create From Grayscale in the importer.

Should I use both maps from a generated set?

Use both when they contribute different information through a deliberate combination. If the normal was derived from the included height, begin with one relief route and add independent detail only when needed.

Do either of them change the silhouette?

No. Both techniques change shading normals while preserving the mesh. Use geometry or actual displacement for visible edge depth and shape changes.

Official references