twirl

Unreal Engine Nanite Tessellation: How to Use a Height Map for Displacement

September 23, 2026·twirl

Learn how to use a height map with Nanite tessellation in Unreal Engine, including displacement setup, Magnitude and Center, normal maps, cracks, and performance.

A height map can do more in current Unreal Engine versions than fake depth in the shader. With Nanite tessellation, Unreal can use scalar displacement to add triangles at runtime and move the resulting surface along its normal. That gives a PBR height map a way to affect real geometry instead of only changing lighting or texture coordinates.

The setup is still more specific than connecting a grayscale texture and increasing a strength value. The mesh has to use Nanite, tessellation has to be enabled on the material, the height texture needs to feed the Displacement input, and the material's Magnitude and Center settings determine how the 0 to 1 texture range becomes actual movement. Epic currently labels Nanite tessellation as experimental, so it is worth understanding the limitations before building a material workflow around it.

What Nanite tessellation does with a height map

Epic describes Nanite tessellation as dynamic programmable displacement. Unlike World Position Offset, which works on the vertices already present in the source mesh, Nanite tessellation creates additional triangles at runtime so the surface can conform to a displacement map or procedural material.

That distinction is useful for tileable materials. A relatively simple wall or ground mesh can receive geometric relief from a stone, brick, concrete, or terrain height map without requiring the source asset to contain every displaced triangle. The result can change the silhouette and surface geometry in ways a normal map cannot.

Nanite tessellation only works on Nanite meshes. Epic notes that displacement is ignored on non-Nanite meshes or where Nanite is unsupported. If a material compiles but the surface stays completely flat, confirming that the mesh is actually running through Nanite is one of the first checks to make.

How to connect a height map to Nanite displacement

Start with a Nanite-enabled mesh and a material that will use the height texture. Select the main material node and enable Tessellation under its Nanite settings. Epic's current documentation then has you connect a Texture Sample to the material's Displacement input.

The Displacement input expects a 0 to 1 value. A grayscale height texture fits that model naturally, with darker and lighter values representing different positions across the displacement range. Keep the height texture aligned to the same UVs and tiling as the base color, normal, roughness, and metallic maps. If the stone pattern repeats four times but the height map repeats once, the geometry will no longer match the visible material.

Treat the height texture as material data rather than visible color. Our Unreal Engine PBR texture import settings guide covers the broader import split between sRGB color, linear masks, normal maps, and height data. For displacement, preserving the height values matters because those values directly control where the generated surface moves.

Magnitude controls the displacement range

The material's Magnitude setting controls how much physical displacement the 0 to 1 input range represents. Epic describes it as the height from the minimum to maximum displacement value. It also affects the bounds Unreal uses for culling, so setting an unnecessarily large Magnitude has consequences beyond making the surface look exaggerated.

This is why it is better to use the available 0 to 1 range of the height map and keep Magnitude close to the amount of movement the material actually needs. Epic specifically warns against setting Magnitude to something very large and then multiplying the displacement texture down inside the graph to compensate. The larger Magnitude still expands the displacement bounds and can hurt performance, including Virtual Shadow Map performance.

For a tileable brick or stone material, start with a restrained Magnitude and judge the result at the real scale of the mesh. A displacement amount that looks reasonable on the material preview sphere can be far too large once the same texture is applied to a wall measured in meters.

Center decides which height value means no movement

Center defines which value in the displacement range corresponds to the original surface. If Center is 0.5, mid-gray represents no displacement, darker values move to one side of the base surface, and lighter values move to the other. If Center is 0, the displacement can be treated as moving outward from the original surface across the 0 to 1 range.

The right value depends on how the height map was authored and what you want the base mesh to represent. A material where mid-gray is intentionally the neutral surface can work naturally with a 0.5 center. A map authored as zero at the base with all relief rising above it may make more sense with a different center.

If a wall suddenly expands in both directions or appears offset from where you expected it to sit, do not immediately invert the height map. Check Center and Magnitude first. Those two settings define how Unreal interprets the texture range geometrically.

A height map with broad, readable relief makes it easier to judge what Nanite displacement is actually adding to the mesh.

Example prompt

weathered limestone wall, deep eroded joints, chipped stone faces, rough layered surface

Albedo
Normal
Roughness
Metallic
Height

Albedo, normal, roughness, metallic, and height — tileable PNGs.

Generate a PBR material

Using twirl height maps with Nanite tessellation

twirl currently provides separate albedo, normal, roughness, metallic, and height maps. The height map can be used as the scalar source for an Unreal displacement setup while the other maps continue to handle the rest of the material response.

For a Nanite material, keep the albedo connected to Base Color, roughness and metallic connected to their matching material inputs, and the normal map connected to Normal using Unreal's expected tangent-space convention. Feed the height texture into Displacement, then control its geometric range with Magnitude and Center rather than changing the source map just to make the effect stronger.

The twirl Unreal Engine page covers the broader material workflow, and the AI PBR material generator creates the separate five-map source set. An Unreal Engine integration is (coming soon), so material setup and engine-specific import choices are currently handled inside Unreal.

You still need a normal map

Real displacement changes the geometry, but Epic notes that Nanite displacement does not automatically change shading the way an offline displacement workflow might. Their current guidance recommends supplying a corresponding normal map or deriving a normal from the displacement derivatives.

For a normal PBR set, keeping the normal map is usually the straightforward option. The height map can handle larger forms that benefit from geometric relief, while the normal map carries smaller directional detail across the surface. The two should describe the same material structure so the displaced shape and lighting agree.

This is also a useful way to divide detail by scale. Large stone edges, mortar depth, eroded concrete, or deep ground relief may justify displacement. Fine pores, scratches, aggregate, and surface grain often remain better suited to the normal map. Pushing every small feature into geometry increases tessellation without necessarily producing a visible improvement at the camera distance.

Nanite displacement can crack at UV seams and hard edges

Nanite tessellation does not currently provide crack-free displacement. Epic calls out UV seams, hard-edge normals, and other vertex attributes that are not smooth as possible sources of cracks. That matters for tileable materials because a height texture can be perfectly seamless as an image while the mesh it is displacing still contains boundaries that separate the generated surface.

If cracks appear, first determine whether they line up with mesh seams or hard normals. Editing the height texture will not solve a split created by the mesh topology or tangent setup. A test plane with continuous UVs can help separate a texture problem from a mesh problem quickly.

The limitation also means Nanite displacement is not automatically a drop-in replacement for every offline subdivision workflow. A material can work cleanly on a continuous ground surface and expose seams when moved to a modular asset with hard edges and separate UV islands.

Object scale affects displacement

Epic currently defines Nanite displacement in local space before object scale. If you apply a tileable material to a cube and scale that cube heavily in the level to turn it into a wall, the apparent displacement can scale with the object in a way that is easy to overlook.

That can make a reusable material behave differently across instances even when the height texture and Magnitude are identical. It is worth checking transforms and real mesh scale when one object appears to have much stronger relief than another.

For environment materials that need a consistent real-world surface scale, keep both texture tiling and displacement scale in mind. The TextureCoordinate expression controls UV selection and tiling, but changing texture frequency does not automatically redefine what the material's displacement Magnitude should mean physically.

Height texture compression is visible in geometry

Compression artifacts in a roughness map can alter reflections. Compression artifacts in a displacement map can become actual steps in the surface. Epic specifically warns that displacement textures can show staircase artifacts when their stored values are compressed too aggressively.

Their Nanite documentation notes that Alpha compression using BC4 can work well in many cases and that uncompressed data may sometimes be necessary, while floating-point storage is often more than the workflow needs. Epic also cautions that packing height together with normal data in a compressed texture can expose artifacts.

There is no single compression setting that is best for every project and target platform, but the symptom is easy to recognize. If smooth height gradients become terraced after displacement, inspect the source bit depth and Unreal texture compression before adding more tessellation or increasing Magnitude.

Displacement Fade can reduce work at distance

Current Nanite materials can use Displacement Fade to reduce tessellation when the displaced detail becomes too small on screen to matter. Epic exposes Start Fade Size and End Fade Size in pixels, letting the material fade displacement out as its maximum movement occupies less screen space.

That is useful for environment materials because geometric relief that matters on a wall two meters from the camera may contribute very little when the same wall is far across a level. A normal map and the underlying material shading can continue to describe the surface after the geometric displacement has faded.

The transition should be judged in motion. If the fade range is too aggressive, you may see the surface visibly flatten as the camera moves. If it is too conservative, the project keeps paying for displaced detail after it has stopped contributing much to the image.

Nanite tessellation and static displacement are different workflows

Unreal also supports Nanite Static Displacement Mapping in the Static Mesh Editor. Epic describes that as an offline adaptive tessellation process that bakes displacement detail into an optimized Nanite mesh. Nanite tessellation, by contrast, is runtime programmable displacement driven by the material.

The distinction matters when choosing where the cost and flexibility should live. Static displacement can make sense when the displaced shape does not need to change with material logic at runtime. Material-driven Nanite tessellation is useful when displacement needs to remain part of the shader, including procedural or animated cases.

Both workflows use height information to create geometric detail, but they are not the same feature. If a tutorial tells you to add displacement maps in the Static Mesh Editor while another tells you to enable Tessellation on the material, they may be describing these two separate Nanite paths.

Why Nanite tessellation sometimes appears to do nothing

A flat result usually means one part of the chain is missing. The mesh must use Nanite, the material must have tessellation enabled, the height data must reach Displacement, and Magnitude must be large enough to produce visible movement at the object's scale. Nanite also has to be supported by the rendering configuration in which the mesh is running.

Older tutorials can add another source of confusion. Nanite tessellation changed across Unreal Engine 5 releases, and many search results still tell users to edit console variables or project configuration files before the material exposes displacement. Epic's current Unreal Engine 5.8 documentation presents the feature directly through the Nanite material settings, so use documentation that matches the engine version you are actually running rather than assuming an older enablement sequence is still required.

If the setup is correct but the result looks broken rather than flat, move on to Center, object scale, seams, texture compression, and displacement bounds. Those issues affect an active displacement setup differently from a material where tessellation never engaged in the first place.

When Nanite displacement is worth using

Use geometric displacement when the height information needs to affect the shape you actually see. Deep mortar, layered rock, damaged concrete, terrain relief, and other forms that become obvious at grazing angles are stronger candidates than fine surface noise.

A normal map is cheaper conceptually and often sufficient when the camera only needs the lighting response. Epic's material input documentation treats Normal and Roughness as separate surface inputs, while Nanite displacement adds another geometric layer on top of that normal PBR material. You do not need displacement simply because a height map exists in the texture set.

For a practical setup, get the base PBR material working first. Verify base color, roughness, metallic, and normal orientation, then add height-driven displacement with a small Magnitude. Check the silhouette, grazing angles, seams, and distance behavior before increasing tessellation. The useful amount of displacement is the amount the shot can actually see, not the maximum relief the height texture can produce.

What to do next

Try it

Generate a PBR material

Type a surface and get tileable albedo, normal, roughness, metallic, and height maps. Five free generations a day.

Open twirl
Read next

How to Use a Height Map in Unity URP

Learn how Unity URP uses height maps for parallax mapping, how to connect a PBR height texture to the Lit shader, and when a normal map is the better choice.

Continue reading

Sources

Epic Games: Working with Nanite-Enabled Content

Epic Games: Nanite Virtualized Geometry

Epic Games: Material Inputs

Epic Games: Coordinates Material Expressions

twirl

© 2026 twirlTerms·Privacy