Building HLODs for Nanite landscapes results in weird base capping

Hello team, I am trying to build non-spatially loaded HLODs for our Nanite landscape in order to get it in the Farfield.

When building any type of HLODs (Instanced, Mesh Approximated, Simplified) some extra geometry gets generated on the edges of each component.

Landscape wireframe:

[Image Removed]

HLOD:

[Image Removed]

This issue is not visible when generating HLODs for non-Nanite landscapes.

I am aware the recommended approach is to have Nanite landscapes be non-spatially loaded but we need the HLOD for Farfield occlusion in HWRT.

Any insight on either of those issues will be amazing, thank you.

Steps to Reproduce

  1. Open new World Partition level
  2. Add a landscape
  3. Enable Nanite on landscape
  4. Build HLODs

Hi,

thanks for reaching out. This is in fact intended behaviour: when dealing with Nanite meshes, there is some extra geometry created around the edges of the HLOD landscape tiles forming a so-called “skirt” (i.e. another set of triangles after the outer rows/columns of the landscape streaming proxy’s vertices, at a downwards 45 deg angle), which intersect with each other to ensure there is no visible gap between the tiles.

The following topics have some more info about that:

  • [Content removed]
  • [Content removed]
  • [Content removed]

Let me know if this is helpful or if you have further questions.

Best,

Sam

Hi,

there is currently no easy way to control the skirt’s depth, besides changing it directly in the code (it is not exposed in the UI or via CVars). The relevant code part is in LandscapeHLODBuilder.cpp (see this commit: “When dealing with landscape HLODs that are Nanite enabled, we add a skirt around the edge of the generated mesh. Make sure to use a custom depth for this skirt, that is the length of a quad at the exported resolution.”):

// Use a full tile size (at the ExportLOD LOD) as the skirt depth, this will cover all possible gap scenario // and avoid the skirt clipping through neighborhood tiles/HLODs const int32 ComponentSizeVerts = (LandscapeProxy->ComponentSizeQuads + 1) >> LandscapeLOD; const float ScaleFactor = (float)LandscapeProxy->ComponentSizeQuads / (float)(ComponentSizeVerts - 1); ExportParams.SkirtDepth = ScaleFactor; You can experiment with different values for the ScaleFactor (or SkirtDepth). For LOD 0, it should be equal to 1.

Hopefully that helps. Please let me know if you have further questions.

Thanks,

Sam

Thank you for the information - yes this now makes more sense.

Are we able to control how long the “skirt” in the HLOD is? We have Nanite Skirt disabled on our landscape and changing the skirt depth does not affect the HLOD output.