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.
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.
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.
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.
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.
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.
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.
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
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.
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.
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.
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.
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.
Height map is included in the standard bake pass. Outputs alongside normal, AO, and curvature in one operation.
Convert a painted or baked height map into a tangent-space normal map directly in Trumble — useful for tileable surface materials.
Height map exports with the full texture pack in the correct format for POM setups in Unreal, Unity, and Godot.