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.
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° |
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…).
#Related terms
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
References
- · Blending in Detail · Self Shadow, 2012 · article · accessed 2026-10-21
- · Normal Mapping for a Triplanar Shader · Medium, 2017 · article · accessed 2026-10-21
- · Normal Blend Node (Shader Graph 17) · Unity documentation · docs · accessed 2026-10-21
- · How do you blend two normal maps in Unreal Engine 5.7? · ArtStation blog, 2026 · article · accessed 2026-10-21
Also consulted
- · Blending Normal Maps - Shader Graph Basics - Episode 12 · YouTube · video · accessed 2026-10-21
Pages that link here
- Macro normals Key term
- Detail maps and macro variation Topic
- Material layers and Substrate Topic
Last updated 2026-10-22