The IndexedVolume i mentioned in the thread (basically the spatial index) handles the rendering instead the default linear approach of THREE and does all the LOD decisions, rendering the meshes regulary, auto-instanced, or any of these as impostor and depending on occurrences+density clusters of impostors.
However the VHI is basically a standalone module so for the tests i just extended the Mesh class and use a callback to check the distance and swap the material and geometry of the mesh on the fly, that should be more compact and more performant than using layers.
Like i said the impostors are more of an actual mesh, rendered with the original material extended with the impostor code, the impostor consists of their structure maps like geometry, albedo, roughness etc, so the final “billboard” is doing the work of a regularly rendered mesh. It’s not as cheap as a plain solid sprite, but integrate seamlessly like meshes in disguise (literally impostor ) and since impostors are small/in distance and only rendered flat, not across many triangles that’s not really an issue, they don’t even need to interpolate the textures or mipmaps.
For the clusters i mentioned above i use a lower quality settings. You need to imagine how small objects get at a certain distance where you can trade more error for more performance.
Yes cast and receive, but it depends on the asset at what distance they become an impostor, a lot are already outside the CSM range where the volume ambient occlusion does the rough shadowing.
There are some sort of morphing techniques too, it mostly becomes an issue when the 2 blending frames have a different silhouette. But even if you got visible popping, as long as it’s not a huge amount of objects that simultaneously pop at a certain angle it isn’t too bad, you could also prioritize the alpha discard value between both frames around the axis in order to reduce having 2 50% blended frames that might have a complete different silhouette.