Tip: Easy method to display different assets on ES2 vs ES3 (Metal) devices

For anyone looking for a straightforward way to display different geometry and materials on non-metal (ES 2.0) vs metal (ES 3.0) devices, here is how we did it.

Benefit: Assets can be optimized for specific hardware, so you don’t need a one-size fits all approach
Drawback: This disables the LOD system, so only one level of LOD is visible at all times

Here’s the magic command: r.forceLOD can be used to strictly enforce a specific static mesh LOD level globally (I assume this was used for testing purposes only at Epic).

We use +CVars=r.forceLOD=0 on all metal/ES3 level devices and +CVars=r.forceLOD=1 for all lower-end devices in our DefaultDeviceProfiles config.

LOD 0 meshes are use lit materials and cast shadows, and use additional effects such as normal maps and metallic effects. LOD 1 meshes use unlit materials and pre-baked lightmaps (polycount isn’t an issue so we didn’t change meshes, but that could be done) with no shadow casting.

This can be as granular as you need; additional LOD levels can be created and used that could be optimized for even lower-end hardware or for more advanced effects on the high end.

The downside here is that it overrides the LOD system, so only 1 level of LOD is visible at all times, and no transitions are possible between LOD levels. In our case we use a fixed camera and all geometry is at relatively the same distance from the camera, so additional LOD levels aren’t required. For games that need to use LOD transitions to optimize distant objects this method would not be ideal.

Great tip Crinity! We will use that in our new 3d game, thanks!

btw. Did you managed to use LOD groups settings for textures as well? From our investigation UE4 source isn’t looking for those settings like UE3 did :frowning: We need to find a way to use smaller texture size on mid-ends using just configs as we did in Android based games when working on UE3.

You should be able to use this technique to swap in lower-resolution textures. As an example, on low-end devices you might use r.ForceLOD 1 - all your LOD 1 assets will be set up to use lower poly models as well as unlit materials that use lower-resolution textures. Essentially, each LOD level can use completely different assets, from meshes to materials and textures.

Doesn’t this double up on the shader count though???