Beginner PBR Channel

What is a Height Map and How Does It Differ from a Normal Map?

Height maps and normal maps both add surface depth — but they store that depth completely differently and are used in different contexts. Understanding when to use each, and what the engine does with each type of data, makes you a more effective technical artist.

⏱ ~8 min read · 6 sections · Beginner friendly

Section 01

What is a Height Map?

A height map (also called a displacement map) is a greyscale texture that stores surface elevation data. The encoding is straightforward and intuitive: white pixels represent the highest points of a surface, black pixels represent the lowest, and grey values sit somewhere in between.

Unlike a normal map — which stores a direction encoded as an RGB color and requires understanding tangent space to interpret — a height map stores a single, simple scalar value per texel. This makes height maps easy to read, easy to paint by hand, and easy to convert between different uses.

Think of it like a topographic map. A mountain range viewed from above — white peaks, dark valleys, grey slopes. That's exactly what a height map looks like. The engine reads those brightness values and uses them to calculate how the surface rises and falls.
Section 02

Height Maps vs Normal Maps

Both maps add the illusion of surface detail without extra geometry, but they store and use that detail in fundamentally different ways. Knowing the distinction helps you pick the right tool for each situation.

Property Height Map Normal Map
Data stored Scalar elevation value — one number per pixel Surface direction — RGB-encoded XYZ vector
Visual appearance Greyscale — white is high, black is low Blue-purple — RGB encodes surface angle
Readable by eye? Yes — intuitive greyscale gradient Not really — colors represent directions, not colors
Paintable by hand? Yes — paint grey to raise, black to lower Difficult without baking tools
Affects silhouette? Yes — with displacement or POM No — silhouette of the mesh is unchanged
Performance cost Higher — requires tessellation or shader tricks Low — per-pixel shading only
Typical use Terrain, close-up hero surfaces, POM floors Almost all game assets at any detail level

The key practical difference: normal maps are the default for game assets because they're cheap and compatible with everything. Height maps are a specialist tool — reach for them when you specifically need surface displacement or parallax depth effects that normal maps can't deliver.

Section 03

How Engines Use Height Data

There are three different techniques engines use to turn height map data into visible depth on a surface. Each has a different visual result and a different performance cost.

Most realistic

True Displacement (Tessellation)

The GPU physically subdivides the mesh into many smaller triangles, then moves each new vertex up or down based on the height map value. The result is real geometry — the silhouette of the mesh actually changes, and the depth reads correctly from any angle. Most realistic but most expensive. Used for hero surfaces and cinematic assets where quality is the priority.

Best balance

Parallax Occlusion Mapping (POM)

A shader technique that ray-marches through the height map to create the illusion of depth without moving any geometry. The surface appears to have real depth — especially convincing at oblique viewing angles — and even creates self-shadowing within the detail. Excellent for floors, walls, and cobblestone surfaces. No extra triangles required.

Cheapest

Bump Mapping (Legacy)

The oldest technique — uses the gradient of the height map to perturb surface normals, similar to what a normal map does. No silhouette change, no true parallax depth. Mostly superseded by baked normal maps, but still found in older tools and lower-end platforms where even POM is too expensive.

Section 04

Parallax Occlusion Mapping in Practice

POM is by far the most practical use of height maps in real-time games. It works best on surfaces that are viewed at an angle — cobblestone streets, brick walls, tile floors, rocky terrain. The parallax effect shifts the texture as the camera angle changes, creating the convincing impression that the surface has real geometric depth.

Good POM candidates

Flat or near-flat surfaces viewed at oblique angles. Cobblestone, brick, concrete tiles, wood planks, paving stones, rock walls. The parallax effect is most convincing on these.

Poor POM candidates

Curved surfaces, animated meshes, surfaces viewed head-on at close range. POM can break down or show artifacts on surfaces that aren't roughly planar.

Setting up POM in each engine

Unreal Engine 5

Use the built-in Parallax Occlusion Mapping material function. Connect your height map to the Height input and set the Height Ratio parameter to control depth intensity.

Unity

The Standard shader supports Parallax mapping — a simpler version of POM. For full POM, use a custom shader or a third-party shader package from the Asset Store.

Godot 4

The StandardMaterial3D includes a Height map slot with a depth scale parameter. Connect your height map and adjust the depth scale to control parallax intensity.

POM and Nanite in Unreal Engine 5. Unreal 5's Nanite system handles real geometry displacement efficiently at large scale — which reduces the need for POM in some scenarios. However, POM remains valuable for runtime-animated surfaces, mobile targets where Nanite isn't available, and surfaces that need dynamic depth without the geometry overhead.
Section 05

Baking Height Maps

Height maps are baked from a high-poly model in the same pass as your normal map. The baker measures the distance from each surface point on the low-poly mesh to the corresponding point on the high-poly mesh, and encodes that distance as a greyscale value — closer to the high-poly surface produces lighter values, further away produces darker values.

Because height maps and normal maps are baked from the same high-to-low relationship, you typically get both at the same time without any extra work. Run your bake pass, and your baker should output a height map alongside the normal, AO, and curvature maps.

Height to Normal conversion

If you have a height map but need a normal map — perhaps you painted the height data by hand — most texture tools can generate a normal map from a height map automatically. The process calculates the gradient (the slope) of the height data at each pixel and converts that slope into a tangent-space normal direction. The result isn't as accurate as a baked normal map from a high-poly source, but it's often good enough for tileable surface materials where fine accuracy matters less than overall surface character.

Use both together for maximum depth. Export a height map for POM or displacement, and a normal map for per-pixel shading detail. The combination gives you the parallax silhouette depth effect from the height map plus the fine-grain shading from the normal map — together they make a surface feel genuinely three-dimensional in a way that neither achieves alone.
Section 06

Height Maps in Trumble

Trumble bakes height maps as part of its standard bake pass alongside normal, AO, and curvature maps. Import your high and low poly meshes into the Bake tool, run the bake, and the height map is generated automatically — no extra configuration required.

The baked height map can be used directly for POM setups in your target engine, or converted to a normal map within Trumble if you need a tangent-space normal from hand-painted height data. Both options are available in the export settings.

Bake tool

Height map is included in the standard bake pass. Outputs alongside normal, AO, and curvature in one operation.

Height to Normal

Convert a painted or baked height map into a tangent-space normal map directly in Trumble — useful for tileable surface materials.

Engine export

Height map exports with the full texture pack in the correct format for POM setups in Unreal, Unity, and Godot.

Quick workflow: Bake your asset in Trumble to get the height map. Export it alongside your normal map. In Unreal, connect the height map to a POM material function and your normal map to the normal input. The POM adds parallax depth; the normal map adds shading detail. Together they produce a surface that feels far more three-dimensional than either achieves on its own.