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) fetches a texel from the fragment density map.
First, the local framebuffer region center coordinate (x,y) is offset by the value specified in VkSubpassFragmentDensityMapOffsetEndInfoQCOM. If no offset is specified, then the default offset (0,0) is used. The offsetted coordinate (x',y') is computed as follows:
The offsetted coordinate (x',y') fetches a texel from the fragment density map at integer coordinates:
-
\(i = \left\lfloor{\frac{x'}{fragmentDensityTexelSize_{width}}}\right\rfloor\)
-
\(j = \left\lfloor{\frac{y'}{fragmentDensityTexelSize_{height}}}\right\rfloor\)
Where the size of each region in the framebuffer is:
-
\(fragmentDensityTexelSize'_{width} = {2^{\lceil{\log_2(\frac{framebuffer_{width}}{fragmentDensityMap_{width}})}\rceil}}\)
-
\(fragmentDensityTexelSize'_{height} = {2^{\lceil{\log_2(\frac{framebuffer_{height}}{fragmentDensityMap_{height}})}\rceil}}\)
This region is subject to the limits in
VkPhysicalDeviceFragmentDensityMapPropertiesEXT
and therefore the
final region size is clamped:
-
\(fragmentDensityTexelSize_{width} = \mathbin{clamp}(fragmentDensityTexelSize'_{width},minFragmentDensityTexelSize_{width},maxFragmentDensityTexelSize_{width})\)
-
\(fragmentDensityTexelSize_{height} = \mathbin{clamp}(fragmentDensityTexelSize'_{height},minFragmentDensityTexelSize_{height},maxFragmentDensityTexelSize_{height})\)
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:
The texel fetched from the density map at (i,j,layer) 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.
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.
For example, if the fetched fragment area is (1,4) but the implementation only supports areas of {(1,1),(2,2)}, it could choose to clamp the area to (2,2) since it has the same size as (1,4). While this would produce fragments that have lower quality strictly in the x-axis, the overall density is maintained. |
The clamped fragment area is assigned to the corresponding framebuffer region.