Skip to content
← Back to Blog texturing

Detail Normal Maps in Unreal Engine 5: Complete Workflow Guide

By BitSoul3D4 min read132 views

Every game artist knows the frustration: you bake a pristine normal map for a concrete pillar, import it into Unreal Engine 5, and up close the surface looks flat and synthetic — individual pores and grain lost at the bake resolution. Detail normal maps solve this without touching your bake. They layer a tiling micro-texture on top of your existing normal map at runtime, adding surface grain, fabric weave, skin pores, or ground scatter that reads correctly regardless of camera distance.

Detail Normal Maps in Unreal Engine 5: Complete Workflow Guide

What are detail normal maps and how do they work?

A detail normal map is a seamlessly tiling normal map applied at high frequency to add micro-surface variation. Unlike your base normal map — baked at texel densities of 10–20 px/cm — a detail normal tiles at 50–200× the density, capturing detail that no reasonable bake resolution could deliver without massive texture sizes.

The critical node in UE5 is BlendAngleCorrectedNormals. Standard normal map blending using the BlendNormals node (additive overlay) introduces artifacts because it doesn't account for the angular relationship between the two normals. BlendAngleCorrectedNormals uses reoriented normal mapping (RNM), which preserves the directionality of both normals even at steep angles.

What are detail normal maps and how do they work? — illustrated

The math behind the node is Result = normalize(float3(N1.xy + N2.xy, N1.z * N2.z)) — but you never need to write it. What matters is that the output normal is always unit-length and physically plausible, even when the two inputs point in wildly different directions.

When to use detail normal maps:

Setting up detail normal maps in Unreal Engine 5

In your material, the minimum viable setup is four nodes:

TextureSample (Base Normal)   ──────────────────────────────────────────┐
                                                                         ├─ BlendAngleCorrectedNormals ─► Normal
TextureSample (Detail Normal) ─────────────────────────────────────┐    │
TextureCoordinate ──► Multiply (× DetailNormalTiling scalar) ──► UVs ─┘ │

Step by step:

  1. Import your detail normal — a seamlessly tiling normal map with a neutral flat baseline (R=0.5, G=0.5 background with micro-bumps). Set Compression Settings to Normalmap and sRGB to false. Free tiling normal maps compatible with UE5's BC5 compression are available at https://bitsoulhosting.com/marketplace.
  2. Add a TextureCoordinate node — pipe it into a Multiply node with a scalar material parameter (DetailNormalTiling, default 8.0). Feed the result into the UV input of your detail normal TextureSample.
  3. Add BlendAngleCorrectedNormals — connect your base normal sample to Normal1 and the detail normal sample to Normal2. Connect the output to the material's Normal pin.
  4. Add an intensity control — lerp the detail normal toward a flat normal (0.5, 0.5, 1.0) using a scalar parameter (DetailNormalIntensity, default 1.0). This lets you dial strength down per material instance without creating new materials.

Setting up detail normal maps in Unreal Engine 5 — illustrated

Tiling scale, intensity, and defeating visible repetition

The most common failure mode is visible tiling — the repeated pattern becomes obvious at grazing angles or under directional light. Two techniques fix this:

Stochastic tiling: UE5's Texture2D_Stochastic material function (available in the Engine Content plugin under Edit → Plugins → Engine → Stochastic Texturing) breaks repetition by applying randomised per-tile offsets using hex-based sampling. Wrap your detail normal TextureSample in this function and tiling becomes imperceptible.

Two-layer blending at different scales: blend two detail normal samples — one at 6× tiling, one at 32× tiling — with a second BlendAngleCorrectedNormals node before the final blend with your base. The frequency mismatch eliminates the rhythmic repetition pattern entirely.

Tiling ScaleUse CaseTypical surface area
4–8×Large stone, plaster, soil1–4 m²
12–24×Concrete, brick, rough wood0.25–1 m²
32–64×Skin, fine fabric, brushed metal0.05–0.25 m²
80–160×Microfibre, leather grain, ceramic glazeExtreme close-up

A safe starting point for most props is DetailNormalTiling = 12.0 with DetailNormalIntensity = 0.7. Reduce intensity to 0.3–0.5 on materials that already have strong baked normals to avoid over-roughening the silhouette.

Detail normal maps with material instances and Nanite

Expose DetailNormalTiling and DetailNormalIntensity as material parameters so every instance can dial values independently without spawning new master materials. In a large scene, 400 material instances sharing one master with an exposed detail normal is dramatically cheaper than 400 unique materials — both in shader compilation time and runtime permutation cost.

With Nanite: detail normal maps work without modification on Nanite meshes. Nanite evaluates materials identically to non-Nanite static meshes — there is no special setup. However, if you are also using Nanite Displacement or World Position Offset on a mesh, the detail normal can double-up perceived grain; drop DetailNormalIntensity to 0.3 on those materials.

Material layers: UE5's Material Layer system lets you assign per-layer detail normals. A landscape master material might use a soil-grain detail normal in the dirt layer, a rock-pore detail normal in the stone layer, and a moss-bump detail normal in the vegetation blend zone — all driven by a single landscape layer mask. This is the cleanest architecture for open-world terrain with detail normal maps in Unreal Engine 5.


Browse over 590 free game-ready GLB assets at https://bitsoulhosting.com/marketplace — download any mesh, import into UE5, and apply this detail normal map workflow immediately.


This post is part of the Ultimate Guide to Free 3D Game Assets — BitSoul's complete reference for formats, texturing, rigging, optimization, and engine integration.


Need drop-in assets for this workflow? Grab the 67-model Weapons Bundle on the BitSoul marketplace and drop them straight into your project.

Tags: weapons

Skip the modeling — download it instead

A free BitSoul3D account gets you 2 GLB downloads every month for personal use plus 25 one-time AI Engine credits, no card required. PBR-textured GLB downloads with a full 3D preview before you buy, for Unreal, Unity, Godot or Blender — OBJ and 3D-printable STL come with any purchase or paid plan.

Browse 1,051 models — from $4.99 → or start free (2 downloads a month)