Strategies for reducing landscape complexity ...

Try using Custom UVs vs the Vertex Shader. Put your maths here:

Pic

ref: Customized UVs in Unreal Engine Materials | Unreal Engine 5.3 Documentation

Then you can use TexCoord(x) to sample that UV channel.

As for tiling, it doesn’t have to (using RVTs here):

Pic

FYI, you can use customized UVs on any material, on the landscape side feeding into the RVT and on the heightmesh side when you read out:

Pic


Using a temporally-stochasticly-blended material to help eliminate tiling. The ‘user interpolators’ is the carried-maths I run of the customized UVs, so as you can see, you have some capacity here.

If you want to use a minimum of texture-samples and have a way to eliminate tiling, start here: Randomized tiling function, eliminate repeating patterns in your textures!. All I did was extend it to 3axis.

It DOES use temporal sampling (which I know can be unpopular). The stock denoiser is OK, but suffers as you use less and less of the screen as a base. I find the denoiser in the DLSS 2+ packages have been near perfect, even under close examination when I literally am inches from my screen looking for visual-artifacts; I likey. IF you choose to upscale, this solution appears to work well even down to ~40ish percent before you notice some speckling at distance.

To the concern around using a wide texture set, texture-palette, I use a texture-array. For the uninitiated, you can pack a bunch of (similarly-sized!) textures into an array. In a material, you can append X to your 2channel UVs and pass in a 3vec. The 3rd value is what texture in the array you are picking from. It saves some samples/slots and in the object-explorer, appears to offer a modest savings in space.

Lastly, regarding my particular implementation, these particulars won’t work if you are painting PBR information into the RVT. I track alphas for rock, dirt, veggies, water, etc. This lets me do-stuff in the heightmesh independently of the RVT; what you end up seeing PBR-wise isn’t set in stone b/c such is not s rendered into the RVT; only alpha information. I can do dynamic stuff on the heightmesh side of the house, so things like raindrops, running water, etc can be animated (and even that layer can be part of the texture-array!). As well, since it’s alpha, anything else that can sample the RVT can ‘know about’ the landscape and react accordingly like materials for foliage, rocks, etc. It’s not just a visual-sink but a meta-information-sink.

So! It offers advantages but also drawbacks but to illustrate that the various challenges CAN be overcome. RVTs tend to be more performant, for me, vs using a plain landscape, then if you add nanite + displacement it drops even more.

Applications abound. Have fun!

1 Like