Questions on Best Practices for Nanite: LOD Interaction and ISM/HISM Combination

Hello,

I’m using Unreal Engine 5.6.1 and am actively utilizing Nanite. During my optimization process, I need clear guidelines on the following two topics.

1. Usage of LODs with Nanite Meshes: My understanding is that Nanite replaces the rendering LOD system. However, seeing settings like ‘LOD For Collision,’ I suspect that traditional LODs are still important for non-rendering purposes, such as physics or as a fallback for platform compatibility. I would like to know if this approach is correct and what Epic’s recommended asset creation workflow or best practices are in this regard.

2. Combination of Nanite and ISM/HISM: I would like to know the performance benefits of using Nanite meshes with ISM, as well as any potential issues or pitfalls to be aware of. I am seeking an expert’s opinion on whether this combination is currently the best choice for large-scale scenes.

Thank you in advance for your answers.

Hey there! You’ll still need traditional LODs for your static meshes since they’re used for both complex collision (which you should probably only use selectively, otherwise “Use Simple As Complex” usually suffices), raytracing/Lumen, and for drawing into Runtime Virtual Textures. In most cases, you can get away with setting the Num LODs to something like 4, and setting the Fallback Relative Error value to something greater than 1. This will have the engine auto-generate LODs, where LOD0 is generated using Nanite simplification, and subsequent LODs are generated the old fashioned way with the Triangle Percent value.

For HISMs and ISMs our recommendation is to use HISMs only if you’re targeting non-Nanite platforms. There’s a marginal savings from using ISMs over HISMs in those cases but that cost is negligible compared with the cost of not using HISMs on non-Nanite platforms.

Hope that helps! Let me know if you’ve got any other questions.

Hi. I have a few more questions on this topic:

1) If ISM is better over HISM for nanite enabled platform, shouldn’t UFoliageInstancedStaticMeshComponent be changed to ISM (it’s now on HISM)

2) You said ISM has marginal savings over HISM: is this true for performance and memory on fast and slow platforms?

3) Do you have plans for instanced spline meshes?

4) Is there a use case where HISMs win over ISMs?

and for lods:

1) What does lumen use LODs for? Rendering cards? I thought it uses fallback mesh on nanite enabled meshes.

2) Runtime VT writing of nanite enable meshes didn’t work when I tried (it didn’t use lod 0 nor 1): is there a new support I don’t know?

Thanks.

Hi, based on the Nanite documentation:

The Fallback Mesh is used when Nanite rendering is not supported. It is also used when it wouldn’t be ideal to use the full-detail mesh, like when a complex collision is needed, using lightmaps for baked lighting is required, and for hardware ray tracing reflections with Lumen.

It seems that the fallback meshes are used in other parts of the rendering. Is it possible to get a complete list of where the fallback mesh is needed?

For example, in a building, do I need a very optimized fallback mesh with the correct materials and texture representation, or is a simple white cube enough? (If I’m already using custom collision and don’t need lightmap baking).

Thank you.

1) We can’t change the parent class of FoliageISM because we can’t guarantee that all projects are shipping only Nanite platforms. And, like I said, the impact is negligible. At this point though I’m expecting more foliage work to shift from the Foliage editor to PCG-based workflows and you can specify your base class there.

2) I only tested on a Gen9 console, I haven’t run that test on the full gamut of hardware.

3) I’m not aware of any plans on that front

4) Only for non-Nanite

For Fallback Meshes:

1) Lumen uses fallback meshes in HWRT to trace against in the Lumen Scene (as opposed to distance fields with SWRT), and the fallback mesh is the traditional LOD chain. (Although we recently introduced a separate option for a raytracing fallback mesh that can be used separately from the complex collision or non-Nanite fallback)

2) Nothing new on this front, it’s still an open issue. You have to set a component to explicitly disallow Nanite in order for it to draw into RVT.

You’ll want a nicely optimized fallback mesh because that’s what Lumen is tracing against in the Lumen Scene. If you just put in a white cube then your reflections and/or GI will look wrong when that part of the mesh isn’t hit with screen traces (for example, if it’s partially or wholly off screen but still reflecting).

Thanks.

When you say “and the fallback mesh is the traditional LOD chain”, do you mean that the fallback mesh can have lods now?

Or is it still 1 mesh without lods?

I’m asking because if you have lods, triangle reduction target set to 0, minimum lod 1, editor selects the lod 1 as fallback mesh BUT if you choose to show lod 2 in mesh editor it changes the fallback shown

Hey Marco! Sorry for the delay, I’ve been off at and recovering from Unreal Fest. I mean there’s no difference between the fallback mesh and the you used to set up LODs for your static meshes. The engine just uses those as the fallback and it theoretically (at least as I understand it) LOD, especially if Nanite is disabled.

You might want to open a separate ticket if you’re seeing weird discrepancies in behavior so we can get it assigned to the right person. This thread is getting a little fragmented.