BLENDER • MATERIALS AND SHADERS

Normal & Bump Maps — Use normal maps and bump maps correctly

Master the illusion of surface detail without adding geometry, using Blender's shader graph.

Historical Context & Motivation

From the earliest days of real-time 3D graphics, artists and engineers faced a punishing trade-off: every wrinkle, pore, and rivet modeled as actual geometry consumed precious memory and processing cycles, yet flat-shaded surfaces looked lifeless and unconvincing. The quest for surface detail without geometric cost drove some of the most creative innovations in computer graphics history. Understanding that lineage is essential because Blender's modern shader nodes are direct descendants of techniques pioneered decades ago—techniques that still define how digital artists think about the relationship between shape and light.

1978
Blinn's Bump Mapping
James Blinn published the seminal paper Simulation of Wrinkled Surfaces, introducing bump mapping—a technique that perturbs surface normals using a grayscale height map to simulate fine detail without altering mesh topology.
1998
Tangent-Space Normal Mapping
Researchers formalized tangent-space normal maps, storing pre-computed normal perturbations in an RGB texture. This allowed high-poly detail to be 'baked' onto low-poly game meshes, revolutionizing real-time rendering.
2004
Normal Maps Enter Game Pipelines
Titles like Doom 3 and Half-Life 2 demonstrated per-pixel normal mapping on consumer GPUs, making the technique an industry standard.
2011–present
Blender's Node-Based Materials
Blender's Cycles renderer (2011) and later Eevee (2018) integrated bump and normal map nodes into a unified, artist-friendly shader graph, making physically based surface detail accessible to visual artists without writing shader code.

The core question these techniques address remains remarkably consistent across four decades: how can we fool the lighting engine into believing a surface has detail that the underlying mesh does not actually possess? Both bump maps and normal maps answer this question by manipulating the surface normal—the vector that tells the renderer which direction a point on the surface is facing—yet they encode and apply that manipulation in fundamentally different ways.

Core Principles & Definitions

Before diving into node setups, it is critical to internalize the foundational concepts that both bump and normal mapping share. Both techniques operate exclusively on shading normals—they change the way light interacts with a surface at render time, but they never move a single vertex. The silhouette of the object remains perfectly smooth, which is one of their key limitations. Below are the four pillars you need to understand.

1

Surface Normal

A unit-length vector perpendicular to a surface at a given point. The renderer uses it to calculate how light reflects, refracts, and diffuses. Modifying this vector changes the apparent shape without modifying the actual mesh.
2

Bump Map (Grayscale Height)

A single-channel (grayscale) texture where brightness encodes relative height. Blender's Bump node computes new normals by taking the gradient of neighboring height values—bright pixels appear raised, dark pixels appear indented.
3

Normal Map (RGB Direction)

An RGB texture where each channel (R, G, B) stores one component of a pre-computed normal vector. Tangent-space normal maps encode deviations from the interpolated surface normal, producing their characteristic purple-blue appearance.
4

Tangent Space vs. Object Space

Tangent-space normal maps store directions relative to each face's local orientation, making them reusable across UV tiles and deforming meshes. Object-space maps store absolute directions, yielding fewer seam artifacts but cannot be tiled or reused.
KEY TAKEAWAY
Think of a bump map as a sculptor's sketch—a loose height contour that Blender interprets on the fly. A normal map is more like a detailed casting mold taken from a high-resolution sculpture: it captures the exact direction every point faces, so the lighting engine can reproduce fine chisel marks, pores, and fabric weave with precision. The bump map is quicker to author; the normal map is more accurate and efficient at render time.

Visual Explanation — How Normals Are Perturbed

The diagram below illustrates the fundamental difference between a flat surface, a bump-mapped surface, and a normal-mapped surface. In all three cases the underlying geometry is identical—a single flat quad. What changes is the direction of the shading normal at each sample point, which tricks the lighting calculation into producing highlights and shadows that suggest three-dimensional relief.

Panel A shows uniform normals on a flat quad. Panel B shows how Blender's Bump node computes new normals from the grayscale height gradient—each arrow tilts away from the perpendicular. Panel C shows how a tangent-space normal map supplies the perturbed direction directly via RGB channels, allowing finer and more predictable control.

Notice that in Panel B the arrows deviate only slightly from vertical, because the Bump node is computing the direction from height differences between neighboring pixels. The strength and frequency of those differences determine the intensity of the effect. In Panel C, each arrow can point in a much wider range of directions because the normal map explicitly encodes the X, Y, and Z components. This is why normal maps tend to capture higher-frequency detail—like the crosshatch of woven fabric—more faithfully than bump maps.

Mathematical Framework — How the Vectors Are Computed

Although you will rarely hand-calculate these values as an artist, understanding the underlying math illuminates why certain settings behave as they do. Bump mapping relies on partial derivatives of a height field, while normal mapping relies on a tangent-space basis transformation. Both ultimately produce a perturbed normal vector that feeds into the BSDF.

Bump Mapping — Height-to-Normal Conversion

PERTURBED NORMAL (BUMP)
N' = N − (∂h/∂u × T + ∂h/∂v × B) × strength
N = original interpolated surface normal, h = height value from the grayscale texture, u, v = texture coordinates, T = tangent vector, B = bitangent vector, strength = Blender's Bump node 'Strength' slider (0–1).

Blender approximates the partial derivatives ∂h/∂u and ∂h/∂v by sampling the height texture at three nearby points and computing finite differences. This means the Distance parameter on the Bump node controls the sample spacing: smaller values yield finer detail but may introduce noise, while larger values smooth out the perturbation.

Normal Mapping — RGB to Vector Decoding

TANGENT-SPACE NORMAL DECODE
N_tangent = (2R − 1, 2G − 1, 2B − 1)
Each channel R, G, B ∈ [0, 1] is remapped to [−1, 1]. A flat surface yields the vector (0, 0, 1), which maps to the RGB value (0.5, 0.5, 1.0)—the characteristic periwinkle-blue seen in tangent-space normal maps.
WORLD-SPACE TRANSFORMATION
N_world = T × N_tangent.x + B × N_tangent.y + N × N_tangent.z
The tangent-space vector is transformed into world space using the TBN matrix (Tangent, Bitangent, Normal), which Blender constructs from the mesh's UV layout. This is why correct UV unwrapping is essential for normal maps to display properly.
⚠️ Why Color Space Matters
Normal maps must be loaded as Non-Color data in Blender's Image Texture node. If left in sRGB, the gamma curve distorts the decoded vectors, producing incorrect shading—often visible as overly dark crevices or washed-out highlights. Bump maps, being grayscale height data, should also be set to Non-Color for accuracy.

Detailed Breakdown — Bump vs. Normal vs. Displacement

Visual artists frequently conflate bump, normal, and displacement mapping, yet each occupies a distinct niche in the surface-detail spectrum. The diagram below maps these techniques from least to most geometric impact, and the subsequent table codifies the practical differences you will encounter in Blender's Shader Editor.

The spectrum runs from pure shading tricks (left) to true geometric deformation (right). Both Bump and Normal Map connect to the BSDF's Normal input and affect only shading. Displacement connects to the Material Output's Displacement socket and actually moves vertices.
Practical comparison of surface detail techniques in Blender
FeatureBump MapNormal MapDisplacement
Texture TypeGrayscale (1 channel)RGB (3 channels)Grayscale or Vector
Color SpaceNon-ColorNon-ColorNon-Color
Affects SilhouetteNoNoYes
Render CostLow–MediumLowHigh (requires subdivisions)
Best Use CaseProcedural textures, quick prototypingBaked detail from high-poly, game assetsHero close-ups, terrain, organic surfaces
Works in EeveeYesYesOnly as bump (no true displacement)

Worked Example — Brick Wall Material in Blender

Let us walk through a complete material setup where we apply both a bump map and a normal map to a brick wall, demonstrating when and how to layer the two techniques for maximum realism. This example uses Blender 4.x with the Cycles render engine.

Brick Wall — Layered Bump + Normal Setup
1
Step 1 — Prepare TexturesObtain three textures for the brick wall: a diffuse color map (Base Color), a normal map (tangent-space, typically from a baking workflow or a PBR texture library), and a height/bump map (grayscale, representing mortar depth). In the Shader Editor, add three Image Texture nodes and load each file.
Three Image Texture nodes loaded. Set the normal map and height map to Non-Color color space.
2
Step 2 — Connect the Normal Map NodeAdd a Normal Map node (Add → Vector → Normal Map). Connect the RGB output of the normal map texture to the Color input of the Normal Map node. Ensure the Space dropdown is set to Tangent Space and that the correct UV Map is selected. Set Strength to 1.0 initially.
Normal Map node outputs a perturbed normal vector from the RGB texture data.
3
Step 3 — Chain the Bump Node for Additional DetailAdd a Bump node (Add → Vector → Bump). Connect the grayscale height texture's Color output to the Bump node's Height input. Now—this is the critical chaining step—connect the Normal Map node's output to the Bump node's Normal input. This tells Blender to apply the bump perturbation on top of the already-perturbed normal from the normal map.
Bump node receives pre-perturbed normal → adds height-based detail → outputs the combined perturbed normal.
4
Step 4 — Connect to the Principled BSDFConnect the Bump node's Normal output to the Principled BSDF's Normal input. Connect the diffuse color texture to the Base Color input. Set Roughness and other PBR parameters as needed for a brick material (typically Roughness ≈ 0.75–0.9).
Node chain: Image Texture → Normal Map → Bump → Principled BSDF (Normal)
5
Step 5 — Fine-Tune Strength and DistanceRender a preview (F12 or Viewport Shading → Rendered). Adjust the Normal Map node's Strength (try 0.5–1.5) to control brick-face detail intensity. Adjust the Bump node's Strength (try 0.3–0.8) and Distance (try 0.001–0.01) to control mortar depth. Lower Distance values produce sharper, more fine-grained bump detail; higher values produce broader, softer undulations.
Final material: Normal map captures brick surface grain; bump map adds mortar depth variation. Combined effect is richer than either alone.
⚠️ Common Pitfall — Inverted Green Channel
Normal maps come in two conventions: OpenGL (Y+ up, used by Blender) and DirectX (Y− up, common in Unreal Engine and some game pipelines). If your brick mortar lines appear to pop out instead of recede, you likely have a DirectX normal map. Fix this by adding a Separate RGB node before the Normal Map node and running the G channel through an Invert node, or by flipping the green channel in an image editor.

Strengths, Limitations & When to Use Each

Choosing between bump maps and normal maps is not simply a matter of quality—it is a workflow decision influenced by your project's rendering context, iteration speed, and source assets. The table below distills the practical considerations an artist faces at each stage of production.

Bump Map vs. Normal Map — practical decision matrix
CriterionBump MapNormal Map
Authoring EaseVery easy—paint a grayscale image or use any procedural noise textureRequires baking from a high-poly mesh, sculpt, or specialized software (Substance, xNormal)
Detail FidelityGood for broad undulations; loses very fine detail due to derivative approximationExcellent—encodes precise direction for every texel
Render PerformanceSlightly more expensive per pixel (3-tap sampling for finite differences)Cheaper—single texture lookup, no derivative computation
Procedural CompatibilityIdeal—any scalar node can be plugged directly into the Bump nodeLimited—procedural outputs are scalar, not RGB normal data
SilhouetteFlat—no changeFlat—no change
LayeringChain multiple Bump nodes or mix heightsChain via Normal input on a Bump node; or use the Blender MixRGB trick (less accurate)
KEY TAKEAWAY
Think of the choice like deciding between a charcoal sketch and a photograph as reference material for a painting. The charcoal sketch (bump map) is quick to produce, flexible, and captures broad tonal relationships, but it cannot reproduce the fine weave of a fabric or the crispness of chiseled text. The photograph (normal map) faithfully records every surface nuance but requires a camera setup (baking workflow). In professional practice, you use both: the normal map captures baked high-poly detail, and the bump map layers procedural variation on top.

Connections to Advanced Techniques

Normal and bump maps are the foundation upon which several more advanced surface-detail systems are built. Understanding these connections helps you plan asset pipelines and anticipate how Blender's toolset will continue to evolve. The table below positions bump and normal mapping relative to their more sophisticated cousins.

How normal/bump mapping connects to advanced surface detail techniques
TechniqueRelationship to Normal/BumpBlender Support
Parallax / Relief MappingExtends normal mapping by ray-marching into the height field, creating the illusion of depth parallax at oblique viewing angles. Uses the same height and normal data.Not natively supported; achievable via custom OSL shaders in Cycles.
Micro-Displacement (Adaptive Subdivision)Converts height maps into true geometry at render time via Cycles' adaptive subdivision. Produces correct silhouettes and self-shadowing. Conceptually, it is 'bump mapping made real.'Full support in Cycles via Experimental feature set.
Vector Displacement MapsLike normal maps, these are RGB (or RGBA) textures, but instead of encoding normal direction they encode XYZ displacement vectors. This allows overhangs and undercuts impossible with scalar height maps.Supported via the Displacement node set to 'Displacement and Bump' with a Vector type input.
Detail Normal Blending (UDN / Reoriented)Advanced math for combining two normal maps (e.g., a tiling micro-detail map over a unique object-level normal map). Ensures physically correct blending without flattening the result.Achievable with Blender's node math, or via the Bump node chain method described in Section 6.

As you progress in your Blender practice, you will find that mastering bump and normal maps provides the conceptual vocabulary for every technique listed above. Micro-displacement is particularly worth exploring next, since it shares the same height-map input as the Bump node but produces geometry that responds correctly to shadows and silhouettes—bridging the gap between the shading-only world of this lesson and the fully geometric world of sculpted detail.

Practice Problems

PROBLEM 1CONCEPTUAL
A classmate argues that a normal map 'adds geometry to the mesh.' Explain why this is incorrect and describe what a normal map actually modifies at render time. In your explanation, address why the silhouette of a normal-mapped sphere remains perfectly smooth.
PROBLEM 2BASIC CALCULATION
A tangent-space normal map pixel reads RGB = (128, 128, 255) in an 8-bit image (values 0–255). Using the decode formula N = (2R − 1, 2G − 1, 2B − 1) with channels normalized to [0, 1], compute the decoded normal vector. What does this vector represent geometrically?
PROBLEM 3INTERMEDIATE
You are creating a cobblestone path material. You have a baked normal map for the stone shapes and want to add fine sand-grain texture procedurally. Describe the exact node chain in Blender's Shader Editor, specifying which nodes to use and how to connect them so that the procedural detail is layered on top of the baked normal map.
PROBLEM 4APPLIED
You are preparing a character model for a game engine that uses the DirectX normal map convention (Y− up), but you sculpted and baked the normal map in Blender, which uses the OpenGL convention (Y+ up). When you import the baked map into the game engine, the character's facial wrinkles appear inverted. Explain the cause and propose two distinct solutions—one in Blender's Shader Editor and one in an image editor.
PROBLEM 5CRITICAL THINKING
A colleague proposes abandoning normal maps entirely in favor of Cycles' adaptive micro-displacement, arguing that true geometry always looks better. Construct a balanced critique of this position, addressing at least three factors: render time, memory consumption, pipeline compatibility, and artistic control. Under what specific production conditions might their approach be justified?

Lesson Summary

Bump maps and normal maps both create the illusion of surface detail by perturbing shading normals without altering geometry. A bump map is a grayscale height field from which Blender computes normals via finite-difference gradients, making it ideal for procedural textures and rapid prototyping. A normal map is an RGB texture encoding pre-computed tangent-space directions, offering higher fidelity for baked high-poly detail.

In Blender's Shader Editor, use the Normal Map node for RGB normal textures and the Bump node for grayscale heights. Layer them by chaining the Normal Map output into the Bump node's Normal input. Always set map textures to Non-Color color space, verify your OpenGL vs. DirectX green-channel convention, and remember that neither technique affects the object's silhouette—for that, explore micro-displacement and adaptive subdivision in Cycles.

Varsity Tutors • Blender • Normal & Bump Maps — Use normal maps and bump maps correctly