In many cases ‘Build All Levels’ ends up discarding any volumetric lightmap data that should have been stored in the persistent level’s built data.
What seems to happen is that during UWorld::ReInitWorld the level’s UMapBuildDataRegistry has its RF_Standalone flag cleared. This pointer is then captured directly into FStaticLightingBuildContext without checking that it’s actually in the expected state (e.g. by getting it through GetOrCreateMapBuildData instead). Much much later when finishing up the build process - and after volumetric lightmap importing has completed - GetOrCreateMapBuildData does get called on the persistent build data (usually from some variant of FStaticLightingTextureMapping::Apply) and it realizes the RF_Standalone flags is missing and promptly discards all static lighting before recreating the object. This works for ‘Build Lighting Only’ as it doesn’t re-init the world and as such never clears that flag before starting the build.
An additional problem is that certain things (like there being non-volume brushes in the level e.g.) forces ‘Build Lighting Only’ to actually take the ‘Build All Levels’ path meaning there’s no effective workaround for cases where brushes are used in the level - and it can feel like it ‘inexplicably breaks’ for users when they haven’t made any lighting related changes to the level.
Build Lighting Only:
[Image Removed]
Build All Levels:
[Image Removed]
Build Lighting Only but there’s a brush in the level:
[Image Removed]