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.