LmCast :: Stay tuned in

Graphic Rants: Nanite Tessellation

Recorded: Sept. 14, 2026, 3:09 p.m.

Original Summarized

Graphic Rants: Nanite Tessellation

Graphic Rants

Graphical, textual ramblings of a coder.

Sunday, February 1, 2026

Nanite Tessellation

Nanite Tessellation, aka Nanite Dynamic Tessellation, aka Nanite Dynamic Displacement was the next major feature I worked on after Nanite itself. Initial prototypes started back in 2020, only months after showing Nanite publicly for the first time. UE5 still hadn’t even been released to customers yet. After a couple years of shipping Nanite in things and then a couple of years more of development, Nanite Tessellation finally shipped in UE 5.4 in 2024. I started this write up shortly after but it has taken far longer to complete than I ever expected. Needless to say, publishing all this has been a long time coming. It will come in a series of posts starting with this one.

List of posts:

Intro
Possible approaches
How to tessellate
Nanite + Reyes
Variable sized work
Vertex deduplication / Post transform cache (coming soon)
VisBuffer / Deferred materials
Wrapping up

What is Nanite Tessellation?
A system for dynamically tessellating meshes and displacing them. The displacement comes from a shader graph, authored in UE’s material editor. This tessellation is in addition to what Nanite already provides.

Tessellation demoed at GDC in Marvel 1943: Rise of Hydra

Patches

Diced triangles

Final pixels

Why?
Why is geometry amplification needed when we have Nanite? I’ve argued in the past that amplification approaches to the virtualized geometry problem were not good enough, so why would I start working on it now? Have I changed my mind? No. My argument was that amplification approaches are not a general purpose solution to the virtualized geometry problem. They do not solve all cases. They can’t change the genus of a surface. A simplification approach would always be needed. If you have that it could also solve amplification in a way. A mesh could always be synthesized, subdivided, tessellated, and/or displaced offline. Then simplification can reduce it down. This ignores the data storage implications but it does show that it is the more general purpose solution to that problem.

So we have that now. It’s called Nanite and is pretty cool. It was the right thing to work on first. But just because this solution is general purpose enough that it can be used for these other cases does not mean it is ideal for them. Storing full topology of an irregular mesh covers all cases but is expensive. Storing every position on the surface as a full 3d point with a complete set of attributes is expensive. We do our best to compress that data but nothing beats not having that data at all.

Compression
Scalar displacement fields, whether they are artist authored maps or captured through projection of a detailed surface to a simpler one, are much less data. 1 value compared to 5+. Compression of regular 2D data, ie images, in relation to human perception is vastly more researched and well understood.

Comparison of disk size for high poly vs low poly with normal and displacement maps

Even better data compression than that are procedural texturing approaches. What do I mean by procedural texturing? I don’t just mean mathematical functions like Perlin noise. I might be pushing the definition a bit but even simple texture tiling in a way is a form of procedural texturing. But certainly once shaders are involved where multiple textures are mixed and modified we are in the realm of procedural. The simplest form of this is detail texturing. A much higher frequency signal can be represented than stored explicitly. Viewed statically like this, the compression ratio can be far higher than is achievable through any other means.

Authoring
But beyond data compression, procedural content generation can be an incredibly effective time saver for an artist. It also can be reusable, dynamic, and animatable. By reusable I mean that a base material type, like snow, can be authored once and applied to many surfaces. By dynamic I mean the same asset can accumulate snow over time by changing the shader parameters, all the way to full animation like a moving lava field flow.

Displacement maps are extremely common in film and the primary reason for their use is not data compression. A good bit of it is tooling and while I could say that should be improved and is someone else’s responsibility to keep up with Nanite’s capabilities, the fact of the matter is I can’t snap my fingers and change all the DCCs. Even if every application were all optimized to better work with high poly meshes there is always something inherently simpler with 2d textures, and displacement maps are no different.

Displacement’s use in film also helps animation. For a character the base cage can be rigged and deformed. The deformed cage can then be smoothly subdivided and displaced to get the final detail. This simplifies the rigger’s and animator’s concerns and separates them to an extent from the sculptor who might carve out individual dragon scales.

The last use case is specific to games. Scalability is an important consideration for Fortnite as well as other games that still need to support lower end platforms that aren’t powerful enough to run the Nanite pipeline. We can easily generate low poly fallback meshes through the same mesh simplification algorithm that Nanite uses, but what is fine for the distance isn’t necessarily good enough for up close. The art of low poly modelling is often a matter of abstraction of shape and artists are much more picky about the results. They will also move detail between domains, from mesh to texture, that requires involvement of other assets that is difficult or impossible to automatically do reliably. For these reasons, when a large scalability range is required, like with Fortnite, our art teams have been more comfortable authoring for low or mid in the scalability range and amplifying up rather than authoring for high and simplifying down.

Posted by

Brian Karis

at

8:27 PM

Newer Post

Older Post

Home

About Me

Brian Karis

I am a Engineering Fellow at Epic Games. This blog is a place for me to dump game and graphics related thoughts and share with the greater graphics community.

View my complete profile

Blog Archive

▼ 

2026

(5)

► 

March

(1)

▼ 

February

(4)

Nanite + Reyes
How to tessellate
Possible approaches for tessellation
Nanite Tessellation

► 

2018

(4)

► 

May

(4)

► 

2014

(1)

► 

March

(1)

► 

2013

(3)

► 

December

(1)

► 

August

(1)

► 

July

(1)

► 

2012

(2)

► 

May

(1)

► 

April

(1)

► 

2011

(2)

► 

August

(1)

► 

January

(1)

► 

2010

(1)

► 

January

(1)

► 

2009

(6)

► 

November

(1)

► 

October

(1)

► 

April

(1)

► 

February

(1)

► 

January

(2)

► 

2008

(8)

► 

November

(3)

► 

August

(5)

Simple theme. Powered by Blogger.

Nanite Tessellation, also referred to as Nanite Dynamic Tessellation or Nanite Dynamic Displacement, is a system designed for dynamically tessellating meshes and displacing them through a shader graph authored in the Unreal Engine material editor, operating in addition to the functionality provided by Nanite itself. This system addresses the need for geometry amplification within the context of virtualized geometry. The motivation for developing tessellation methods stems from the argument that amplification approaches are insufficient as a general solution for the virtualized geometry problem because they cannot handle changing the genus of a surface, suggesting that a simplification approach is a more general solution.

The challenge lies in data storage, as storing the full topology of an irregular mesh is expensive, requiring the system to look for more efficient data representation. Scalar displacement fields, whether artist-authored maps or projections of detailed surfaces onto simpler ones, require less data storage compared to storing full topology or a complete set of vertex attributes. While compression methods exist for regular 2D data like images, procedural texturing offers superior data compression by representing high-frequency signals through functions rather than storing them explicitly, leading to higher compression ratios.

Beyond data efficiency, procedural content generation offers significant advantages for artists by acting as a time saver, enabling the creation of reusable, dynamic, and animatable assets. This allows base material types to be reused across multiple surfaces and enables the accumulation of effects, such as snow accumulation or flowing lava, by modifying shader parameters, which can extend to complex animations. Displacement maps are widely used in film; their utility there is less about data compression and more about tooling assistance, separating the concerns of rigging and animation from the sculptor's work on surface detail.

In gaming contexts, scalability is crucial for platforms with limited computational power. While low poly fallback meshes can be generated using the same simplification algorithms as Nanite, the artistic consideration of abstraction and detail transfer complicates automated scaling. Therefore, an approach where artists author for lower or mid-range detail and subsequently amplify upward, rather than simplifying down, is often preferred to maintain visual fidelity and art direction. This perspective informs how art teams manage the relationship between mesh, texture, and other assets when scalability ranges are required.