The 3D Handbook
Key term

Normal map blending

How to combine two normal maps (a base and a detail) correctly; the linear, overlay, UDN, whiteout and reoriented (RNM) formulas, a worked example on real vectors, costs, and the nodes that do it in Unreal and Unity.

texturingnormal-mapsshadersmaterials

Normal map blending is combining two normal maps into one, usually a base map (the baked shape of the asset) and a detail map (fine grain that tiles over it). Because a normal map stores directions rather than colours, the maths matters. Colin Barré-Brisebois and Stephen Hill put it plainly: "Since the data represents directions, we can't simply treat the channels independently as we do for colours" (Self Shadow: Blending in Detail).

For where detail normals fit in a material, see detail maps and macro variation; for triplanar projections, see triplanar and world-aligned mapping.

#The formulas

All methods start by unpacking each texel from the 0–1 range to −1…1 (n = tex * 2 - 1). Here n1 is the base and n2 the detail. The code below is from "Blending in Detail" (Self Shadow: Blending in Detail).

Method Formula (before normalising) What happens
Linear n1 + n2 Averages the two; "flattening" both the base and the detail
Overlay Photoshop overlay per channel Still incorrect, because channels are processed separately
UDN (n1.xy + n2.xy, n1.z) Cheap; "some detail reduction over flatter base normals"
Whiteout (n1.xy + n2.xy, n1.z * n2.z) Detail "more apparent", flat normals "still act intuitively"
RNM see below Rotates the detail to follow the base

Reoriented Normal Mapping (RNM), introduced in the same article, treats the detail as if it were lying on a flat surface and rotates it onto the base (Self Shadow: Blending in Detail):

float3 t = n1 + float3(0, 0, 1);     // base, shifted
float3 u = n2 * float3(-1, -1, 1);   // detail, x and y flipped
float3 r = normalize(t * dot(t, u) / t.z - u);

One design goal was that "if one of the normal maps is flat, the output matches the other normal map" (Self Shadow: Blending in Detail).

#Worked example

Take a base normal tilted 30° (a bevel, say) and a detail normal also tilted 30° in the same direction. As unit vectors, both are (0.5, 0, 0.866). In an 8-bit texture that is about RGB (191, 128, 238).

If the detail follows the bevel, the correct result tilts a further 30°: 60° in total. Running the four formulas on these vectors gives:

Method Result vector Tilt
Linear (0.500, 0, 0.866) 30.0°
UDN (0.756, 0, 0.655) 49.1°
Whiteout (0.800, 0, 0.600) 53.1°
RNM (0.866, 0, 0.500) 60.0°
Left, a base normal tilted 30 degrees and a detail normal tilted 30 degrees. Right, a quarter-circle gauge from 0 to 90 degrees with four result lines from one origin: linear at 30 degrees in grey, UDN at 49.1 degrees dashed, whiteout at 53.1 degrees, and RNM at 60 degrees in orange.
The same two inputs through four blends. Linear simply averages the two tilts, so the detail vanishes on the slope; RNM adds the rotations.Diagram by the handbook author

Now check the flat case: base (0, 0, 1), detail at 30°. Linear returns only 15°, half the detail. UDN returns 26.6°. Whiteout and RNM both return exactly 30°, which matches the "flat normals still act intuitively" property (Self Shadow: Blending in Detail).

Linear loses detail everywhere. UDN loses it on slopes; Ben Golus notes it "gets slightly flattened out at angles greater than 45 degrees" (Medium: Normal Mapping for a Triplanar Shader). RNM is exact for this kind of rotation.

#Cost

In the article's instruction table, linear and UDN take 5 ALU instructions, whiteout 7, RNM 8 (6 without the final normalise) and overlay 9 (Self Shadow: Blending in Detail). The authors warn these counts are only a rough guide (Self Shadow: Blending in Detail). Golus states a clear preference: "For modern desktop and console GPUs there's little reason to not use the Whiteout method over the UDN method", and of RNM, "For my eyes RNM retains more of the normal maps' detail and looks better overall" (Medium: Normal Mapping for a Triplanar Shader).

#In different tools

  • Unity Shader Graph: the Normal Blend node has two modes. Default adds x and y and multiplies z, which is the whiteout formula; Reoriented "blends the two normal maps using a mathematically correct method", and its generated code is the RNM formula above (Unity documentation: Normal Blend Node).
  • Unreal Engine: the BlendAngleCorrectedNormals node takes a Base Normal and an Additional Normal. Jen Abbott warns that "Simply adding normal maps together can create incorrect lighting and shading artifacts", and scales each map's red and green channels with a parameter before blending to control strength (ArtStation blog: How do you blend two normal maps in Unreal…).

normal map · detail maps and macro variation · triplanar and world-aligned mapping · tangent space and MikkTSpace · material layers and Substrate · height blending

#Further reading and watching

Watch after the worked example; it shows the same methods side by side in a real shader graph. Watch on YouTube

References

  1. Colin Barré-Brisebois and Stephen Hill · Blending in Detail · Self Shadow, 2012 · article · accessed 2026-10-21
  2. Ben Golus · Normal Mapping for a Triplanar Shader · Medium, 2017 · article · accessed 2026-10-21
  3. Unity Technologies · Normal Blend Node (Shader Graph 17) · Unity documentation · docs · accessed 2026-10-21
  4. Jen S Abbott · How do you blend two normal maps in Unreal Engine 5.7? · ArtStation blog, 2026 · article · accessed 2026-10-21

Also consulted

Last updated 2026-10-22