Landscape Grass Improvements (UI/UX and Functionality)

When working on Open World Natural Environments, Landscape Grass Types are an indispensable tool. However, they’ve been left mostly untouched since the 2015 Kite Demo Tech Push.

Two large areas need improvements: UI/UX and Functionality.

:bullettrain_side: :wind_face: :zap:UI/UX features to create faster:

  1. Search Function to find a specific type of mesh
  2. Grouping of meshes for better overview in the UI
  3. Naming Groups or individual varieties. (Currently it’s just numbers)

:hammer_and_wrench: :shamrock: :cactus:Functionality Features for more beautiful end results

  1. More Settings (Min/Max Slope and Height, Z Offset, Align max angle, Density-Slope Function. min/max xy rotation…)
  2. Native Clustering Support (Masks, Size falloff in clusters)
  3. In the 2020 Fortnite World building Presentation, Hierarchical Scattering was shown. Would be lovely to get this into the engine.
  4. Support Scattering of Decals
1 Like

Thats because no professional uses the landscape. Therefore, no professional uses the grass system.

Try the procedural foliage tools / make your own procedural foliage spawners.

We have many clients from various industries who use this - Ranging from virtual production, cinematics, game devs, to advertisement and automotive :slight_smile:

If you want dense, quickly-populating Cover of the landscape, there’s currently no alternative to Landscape grass types.

Besides, only Landscape grass supports shader-based scattering, which allows for a lot of customisation unlike PFS/FTs.

FTs also take up a lot of memory, if you use them at scale - as opposed to Landscape Grass.

It allows for quicker iteration and is literally impossible to create a detailed large world without it for practical and performance reasons.

Your clients are doing it wrong / you are doing it wrong for your clients.

Try the procedural generation tools. You’ll never go back to using landscape grass.

Procedural Foliage Spawner and Landscape Grass were developed at the same time, for the same project by epic.

That was in 2015 for the Kite Demo, their open world push.

Why were they developed and released together?

Because they complement each other .

Landscape Grass is great for smaller things, since it is all processed on the GPU. Downside is no complex processing and no collision support. Upside is it’s incredibly fast to spawn a lot of instances (think a grass field or lots of small little rocks in a mountain area)

Procedural Foliage Spawner works on the CPU and allows for more complex simulation. It happens on the CPU, so it supports collision.
The downside is it’s much slower and needs more memory to store it.

Both LGTs and PFS/FTs have a role to play. Hence they were developed together and complement each other.

If you are not trying to make huge, detailed outdoor open worlds that are densely populated - then you might not need them working in tandem.

But Epic Games themselves saw a need to create both of the systems and these systems continue to be used by many of the industry leaders :slight_smile:

Full stop.
You realize that the kite demo cannot run 120fps above 1080p on modern cards right?

If your goal is reaching maybe 30fps on a completed project at 1080p, then go ahead, use landscapes all you want.

If you need more prformance than that, then landscapes are trash. As trash goes, it belongs in a dump, not in people’s projects.

Landscape grass is just for landscapes, so it also belongs in a dump and not in people’s projects.

Once populated, the procedural foliage doesn’t require anything extraordinary to work and load.
And has the benefit of working on any type of mesh, not just a landscape - which no professional would use.

Thats not to say the UI doesnt need fixing btw. That is to say that either they re-design the whole landscape concept, or there is absolutely no point in updating anything because no one will ever use it…

I think you are correct in pointing out that Landscape needs to improve a lot. In terms of functionality, performance and quality.

That said, it’s being used by studios and developers around the world. Pretty sure that Epic uses it for fortnite, too.

Also, if you optimise well, a Landscape with some LGTs on it can actually run quite well.

The process of populating with Foliage is much, much slower than with Grass. Especially if you use a big initial density value. And iteration is the best friend of quality. Plus, in bigger, dense maps, map sizes can balloon extremely quickly.

For smaller Maps and if it’s not too dense - just using foliage might work.

However, in huge , dense , detailed maps - foliage exclusive workflow would mean extremely slow iteration and huge file sizes.

It doesnt. I have a 224km landscape running.
Takes maybe a minute to run a spawner and update the whole area.

Vs, using landscapes and not even being able to load the whole area.

How many FT instances do you have in that 224km landscape?

Also, using Meshes for Landscape is not a great replacement. Dynamic LODs are needed , which nanite might solve soon. However, collision, editing, paintable layers and so on are not supported by meshes.

They are. You just make your own system.
If you want performance that’s really the only way.

In terms of LODs, there is no need for them to be generated at runtime, or by the engine. A 75%, 50% 25% vert reduction per LOD works fine 90% of the time. In some cases you just add a 90% as the first reduction, move on from there.

Collision doesn’t matter for LODs, and usually you can get by with complex collision off the first mesh. Depending on how many verts each tile has anyway. In some cases you can just simplify it by using the lowest complexity LOD.

Anything except the engine allows you to generate an analytical mesh, where more density is used only where needed.

If you cut your meshes exactly as the landscape system cuts components, then you get the same culling, the same drawcalls, and great performance.

If on top of it you create a system to aggregate tiles at runtime based on view fustrum / distance (octree based), then you can even further reduce the drawcall count. Though in 99.9% of cases, just using manually (or script) placed static meshes already offers top performance, so there isn’t a drastic need for this. Its more of a nitpick, whoch with some basice c++ is fairly easy to achieve (but it is runtime based, so it can take a toll comparatively. Depends on device used. Pc great, console? Not so much).

Generally, the base process is you never do design stuff in engine. Once you start thinking that way, everything is easy, and everything you make can be exported out to other engines.

Texturing and materials are even better, since you don’t have to use the expensive landscape blend bs.
You can actually bake down your diffuse off a fully painted/blended mesh, and suffer no performance loss at all from having 20 different layers. (Sure paitning it in houdini or blender is a bit of a challange, but they use processes very similar to the layers in engine. On that note, adding a billion verts in zbrush and using polypaint to bake down to the original is also a viable solution).

The procedrual foliage tool is one of the few engine tools I still occasionally use.
(Its far better to import hism instances via a script, and to sculpt/generate positions outside the engine).
There must be around 100 blocks of different spawners, and at least 2 global ones which are in charge of grass, pebbles, random bushes, etc.
I have at least 13 grass meshes. From a clump to 10mx10m flat out zones.

I do run some of the grass off an hism where the objects are positioned from hudini via a script. (Also the 10mx10m blocks, which only go in very specific areas).

Those are for the piques and areas where the grass mesh would often fly in the air or similar.
(Note that sometimes, for particularly challanging landscape spots, its better to export the composed grass a static mesh. It won’t cull when you look at it if its combined, but it offers less drawcalls and thus slightly reduces the performance load for those areas).

Overall, to me, the important part is that if I get sick of this sorry excuse of an engine, I can use just about anything else.
When you only use engine tools only, well good luck migrating.

The engine alternative is you create your landscape. Get it all painted, and bake doen the tiles. You then create a new level with only the baked tiles as levels.

While not being able to cull component size bits of the floor, like the landscape system does, you still get 60% to 90% increase of MS processing speed just by the fact you aren’t using the landscape system.
And a next to nothing drawcall count when using 8km tiles…

Don’t forget that you do have to generate the LODs for the tiles you geberated the impostor for manually. I mean, ue4 allows you do set a couple LODs, but the result it generates was never really that good.
Even a blender pass with a limited dissolve and a 5° angle provides better results in trerms of final tris count to look…