A normal map and a height map can describe the same rough surface, but Blender does not use them in the same way. A normal map changes the direction the surface appears to face when it is shaded. A height map stores scalar height information that Blender can use for bump mapping or, with the right setup, to move the geometry itself.
That distinction matters when you download a PBR material containing both maps. Using both at full strength is not automatically more accurate, and plugging a height map into the wrong socket will not give you displacement. The useful choice depends on whether the detail needs to affect only the lighting or the actual shape of the mesh.
What a normal map does in Blender
A tangent-space normal map is an RGB image that encodes surface directions. Blender's Normal Map node documentation describes the node as converting that RGB data into a perturbed normal that can be passed to a BSDF shader. Tangent-space maps are the common choice because they continue to work when an object is transformed or deformed.
Normal mapping changes shading without adding geometry. Small grooves, pores, scratches, dents, and aggregate can react to light as though the surface were more detailed, while the mesh itself stays exactly where it was. Look at the silhouette of a flat plane using a normal map and it remains flat.
In Blender, the normal texture should be set to Non-Color, connected to the Color input of a Normal Map node, and then connected from the Normal Map node to the Normal input of the Principled BSDF. Blender specifically calls for Non-Color mode for tangent-space normal textures because the RGB values are vector data rather than display color.
If the lighting looks inverted even with that setup, check the normal-map convention. Blender uses the OpenGL orientation commonly associated with a positive green channel. A DirectX normal map uses the opposite green-channel direction. Our OpenGL vs DirectX normal map guide covers how to identify and convert between the two conventions.
What a height map does
A height map is usually a grayscale image where the stored value represents relative height. Unlike a tangent-space normal map, it does not directly store the direction the surface should face. Blender can derive that direction from changes in the height values, or it can use the values to displace geometry.
Those are two different workflows. If you connect the height texture to a Bump node, Blender uses the height differences to calculate a perturbed normal. The Blender Bump node documentation explains that the node samples the height at the shading point and nearby points to determine the local normal direction. No vertices are moved.
If you use the height map for true displacement, Blender can move the rendered surface along its normal. That requires a displacement setup and enough mesh subdivision for the geometry to represent the detail. Blender's Displacement node documentation notes that true displacement physically changes the rendered geometry and works best on a finely subdivided mesh.
So a height map is not automatically a displacement map just because the file is named height.png. The image contains height data. What Blender does with that data depends on how the material is configured.
Bump mapping and normal mapping both leave the silhouette alone
This is the easiest way to separate the techniques mentally. Normal mapping and bump mapping both modify the normal used for shading. Neither changes the actual mesh silhouette.
The difference is how that perturbed normal is obtained. A normal map already contains directional information, while a bump node calculates a direction from a scalar height field. In both cases, the shader can make a flat surface react to light as though it contains smaller forms that are not actually modeled.
That makes both techniques useful for details that are too small to justify geometry. Fine concrete grain, brushed texture, leather pores, small scratches, shallow stone pits, and subtle plaster variation generally do not need to change an object's outline to read correctly.
True displacement becomes relevant when that limitation is visible. Deep brick mortar, large stone relief, broken rock, thick bark, deep tire tracks, or a close ground surface may need real depth at grazing angles. If the camera can clearly see the edge or self-occlusion of the form, shading alone has less room to fake it.
The correct Blender node setup for a normal map
For a normal map, load the image with an Image Texture node and change Color Space to Non-Color. Connect the image's Color output to a Normal Map node, leave its space on Tangent for a conventional tangent-space PBR normal, and connect the Normal output to the Principled BSDF Normal input.
Do not plug the RGB normal image directly into the Principled BSDF Normal socket. The shader expects a normal vector there, while the image contains encoded values that need the Normal Map node to interpret them.
Strength can be adjusted on the Normal Map node, but large values can make a material look embossed rather than more detailed. If a normal map seems much too weak or too strong, it is also worth checking the material scale and whether the texture is being mapped at the intended size before compensating with strength.
The correct Blender node setup for a height map as bump
For bump mapping, load the height texture as Non-Color and connect it to the Height input of a Bump node. Connect the Bump node's Normal output to the Principled BSDF Normal input.
The Bump node has separate Strength and Distance controls. Strength blends the bump effect, while Distance scales the interpreted height. If valleys appear as ridges, the node also has an Invert option. Blender's current documentation also exposes a Filter Width control that helps stabilize subpixel height detail.
A common mistake is connecting a grayscale height image directly to the Principled BSDF Normal input. A height value is not a normal vector, so the Bump node is the part that converts changes in the height field into a normal the shader can use.
This setup still does not move geometry. It is a shading effect, despite starting from the same kind of grayscale data that can be used for displacement.
Using normal and height maps from twirl in Blender
twirl materials currently provide separate albedo, normal, roughness, metallic, and height maps. Keeping the normal and height maps separate means you can decide how much geometric detail a particular Blender scene actually needs rather than baking that choice into the material download.
For a straightforward material, the normal map can handle the fine surface response while the height map remains available for bump or displacement. The twirl Blender page covers the broader material workflow, and twirl Connect for Blender can import completed twirl materials directly from the browser.
If you are building a surface from scratch, the AI PBR material generator produces the coordinated map set together. The height map can then be treated differently depending on whether the asset is a distant environment surface, a close render, or something where the silhouette needs actual geometry.
Can you use a normal map and a height map together?
Yes, but it helps to give each map a reason to be there. Blender's Bump node accepts an existing Normal input, so a normal-map result can be fed into the bump stage and combined with additional height-driven detail. True displacement can also be combined with bump-style shading.
Blender's Cycles material settings explicitly include a Displacement and Bump mode. The Cycles material settings documentation describes it as using displacement on a coarser mesh while bump mapping supplies the final detail. This is often a more sensible division of work than trying to reproduce every tiny pore or grain as geometry.
There is still a possibility of duplicating detail. If the supplied normal map was derived from the same height information, applying both strongly can exaggerate the surface. A practical setup is to decide which frequencies each technique should represent. Let displacement handle forms large enough to need depth, then let normal or bump mapping handle finer detail that only needs to affect shading.
When true displacement is worth using
True displacement is useful when surface depth has to survive a grazing camera angle, alter the silhouette, or create real geometric relief. Blender's Cycles documentation distinguishes this from Bump Only, which modifies the surface normal but does not produce an accurate silhouette or self-shadowing from the displaced form.
The tradeoff is geometry. A height texture cannot create detailed displacement if the mesh does not have enough vertices to move. A lightly subdivided plane driven by a detailed stone height map will still produce broad, coarse geometry because the texture has more information than the mesh can represent.
That is why displacement tends to make the most sense when the camera can benefit from it. For a distant wall, normal mapping may already produce the visible result you need. For a close rocky ground plane where stones visibly rise above one another, displacement has a clearer job.
Our height map displacement guide for Blender covers the Cycles displacement setup in more detail.
Normal maps are usually the simpler choice for real-time work
For game assets and real-time scenes, normal maps are widely used because they preserve detailed lighting without requiring the underlying mesh to contain the corresponding geometric detail. The same texture can move between Blender and a game engine as long as the normal convention and import settings are handled correctly.
The main cross-application issue is the green channel. Blender's convention and Unreal Engine's usual DirectX convention differ, so a normal map that looks correct in one can appear inverted in the other if it is imported without conversion. Our Unreal Engine PBR texture import settings guide explains the Unreal side, including normal compression and green-channel flipping.
Height data is still useful in real-time workflows, but how it is consumed depends much more heavily on the target shader and engine. If portability matters, keeping the original height and normal textures separate gives you more options than assuming one displacement setup will translate directly.
A height map is not automatically better because it can move geometry
True geometry can solve things a normal map cannot, but that does not make it a higher-quality replacement in every material. Fine detail represented as displacement needs enough geometry to exist, costs more to evaluate, and can be unnecessary when the final camera only sees the shading response.
Normal maps also contain directional information directly. They are especially useful when surface direction matters but actual depth does not need to alter the mesh. A baked hard-surface normal map, for example, can preserve shading from detailed source geometry without asking the low-poly asset to reproduce that geometry at render time.
Height maps have a different advantage: the scalar height field can be reused. Blender can derive bump from it, use it for true displacement, or feed it into other material logic. The two formats solve overlapping but not identical problems.
Which one should you use?
If the detail only needs to change how light reacts to the surface, start with the normal map. It is a direct fit for the normal textures included in most PBR sets and does not require additional mesh density. If you have a height map and want a simple grayscale-driven shading effect, use it through a Bump node.
Use true displacement when the depth itself matters. That usually means the camera is close enough to see silhouette changes, substantial relief, or self-occluding forms that normal or bump mapping cannot reproduce convincingly. Give the mesh enough subdivision, and keep the displacement scale physically restrained rather than using it as a general detail-strength control.
When a material contains both normal and height maps, there is no requirement to choose only one. A good Blender material can use real displacement for larger forms and normal or bump mapping for the smaller structure. The useful split comes from the scale of the detail and the camera, not from assuming that one map format is universally better.