24.2. Multisampling

Multisampling is a mechanism to antialias all Vulkan primitives: points, lines, and polygons. The technique is to sample all primitives multiple times at each pixel. Each sample in each framebuffer attachment has storage for a color, depth, and/or stencil value, such that per-fragment operations apply to each sample independently. The color sample values can be later resolved to a single color (see Resolving Multisample Images and the Render Pass chapter for more details on how to resolve multisample images to non-multisample images).

Vulkan defines rasterization rules for single-sample modes in a way that is equivalent to a multisample mode with a single sample in the center of each pixel.

Each fragment includes a coverage value with rasterizationSamples bits (see Sample Mask). Each fragment includes rasterizationSamples depth values and sets of associated data. An implementation may choose to assign the same associated data to more than one sample. The location for evaluating such associated data may be anywhere within the pixel including the pixel center or any of the sample locations. When rasterizationSamples is VK_SAMPLE_COUNT_1_BIT, the pixel center must be used. The different associated data values need not all be evaluated at the same location. Each pixel fragment thus consists of integer x and y grid coordinates, rasterizationSamples depth values and sets of associated data, and a coverage value with rasterizationSamples bits.

It is understood that each pixel has rasterizationSamples locations associated with it. These locations are exact positions, rather than regions or areas, and each is referred to as a sample point. The sample points associated with a pixel must be located inside or on the boundary of the unit square that is considered to bound the pixel. Furthermore, the relative locations of sample points may be identical for each pixel in the framebuffer, or they may differ. If the current pipeline includes a fragment shader with one or more variables in its interface decorated with Sample and Input, the data associated with those variables will be assigned independently for each sample. The values for each sample must be evaluated at the location of the sample. The data associated with any other variables not decorated with Sample and Input need not be evaluated independently for each sample.

If the standardSampleLocations member of VkPhysicalDeviceFeatures is VK_TRUE, then the sample counts VK_SAMPLE_COUNT_1_BIT, VK_SAMPLE_COUNT_2_BIT, VK_SAMPLE_COUNT_4_BIT, VK_SAMPLE_COUNT_8_BIT, and VK_SAMPLE_COUNT_16_BIT have sample locations as listed in the following table, with the $i$ th entry in the table corresponding to bit $i$ in the sample masks. VK_SAMPLE_COUNT_32_BIT and VK_SAMPLE_COUNT_64_BIT do not have standard sample locations. Locations are defined relative to an origin in the upper left corner of the pixel.

Table 24.1. Standard sample locations

VK_SAMPLE_COUNT_1_BIT

VK_SAMPLE_COUNT_2_BIT

VK_SAMPLE_COUNT_4_BIT

VK_SAMPLE_COUNT_8_BIT

VK_SAMPLE_COUNT_16_BIT

$(0.5,0.5)$

$(0.25,0.25)$ $(0.75,0.75)$

$( 0.375, 0.125)$ $( 0.875, 0.375)$ $( 0.125, 0.625)$ $( 0.625, 0.875)$

$( 0.5625, 0.3125)$ $( 0.4375, 0.6875)$ $( 0.8125, 0.5625)$ $( 0.3125, 0.1875)$ $( 0.1875, 0.8125)$ $( 0.0625, 0.4375)$ $( 0.6875, 0.9375)$ $( 0.9375, 0.0625)$

$( 0.5625, 0.5625)$ $( 0.4375, 0.3125)$ $( 0.3125, 0.625)$ $( 0.75, 0.4375)$ $( 0.1875, 0.375)$ $( 0.625, 0.8125)$ $( 0.8125, 0.6875)$ $( 0.6875, 0.1875)$ $( 0.375, 0.875)$ $( 0.5, 0.0625)$ $( 0.25, 0.125)$ $( 0.125, 0.75)$ $( 0.0, 0.5)$ $( 0.9375, 0.25)$ $( 0.875, 0.9375)$ $( 0.0625, 0.0)$