It is a little hard to show how shadow mask bits buffer works, so let me temporally add a ground:
And the shadow mask bits buffer is like this:
Which is projected in VirtualShadowMapProjection
pass.
<aside> ℹ️ /Engine/Private/VirtualShadowMaps/VirtualShadowMapProjection.usf
</aside>
To simplify the light rendering pass, we should convert the shadow map, which is discretely saved in the physical page pool texture, back into a screen-sized buffer.
A brief explaination is:
Regarding the result, it is a uint4 texture where each pixel can represent 16 light sources. Each light source can save a 16-level shadow factor.
In a classic shadow map, we only need to save one bit to indicate whether a pixel is in shadow or not. However, to render soft shadows, we need to know how much the light source is occluded. That's why we need more information than just a binary indicator.
The official documentation: https://docs.unrealengine.com/5.0/en-US/virtual-shadow-maps-in-unreal-engine/#softshadowswithshadowmapraytracing.
To see a soft shadow, you need to increase the radius of the point light.
From: https://en.wikipedia.org/wiki/Umbra,_penumbra_and_antumbra