The 3D Handbook
Key term

Height and displacement maps

A greyscale texture that stores how far each point sits above or below the surface; used for parallax and parallax occlusion mapping (fake depth), for real displacement and tessellation (including Nanite), and for height blending.

materialstexturingbakingdisplacement

A height map is a greyscale texture that stores how far each point of a surface sits above or below its base level. Unity: "A heightmap should be a greyscale image, with white areas representing the high areas of your texture" (Unity Manual: Heightmap). When the map actually moves geometry it is usually called a displacement map; the data is the same.

#Three ways to use it

The same height map can drive three very different techniques, with very different costs.

Three side views of a brick wall. Left, normal map only: a flat line with small orange arrows tilting at brick edges; geometry stays flat, only lighting changes; silhouette flat, cost low. Centre, parallax occlusion: a flat surface line with a dashed orange brick profile drawn below it and a view ray stepping down into it; pixels fake depth; silhouette flat, cost medium. Right, displacement: an orange brick profile with vertex dots; vertices really move; silhouette changes, cost high.
Normal mapping and parallax keep the geometry flat. Only displacement changes the silhouette, and it needs enough triangles to do so.Diagram by the handbook author

#Parallax and parallax occlusion mapping (POM)

Parallax mapping shifts the texture coordinates per pixel based on the viewing angle, so high areas appear to stand in front of low ones. Unity: it "actually shifts the areas of the visible surface texture around", giving "a kind of surface-level occlusion effect" (Unity Manual: Heightmap). Parallax occlusion mapping marches a ray into the height field for a much more convincing result; Godot's "deep parallax" option uses it and warns it is "much more expensive on the GPU" (Godot Engine: BaseMaterial3D).

Neither technique adds geometry. Godot: it "only creates an illusion of depth, and does not add real geometry" (Godot documentation: Standard Material 3D and ORM Material 3D). Unity: "the 'silhouette' of the model will never be modified" (Unity Manual: Heightmap). They work best on flat, tiling surfaces like floors and walls, viewed from not too low an angle; Godot warns of artefacts "at oblique angles, especially when the camera moves" (Godot Engine: BaseMaterial3D).

#Displacement and tessellation

Displacement moves real vertices along their normals. HDRP's Vertex displacement "Displaces the mesh's vertices according to the Height Map", while its Pixel displacement mode is a parallax technique (High Definition Render Pipeline manual 17.0: Lit material Inspector reference). Displacement only works if the mesh has enough vertices, which is why it is usually paired with tessellation, subdividing the mesh on the GPU.

In Unreal Engine 5, Nanite tessellation "is dynamic programmable displacement" that modifies Nanite meshes at runtime with a displacement map or a procedural material (Unreal Engine documentation: Nanite Virtualized Geometry). Epic lists its uses as authoring with less source detail, "Material-driven and animated displacement", and "Creating detailed Nanite landscapes" (Unreal Engine documentation: Nanite Virtualized Geometry). A separate feature, Nanite static displacement, bakes the displacement into an optimised Nanite mesh offline (Unreal Engine documentation: Nanite Virtualized Geometry). See virtualised geometry.

#Height blending

Height maps are also used purely as data: to blend two materials so that the higher one wins, for example sand settling only in the gaps between cobbles. See height blending and vertex painting and blending.

#Authoring and storage

#Example

#Common mistakes

  • Expecting POM to change the silhouette. The silhouette stays unchanged (Unity Manual: Heightmap).
  • Too much depth. High parallax scales create swimming artefacts at grazing angles (Godot Engine: BaseMaterial3D).
  • 8-bit displacement on large, close surfaces, showing stepped terraces.
  • Displacing a low-poly mesh without tessellation; there are not enough vertices to move.
  • Height map and normal map that disagree, because they were baked from different high polys.
  • Using height maps with triplanar mapping in Godot, where height mapping is not supported on the same material (Godot Engine: BaseMaterial3D).

#In different tools

normal map · height blending · virtualised geometry · baking · tileable materials · terrain and landscapes

#Further reading and watching

A step-by-step setup of Nanite displacement; useful alongside the cobblestone example above. Watch on YouTube

References

  1. Unity Technologies · Heightmap (Standard Shader) · Unity Manual · docs · accessed 2026-10-21
  2. Godot Engine contributors · BaseMaterial3D (class reference source) · Godot Engine (GitHub) · docs · accessed 2026-10-21
  3. Godot Engine contributors · Standard Material 3D and ORM Material 3D (documentation source) · Godot documentation (GitHub) · docs · accessed 2026-10-21
  4. Unity Technologies · Lit material Inspector reference (HDRP) · High Definition Render Pipeline manual 17.0 · docs · accessed 2026-10-21
  5. Epic Games · Nanite Virtualized Geometry · Unreal Engine documentation · docs · accessed 2026-10-21
  6. Joe Wilson · The Toolbag Baking Tutorial · Marmoset, 2017 · article · accessed 2026-10-21
  7. Epic Games · Texture Compression Settings (Unreal Engine 4.27) · Unreal Engine documentation, 2021 · docs · accessed 2026-10-21
  8. Unity Technologies · Lit shader material Inspector window reference for URP · Unity Manual (6000.2) · docs · accessed 2026-10-21

Also consulted

Last updated 2026-10-22