Landscape best practice (Nanite/Worldpartition/HLOD)

Hello,

Since my update to UE 5.2 preview I have detected that we can enable Nanite on landscape.

It trigger some questions about landscape current/future best practices :

  • Is it a good thing to enabled nanite for large open worlds landscape?
  • Should it be used in or out of world partition grid?
  • With or without Hlod?

have a nice day.

You can enable Nanite on landscapes in 5.1. The button isn’t a new 5.2 thing. It’s experimental I think so not sure about stability or best practices…there’s nothing in the roadmap for Nanite landscape so I imagine that despite the button being there it’s probably still not in a finished state

I’d imagine they’d be excited to tell us we can have landscape displacement again without dealing with VHFM if it was coming, but I haven’t heard anything on this for quite some time.

The way the landscape works is actually incompatible with nanite.

So my guess is that they aggregate lods and merge them at runtime to render with less drawcalls by having nanite do the work.

I belive this could eventually lead to not requiring us to bake distant mesh impostors, which workflow wise is a good thing.

As far as best practice goes - nothing they are doing now is best for anyone;
Hlods are still broken I think, an the new system is worse than the old one.

Landscape displacement has always been BS. Use meshes specifically crafted for what you need (snow? Mud?) Or use the virtual height field which is actually far more powerful than what you need. Either solution will provide a much better end product to boot.

Quick Nanite vs no Nanite landscape test.
Quadro rtx 5000, 64gb ram.
Test Unreal 5.2 p1.

56*56km

No Nanite:
Lod distribution 0.6, 1.25.1.5

Lumen, Lumen, Virtual shadow maps, TSR
play standalone 7-9ms

Screen space, Screen Space, Shadow maps TAA
play standalone 3.3-4ms * the winner*

Nanite:
Lumen, Lumen, Virtual shadow maps, TSR
play standalone 8.5-9.5ms

Screen space, Screen Space, Shadow maps, TAA
play standalone 5.2-6.4ms

3 Likes

Interesting.
So the winner use not even world parition or HLODs? Lod distribution is the landscape integrated lod system?
Lumen and virtual shadow maps should be better in visual quality?
The timing is the GPU one ? What about the CPU?

Sort of.
Its the ratio of what tiles from the components (the ones you pick when crearing to be either 1x1 or 2x2, also the smallest part of the landscape) is visible with LOD0 - the highest vertex density option with 1vert per meter.

Back in 4.18 this used to be set to a distance. Then they decided to fk up the engine and made it a density value. Completely destroying the back end calculations in the process.

As I mentioned the HLOD system is probably still bugged. Not that it matters.

Your biggest difference is probably going to be world partition vs world composition in terms of CPU.

Probably not. This depends on a miriad of things. For one, the system is still trash in a Beta state.

For 2, the epic team doesn’t gaf about performance so before they fix it - if they ever do - it will always perform worse than whaver else.

For 3… you’ll never beat the cost of static lighting anyway? It isn’t really even a consideration for most devs since we almost always need a dynamic day/night cycle…

For 4… what looks “good” to you could look like a pixelly blob mess to me and viceversa. So what looks better is most definitely always arguable…

If you like it or not - the current best way to realize mid - to large landscapes in Unreal Engine 5.1+ is to not use World Partition and to not use Nanite, but instead to import separate landscapes and then manually create HLOD inis for those (cause auto generation is of course also broken …).

It is what it is … And it becomes less and less an engine for games.

2 Likes

There is a strange discrepancy between comment we have in this post and the hype there is for upcoming ue5 games :stuck_out_tongue:

2 Likes

You expect gamers (who consider stuff like Dark Souls to be great) to know their head from their … ?
:stuck_out_tongue_winking_eye: