Fragment Density Map Operations
Fragment Density Map Operations Overview
When a fragment is generated in a render pass that has a fragment density map attachment, its area is determined by the properties of the local framebuffer region that the fragment occupies. The framebuffer is divided into a uniform grid of these local regions, and their fragment area property is derived from the density map with the following operations:
Fetch Density Value
Each local framebuffer region at center coordinate (x,y) reads a texel from the fragment density map.
First, the local framebuffer region center coordinate (x,y) is offset by the value specified in VkRenderPassFragmentDensityMapOffsetEndInfoEXT. If no offset is specified, then the default offset (0,0) is used. The offset coordinate (x',y') is computed as follows:
The offset fragment coordinate (x',y') reads a texel from the fragment density map at image coordinates (x,y,0,layer,0,0), where (x,y) are calculated as:
Where the size of each region in the framebuffer is:
If using vkCmdBeginRendering, then and are defined as:
using VkRenderingInfo::renderArea.
This region is subject to the limits in
VkPhysicalDeviceFragmentDensityMapPropertiesEXT and therefore the
final region size is clamped:
When multiview is enabled for the render pass and the fragment density map
attachment view was created with layerCount greater than 1, the
layer used for offsets and for fetching from the fragment density map is:
Otherwise, if the render pass was created with
VK_RENDER_PASS_CREATE_PER_LAYER_FRAGMENT_DENSITY_BIT_VALVE specified,
or the dynamic render pass was begun with
VK_RENDERING_PER_LAYER_FRAGMENT_DENSITY_BIT_VALVE specified,
then the layer used is:
Otherwise:
The texel fetched from the density map at (x,y,0,layer,0,0) is next converted to density with the following operations.
Component Swizzle
The components member of VkImageViewCreateInfo is applied to the
fetched texel as defined in Image component
swizzle.
Component Mapping
The swizzled texel’s components are mapped to a density value:
Fragment Area Conversion
Fragment area for the framebuffer region is undefined if the density
fetched is not a normalized floating-point value greater than 0.0.
Otherwise, the fetched fragment area for that region is derived as:
Fragment Area Filter
Optionally, the implementation may fetch additional density map texels in an implementation defined window around (i,j). The texels follow the standard conversion steps up to and including fragment area conversion.
A single fetched fragment area for the framebuffer region is chosen by the implementation and must have an area between the min and max areas of the fetched set.
Fragment Area Clamp
The implementation may clamp the fetched fragment area to one that it supports. The clamped fragment area must have a size less than or equal to the original fetched value. Implementations may vary the supported set of fragment areas per framebuffer region. Fragment area (1,1) must always be in the supported set.
The clamped fragment area is assigned to the corresponding framebuffer region.