Samplers
VkSampler objects represent the state of an image sampler which is
used by the implementation to read image data and apply filtering and other
transformations for the shader.
Samplers are represented by VkSampler handles:
// Provided by VK_VERSION_1_0
VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkSampler)
To create a sampler object, call:
// Provided by VK_VERSION_1_0
VkResult vkCreateSampler(
VkDevice device,
const VkSamplerCreateInfo* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
VkSampler* pSampler);
-
deviceis the logical device that creates the sampler. -
pCreateInfois a pointer to a VkSamplerCreateInfo structure specifying the state of the sampler object. -
pAllocatorcontrols host memory allocation as described in the Memory Allocation chapter. -
pSampleris a pointer to a VkSampler handle in which the resulting sampler object is returned.
The VkSamplerCreateInfo structure is defined as:
// Provided by VK_VERSION_1_0
typedef struct VkSamplerCreateInfo {
VkStructureType sType;
const void* pNext;
VkSamplerCreateFlags flags;
VkFilter magFilter;
VkFilter minFilter;
VkSamplerMipmapMode mipmapMode;
VkSamplerAddressMode addressModeU;
VkSamplerAddressMode addressModeV;
VkSamplerAddressMode addressModeW;
float mipLodBias;
VkBool32 anisotropyEnable;
float maxAnisotropy;
VkBool32 compareEnable;
VkCompareOp compareOp;
float minLod;
float maxLod;
VkBorderColor borderColor;
VkBool32 unnormalizedCoordinates;
} VkSamplerCreateInfo;
-
sTypeis a VkStructureType value identifying this structure. -
pNextisNULLor a pointer to a structure extending this structure. -
flagsis a bitmask of VkSamplerCreateFlagBits describing additional parameters of the sampler. -
magFilteris a VkFilter value specifying the magnification filter to apply to lookups. -
minFilteris a VkFilter value specifying the minification filter to apply to lookups. -
mipmapModeis a VkSamplerMipmapMode value specifying the mipmap filter to apply to lookups. -
addressModeUis a VkSamplerAddressMode value specifying the wrapping operation used when the i coordinate used to sample the image would be out of bounds. -
addressModeVis a VkSamplerAddressMode value specifying the wrapping operation used when the j coordinate used to sample the image would be out of bounds. -
addressModeWis a VkSamplerAddressMode value specifying the wrapping operation used when the k coordinate used to sample the image would be out of bounds. IfunnormalizedCoordinatesis VK_TRUE,addressModeWis ignored. -
mipLodBiasis the bias to be added to mipmap LOD calculation and bias provided by image sampling functions in SPIR-V, as described in the LOD Operation section. -
anisotropyEnableis VK_TRUE to enable anisotropic filtering, as described in the Texel Anisotropic Filtering section, or VK_FALSE otherwise. -
maxAnisotropyis the anisotropy value clamp used by the sampler whenanisotropyEnableis VK_TRUE. IfanisotropyEnableis VK_FALSE,maxAnisotropyis ignored. -
compareEnableis VK_TRUE to enable comparison against a reference value during lookups, or VK_FALSE otherwise.-
Note: Some implementations will default to shader state if this member does not match.
-
-
compareOpis a VkCompareOp value specifying the comparison operator to apply to fetched data before filtering as described in the Depth Compare Operation section. -
minLodis used to clamp the minimum of the computed LOD value. -
maxLodis used to clamp the maximum of the computed LOD value. To avoid clamping the maximum value, setmaxLodto the constant VK_LOD_CLAMP_NONE. -
borderColoris a VkBorderColor value specifying the predefined border color to use. -
unnormalizedCoordinatescontrols whether to use unnormalized or normalized texel coordinates to address texels of the image. WhenunnormalizedCoordinatesis VK_TRUE, the range of the image coordinates used to lookup the texel is in the range of zero to the image size in each dimension. WhenunnormalizedCoordinatesis VK_FALSE, the range of image coordinates is zero to one.When
unnormalizedCoordinatesis VK_TRUE, images the sampler is used with in the shader have the following requirements:-
The
viewTypemust be either VK_IMAGE_VIEW_TYPE_1D or VK_IMAGE_VIEW_TYPE_2D. -
The image view must have a single layer and a single mip level.
When
unnormalizedCoordinatesis VK_TRUE, image built-in functions in the shader that use the sampler have the following requirements: -
The functions must not use projection.
-
The functions must not use offsets.
-
|
Mapping of OpenGL to Vulkan Filter Modes
There are no Vulkan filter modes that directly correspond to OpenGL
minification filters of Note that using a |
The maximum number of sampler objects which can be simultaneously created
on a device is implementation-dependent and specified by the
maxSamplerAllocationCount member
of the VkPhysicalDeviceLimits structure.
|
For historical reasons, if |
Since VkSampler is a non-dispatchable handle type, implementations
may return the same handle for sampler state vectors that are identical.
In such cases, all such objects would only count once against the
maxSamplerAllocationCount limit.
VK_LOD_CLAMP_NONE is a special constant value used for
VkSamplerCreateInfo::maxLod to indicate that maximum LOD
clamping should not be performed.
#define VK_LOD_CLAMP_NONE 1000.0F
Bits which can be set in VkSamplerCreateInfo::flags, specifying
additional parameters of a sampler, are:
// Provided by VK_VERSION_1_0
typedef enum VkSamplerCreateFlagBits {
// Provided by VK_EXT_fragment_density_map
VK_SAMPLER_CREATE_SUBSAMPLED_BIT_EXT = 0x00000001,
// Provided by VK_EXT_fragment_density_map
VK_SAMPLER_CREATE_SUBSAMPLED_COARSE_RECONSTRUCTION_BIT_EXT = 0x00000002,
// Provided by VK_EXT_descriptor_buffer
VK_SAMPLER_CREATE_DESCRIPTOR_BUFFER_CAPTURE_REPLAY_BIT_EXT = 0x00000008,
// Provided by VK_EXT_non_seamless_cube_map
VK_SAMPLER_CREATE_NON_SEAMLESS_CUBE_MAP_BIT_EXT = 0x00000004,
// Provided by VK_QCOM_image_processing
VK_SAMPLER_CREATE_IMAGE_PROCESSING_BIT_QCOM = 0x00000010,
} VkSamplerCreateFlagBits;
-
VK_SAMPLER_CREATE_SUBSAMPLED_BIT_EXT specifies that the sampler will read from an image created with
flagscontaining VK_IMAGE_CREATE_SUBSAMPLED_BIT_EXT. -
VK_SAMPLER_CREATE_SUBSAMPLED_COARSE_RECONSTRUCTION_BIT_EXT specifies that the implementation may use approximations when reconstructing a full color value for texture access from a subsampled image.
-
VK_SAMPLER_CREATE_NON_SEAMLESS_CUBE_MAP_BIT_EXT specifies that cube map edge handling is not performed.
-
VK_SAMPLER_CREATE_IMAGE_PROCESSING_BIT_QCOM specifies that the sampler will read from images using only
OpImageWeightedSampleQCOM,OpImageBoxFilterQCOM,OpImageBlockMatchGatherSSDQCOM,OpImageBlockMatchGatherSADQCOM,OpImageBlockMatchWindowSSDQCOM,OpImageBlockMatchWindowSADQCOM,OpImageBlockMatchSSDQCOM, orOpImageBlockMatchSADQCOM.
|
The approximations used when VK_SAMPLER_CREATE_SUBSAMPLED_COARSE_RECONSTRUCTION_BIT_EXT is specified are implementation defined. Some implementations may interpolate between fragment density levels in a subsampled image. In that case, this bit may be used to decide whether the interpolation factors are calculated per fragment or at a coarser granularity. |
-
VK_SAMPLER_CREATE_DESCRIPTOR_BUFFER_CAPTURE_REPLAY_BIT_EXT specifies that the sampler can be used with descriptor buffers when capturing and replaying (e.g. for trace capture and replay), see VkOpaqueCaptureDescriptorDataCreateInfoEXT for more detail.
// Provided by VK_VERSION_1_0
typedef VkFlags VkSamplerCreateFlags;
VkSamplerCreateFlags is a bitmask type for setting a mask of zero or
more VkSamplerCreateFlagBits.
The VkSamplerReductionModeCreateInfo structure is defined as:
// Provided by VK_VERSION_1_2
typedef struct VkSamplerReductionModeCreateInfo {
VkStructureType sType;
const void* pNext;
VkSamplerReductionMode reductionMode;
} VkSamplerReductionModeCreateInfo;
// Provided by VK_EXT_sampler_filter_minmax
// Equivalent to VkSamplerReductionModeCreateInfo
typedef VkSamplerReductionModeCreateInfo VkSamplerReductionModeCreateInfoEXT;
-
sTypeis a VkStructureType value identifying this structure. -
pNextisNULLor a pointer to a structure extending this structure. -
reductionModeis a VkSamplerReductionMode value controlling how texture filtering combines texel values.
If the pNext chain of VkSamplerCreateInfo includes a
VkSamplerReductionModeCreateInfo structure, then that structure
includes a mode controlling how texture filtering combines texel values.
If this structure is not present, reductionMode is considered to be
VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE.
Reduction modes are specified by VkSamplerReductionMode, which takes values:
// Provided by VK_VERSION_1_2
typedef enum VkSamplerReductionMode {
VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE = 0,
VK_SAMPLER_REDUCTION_MODE_MIN = 1,
VK_SAMPLER_REDUCTION_MODE_MAX = 2,
// Provided by VK_QCOM_filter_cubic_clamp
VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE_RANGECLAMP_QCOM = 1000521000,
// Provided by VK_EXT_sampler_filter_minmax
VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE_EXT = VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE,
// Provided by VK_EXT_sampler_filter_minmax
VK_SAMPLER_REDUCTION_MODE_MIN_EXT = VK_SAMPLER_REDUCTION_MODE_MIN,
// Provided by VK_EXT_sampler_filter_minmax
VK_SAMPLER_REDUCTION_MODE_MAX_EXT = VK_SAMPLER_REDUCTION_MODE_MAX,
} VkSamplerReductionMode;
// Provided by VK_EXT_sampler_filter_minmax
// Equivalent to VkSamplerReductionMode
typedef VkSamplerReductionMode VkSamplerReductionModeEXT;
-
VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE specifies that texel values are combined by computing a weighted average of values in the footprint, using weights as specified in the image operations chapter.
-
VK_SAMPLER_REDUCTION_MODE_MIN specifies that texel values are combined by taking the component-wise minimum of values in the footprint with non-zero weights.
-
VK_SAMPLER_REDUCTION_MODE_MAX specifies that texel values are combined by taking the component-wise maximum of values in the footprint with non-zero weights.
-
VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE_RANGECLAMP_QCOM specifies values are combined as described by VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE, followed by a texel range clamp.
The VkSamplerCubicWeightsCreateInfoQCOM structure is defined as:
// Provided by VK_QCOM_filter_cubic_weights
typedef struct VkSamplerCubicWeightsCreateInfoQCOM {
VkStructureType sType;
const void* pNext;
VkCubicFilterWeightsQCOM cubicWeights;
} VkSamplerCubicWeightsCreateInfoQCOM;
-
sTypeis a VkStructureType value identifying this structure. -
pNextisNULLor a pointer to a structure extending this structure. -
cubicWeightsis a VkCubicFilterWeightsQCOM value controlling which cubic weights are used.
If the pNext chain of VkSamplerCreateInfo includes a
VkSamplerCubicWeightsCreateInfoQCOM structure, then that structure
specifies which cubic weights are used.
If that structure is not present, cubicWeights is considered to be
VK_CUBIC_FILTER_WEIGHTS_CATMULL_ROM_QCOM.
Possible values of the
VkSamplerCubicWeightsCreateInfoQCOM::cubicWeights, specifying
cubic weights used in Texel Cubic Filtering are:
// Provided by VK_QCOM_filter_cubic_weights
typedef enum VkCubicFilterWeightsQCOM {
VK_CUBIC_FILTER_WEIGHTS_CATMULL_ROM_QCOM = 0,
VK_CUBIC_FILTER_WEIGHTS_ZERO_TANGENT_CARDINAL_QCOM = 1,
VK_CUBIC_FILTER_WEIGHTS_B_SPLINE_QCOM = 2,
VK_CUBIC_FILTER_WEIGHTS_MITCHELL_NETRAVALI_QCOM = 3,
} VkCubicFilterWeightsQCOM;
-
VK_CUBIC_FILTER_WEIGHTS_CATMULL_ROM_QCOM specifies Catmull-Rom weights.
-
VK_CUBIC_FILTER_WEIGHTS_ZERO_TANGENT_CARDINAL_QCOM specifies Zero Tangent Cardinal weights.
-
VK_CUBIC_FILTER_WEIGHTS_B_SPLINE_QCOM specifies B-Spline weights.
-
VK_CUBIC_FILTER_WEIGHTS_MITCHELL_NETRAVALI_QCOM specifies Mitchell-Netravali weights.
Possible values of the VkSamplerCreateInfo::magFilter and
minFilter parameters, specifying filters used for texture lookups,
are:
// Provided by VK_VERSION_1_0
typedef enum VkFilter {
VK_FILTER_NEAREST = 0,
VK_FILTER_LINEAR = 1,
// Provided by VK_EXT_filter_cubic
VK_FILTER_CUBIC_EXT = 1000015000,
// Provided by VK_IMG_filter_cubic
VK_FILTER_CUBIC_IMG = VK_FILTER_CUBIC_EXT,
} VkFilter;
-
VK_FILTER_NEAREST specifies nearest filtering.
-
VK_FILTER_LINEAR specifies linear filtering.
-
VK_FILTER_CUBIC_EXT specifies cubic filtering.
These filters are described in detail in Texel Filtering.
Possible values of the VkSamplerCreateInfo::mipmapMode,
specifying the mipmap mode used for texture lookups, are:
// Provided by VK_VERSION_1_0
typedef enum VkSamplerMipmapMode {
VK_SAMPLER_MIPMAP_MODE_NEAREST = 0,
VK_SAMPLER_MIPMAP_MODE_LINEAR = 1,
} VkSamplerMipmapMode;
-
VK_SAMPLER_MIPMAP_MODE_NEAREST specifies nearest filtering.
-
VK_SAMPLER_MIPMAP_MODE_LINEAR specifies linear filtering.
These modes are described in detail in Texel Filtering.
Possible values of the VkSamplerCreateInfo::addressMode*
parameters, corresponding to different wrapping operations used during sampling, are:
// Provided by VK_VERSION_1_0
typedef enum VkSamplerAddressMode {
VK_SAMPLER_ADDRESS_MODE_REPEAT = 0,
VK_SAMPLER_ADDRESS_MODE_MIRRORED_REPEAT = 1,
VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE = 2,
VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER = 3,
// Provided by VK_VERSION_1_2, VK_KHR_sampler_mirror_clamp_to_edge
VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE = 4,
// Provided by VK_KHR_sampler_mirror_clamp_to_edge
// VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE_KHR is a legacy alias
VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE_KHR = VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE,
} VkSamplerAddressMode;
-
VK_SAMPLER_ADDRESS_MODE_REPEAT specifies that the repeat wrap mode will be used.
-
VK_SAMPLER_ADDRESS_MODE_MIRRORED_REPEAT specifies that the mirrored repeat wrap mode will be used.
-
VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE specifies that the clamp to edge wrap mode will be used.
-
VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER specifies that the clamp to border wrap mode will be used.
-
VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE specifies that the mirror clamp to edge wrap mode will be used. This is only valid if the
samplerMirrorClampToEdgefeature is enabled, or if theVK_KHR_sampler_mirror_clamp_to_edgeextension is enabled.
Comparison operators compare a reference and a test value, and return a true (“passed”) or false (“failed”) value depending on the comparison operator chosen. The supported operators are:
// Provided by VK_VERSION_1_0
typedef enum VkCompareOp {
VK_COMPARE_OP_NEVER = 0,
VK_COMPARE_OP_LESS = 1,
VK_COMPARE_OP_EQUAL = 2,
VK_COMPARE_OP_LESS_OR_EQUAL = 3,
VK_COMPARE_OP_GREATER = 4,
VK_COMPARE_OP_NOT_EQUAL = 5,
VK_COMPARE_OP_GREATER_OR_EQUAL = 6,
VK_COMPARE_OP_ALWAYS = 7,
} VkCompareOp;
-
VK_COMPARE_OP_NEVER specifies that the comparison always evaluates false.
-
VK_COMPARE_OP_LESS specifies that the comparison evaluates reference < test.
-
VK_COMPARE_OP_EQUAL specifies that the comparison evaluates reference = test.
-
VK_COMPARE_OP_LESS_OR_EQUAL specifies that the comparison evaluates reference ≤ test.
-
VK_COMPARE_OP_GREATER specifies that the comparison evaluates reference > test.
-
VK_COMPARE_OP_NOT_EQUAL specifies that the comparison evaluates reference ≠ test.
-
VK_COMPARE_OP_GREATER_OR_EQUAL specifies that the comparison evaluates reference ≥ test.
-
VK_COMPARE_OP_ALWAYS specifies that the comparison always evaluates true.
Comparison operators are used for:
-
The Depth Compare Operation operator for a sampler, specified by VkSamplerCreateInfo::
compareOp. -
The stencil comparison operator for the stencil test, specified by vkCmdSetStencilOp::
compareOpor VkStencilOpState::compareOp. -
The Depth Comparison operator for the depth test, specified by vkCmdSetDepthCompareOp::
depthCompareOpor VkPipelineDepthStencilStateCreateInfo::depthCompareOp.
Each such use describes how the reference and test values for that comparison are determined.
Possible values of VkSamplerCreateInfo::borderColor, specifying
the border color used for texture lookups, are:
// Provided by VK_VERSION_1_0
typedef enum VkBorderColor {
VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK = 0,
VK_BORDER_COLOR_INT_TRANSPARENT_BLACK = 1,
VK_BORDER_COLOR_FLOAT_OPAQUE_BLACK = 2,
VK_BORDER_COLOR_INT_OPAQUE_BLACK = 3,
VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE = 4,
VK_BORDER_COLOR_INT_OPAQUE_WHITE = 5,
// Provided by VK_EXT_custom_border_color
VK_BORDER_COLOR_FLOAT_CUSTOM_EXT = 1000287003,
// Provided by VK_EXT_custom_border_color
VK_BORDER_COLOR_INT_CUSTOM_EXT = 1000287004,
} VkBorderColor;
-
VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK specifies a transparent, floating-point format, black color.
-
VK_BORDER_COLOR_INT_TRANSPARENT_BLACK specifies a transparent, integer format, black color.
-
VK_BORDER_COLOR_FLOAT_OPAQUE_BLACK specifies an opaque, floating-point format, black color.
-
VK_BORDER_COLOR_INT_OPAQUE_BLACK specifies an opaque, integer format, black color.
-
VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE specifies an opaque, floating-point format, white color.
-
VK_BORDER_COLOR_INT_OPAQUE_WHITE specifies an opaque, integer format, white color.
-
VK_BORDER_COLOR_FLOAT_CUSTOM_EXT specifies that a VkSamplerCustomBorderColorCreateInfoEXT structure is included in the VkSamplerCreateInfo::
pNextchain containing the color data in floating-point format. -
VK_BORDER_COLOR_INT_CUSTOM_EXT specifies that a VkSamplerCustomBorderColorCreateInfoEXT structure is included in the VkSamplerCreateInfo::
pNextchain containing the color data in integer format.
These colors are described in detail in Border Replacement.
To destroy a sampler, call:
// Provided by VK_VERSION_1_0
void vkDestroySampler(
VkDevice device,
VkSampler sampler,
const VkAllocationCallbacks* pAllocator);
-
deviceis the logical device that destroys the sampler. -
sampleris the sampler to destroy. -
pAllocatorcontrols host memory allocation as described in the Memory Allocation chapter.
Sampler Y′CBCR Conversion
To create a sampler with Y′CBCR conversion enabled, add a
VkSamplerYcbcrConversionInfo structure to the pNext chain of the
VkSamplerCreateInfo structure.
To create a sampler Y′CBCR conversion, the
samplerYcbcrConversion feature
must be enabled.
Conversion must be fixed at pipeline creation time, through use of a
combined image sampler with an immutable sampler in
VkDescriptorSetLayoutBinding.
A VkSamplerYcbcrConversionInfo must be provided for samplers to be used with image views that access VK_IMAGE_ASPECT_COLOR_BIT if the format is one of the formats that require a sampler Y′CBCR conversion , or if the image view has an external format .
The VkSamplerYcbcrConversionInfo structure is defined as:
// Provided by VK_VERSION_1_1
typedef struct VkSamplerYcbcrConversionInfo {
VkStructureType sType;
const void* pNext;
VkSamplerYcbcrConversion conversion;
} VkSamplerYcbcrConversionInfo;
// Provided by VK_KHR_sampler_ycbcr_conversion
// Equivalent to VkSamplerYcbcrConversionInfo
typedef VkSamplerYcbcrConversionInfo VkSamplerYcbcrConversionInfoKHR;
-
sTypeis a VkStructureType value identifying this structure. -
pNextisNULLor a pointer to a structure extending this structure. -
conversionis a VkSamplerYcbcrConversion handle created with vkCreateSamplerYcbcrConversion.
A sampler Y′CBCR conversion is an opaque representation of a
device-specific sampler Y′CBCR conversion description, represented as a
VkSamplerYcbcrConversion handle:
// Provided by VK_VERSION_1_1
VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkSamplerYcbcrConversion)
// Provided by VK_KHR_sampler_ycbcr_conversion
// Equivalent to VkSamplerYcbcrConversion
typedef VkSamplerYcbcrConversion VkSamplerYcbcrConversionKHR;
To create a VkSamplerYcbcrConversion, call:
// Provided by VK_VERSION_1_1
VkResult vkCreateSamplerYcbcrConversion(
VkDevice device,
const VkSamplerYcbcrConversionCreateInfo* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
VkSamplerYcbcrConversion* pYcbcrConversion);
// Provided by VK_KHR_sampler_ycbcr_conversion
// Equivalent to vkCreateSamplerYcbcrConversion
VkResult vkCreateSamplerYcbcrConversionKHR(
VkDevice device,
const VkSamplerYcbcrConversionCreateInfo* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
VkSamplerYcbcrConversion* pYcbcrConversion);
-
deviceis the logical device that creates the sampler Y′CBCR conversion. -
pCreateInfois a pointer to a VkSamplerYcbcrConversionCreateInfo structure specifying the requested sampler Y′CBCR conversion. -
pAllocatorcontrols host memory allocation as described in the Memory Allocation chapter. -
pYcbcrConversionis a pointer to a VkSamplerYcbcrConversion handle in which the resulting sampler Y′CBCR conversion is returned.
The interpretation of the configured sampler Y′CBCR conversion is described in more detail in the description of sampler Y′CBCR conversion in the Image Operations chapter.
The VkSamplerYcbcrConversionCreateInfo structure is defined as:
// Provided by VK_VERSION_1_1
typedef struct VkSamplerYcbcrConversionCreateInfo {
VkStructureType sType;
const void* pNext;
VkFormat format;
VkSamplerYcbcrModelConversion ycbcrModel;
VkSamplerYcbcrRange ycbcrRange;
VkComponentMapping components;
VkChromaLocation xChromaOffset;
VkChromaLocation yChromaOffset;
VkFilter chromaFilter;
VkBool32 forceExplicitReconstruction;
} VkSamplerYcbcrConversionCreateInfo;
// Provided by VK_KHR_sampler_ycbcr_conversion
// Equivalent to VkSamplerYcbcrConversionCreateInfo
typedef VkSamplerYcbcrConversionCreateInfo VkSamplerYcbcrConversionCreateInfoKHR;
-
sTypeis a VkStructureType value identifying this structure. -
pNextisNULLor a pointer to a structure extending this structure. -
formatis the format of the image from which color information will be retrieved. -
ycbcrModeldescribes the color matrix for conversion between color models. -
ycbcrRangedescribes whether the encoded values have headroom and foot room, or whether the encoding uses the full numerical range. -
componentsapplies a swizzle based on VkComponentSwizzle enums prior to range expansion and color model conversion. -
xChromaOffsetdescribes the sample location associated with downsampled chroma components in the x dimension.xChromaOffsethas no effect for formats in which chroma components are not downsampled horizontally. -
yChromaOffsetdescribes the sample location associated with downsampled chroma components in the y dimension.yChromaOffsethas no effect for formats in which the chroma components are not downsampled vertically. -
chromaFilteris the filter for chroma reconstruction. -
forceExplicitReconstructioncan be used to ensure that reconstruction is done explicitly, if supported.
|
Setting If |
If the pNext chain includes a VkExternalFormatANDROID structure
with non-zero externalFormat member, the sampler Y′CBCR conversion
object represents an external format conversion, and format must be
VK_FORMAT_UNDEFINED.
Such conversions must only be used to sample image views with a matching
external format.
When creating an external format conversion, the value of components
is ignored.
If chromaFilter is VK_FILTER_NEAREST, chroma samples are
reconstructed to luma component resolution using nearest-neighbour sampling.
Otherwise, chroma samples are reconstructed using interpolation.
More details can be found in the description of sampler Y′CBCR conversion in the Image Operations chapter.
VkSamplerYcbcrModelConversion defines the conversion from the source color model to the shader color model. Possible values are:
// Provided by VK_VERSION_1_1
typedef enum VkSamplerYcbcrModelConversion {
VK_SAMPLER_YCBCR_MODEL_CONVERSION_RGB_IDENTITY = 0,
VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_IDENTITY = 1,
VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_709 = 2,
VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_601 = 3,
VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_2020 = 4,
// Provided by VK_KHR_sampler_ycbcr_conversion
VK_SAMPLER_YCBCR_MODEL_CONVERSION_RGB_IDENTITY_KHR = VK_SAMPLER_YCBCR_MODEL_CONVERSION_RGB_IDENTITY,
// Provided by VK_KHR_sampler_ycbcr_conversion
VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_IDENTITY_KHR = VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_IDENTITY,
// Provided by VK_KHR_sampler_ycbcr_conversion
VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_709_KHR = VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_709,
// Provided by VK_KHR_sampler_ycbcr_conversion
VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_601_KHR = VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_601,
// Provided by VK_KHR_sampler_ycbcr_conversion
VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_2020_KHR = VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_2020,
} VkSamplerYcbcrModelConversion;
// Provided by VK_KHR_sampler_ycbcr_conversion
// Equivalent to VkSamplerYcbcrModelConversion
typedef VkSamplerYcbcrModelConversion VkSamplerYcbcrModelConversionKHR;
-
VK_SAMPLER_YCBCR_MODEL_CONVERSION_RGB_IDENTITY specifies that the input values to the conversion are unmodified.
-
VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_IDENTITY specifies no model conversion but the inputs are range expanded as for Y′CBCR.
-
VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_709 specifies the color model conversion from Y′CBCR to R′G′B′ defined in BT.709 and described in the “BT.709 Y′CBCR conversion” section of the Khronos Data Format Specification.
-
VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_601 specifies the color model conversion from Y′CBCR to R′G′B′ defined in BT.601 and described in the “BT.601 Y′CBCR conversion” section of the Khronos Data Format Specification.
-
VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_2020 specifies the color model conversion from Y′CBCR to R′G′B′ defined in BT.2020 and described in the “BT.2020 Y′CBCR conversion” section of the Khronos Data Format Specification.
In the VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_* color models, for the
input to the sampler Y′CBCR range expansion and model conversion:
-
the Y (Y′ luma) component corresponds to the G component of an RGB image.
-
the CB (CB or “U” blue color difference) component corresponds to the B component of an RGB image.
-
the CR (CR or “V” red color difference) component corresponds to the R component of an RGB image.
-
the alpha component, if present, is not modified by color model conversion.
These rules reflect the mapping of components after the component swizzle
operation (controlled by
VkSamplerYcbcrConversionCreateInfo::components).
|
For example, an “YUVA” 32-bit format comprising four 8-bit components can be implemented as VK_FORMAT_R8G8B8A8_UNORM with a component mapping:
|
The VkSamplerYcbcrRange enum describes whether color components are encoded using the full range of numerical values or whether values are reserved for headroom and foot room. VkSamplerYcbcrRange is defined as:
// Provided by VK_VERSION_1_1
typedef enum VkSamplerYcbcrRange {
VK_SAMPLER_YCBCR_RANGE_ITU_FULL = 0,
VK_SAMPLER_YCBCR_RANGE_ITU_NARROW = 1,
// Provided by VK_KHR_sampler_ycbcr_conversion
VK_SAMPLER_YCBCR_RANGE_ITU_FULL_KHR = VK_SAMPLER_YCBCR_RANGE_ITU_FULL,
// Provided by VK_KHR_sampler_ycbcr_conversion
VK_SAMPLER_YCBCR_RANGE_ITU_NARROW_KHR = VK_SAMPLER_YCBCR_RANGE_ITU_NARROW,
} VkSamplerYcbcrRange;
// Provided by VK_KHR_sampler_ycbcr_conversion
// Equivalent to VkSamplerYcbcrRange
typedef VkSamplerYcbcrRange VkSamplerYcbcrRangeKHR;
-
VK_SAMPLER_YCBCR_RANGE_ITU_FULL specifies that the full range of the encoded values are valid and interpreted according to the ITU “full range” quantization rules.
-
VK_SAMPLER_YCBCR_RANGE_ITU_NARROW specifies that headroom and foot room are reserved in the numerical range of encoded values, and the remaining values are expanded according to the ITU “narrow range” quantization rules.
The formulae for these conversions is described in the Sampler Y′CBCR Range Expansion section of the Image Operations chapter.
No range modification takes place if ycbcrModel is
VK_SAMPLER_YCBCR_MODEL_CONVERSION_RGB_IDENTITY; the ycbcrRange
field of VkSamplerYcbcrConversionCreateInfo is ignored in this case.
The VkChromaLocation enum defines the location of downsampled chroma component samples relative to the luma samples, and is defined as:
// Provided by VK_VERSION_1_1
typedef enum VkChromaLocation {
VK_CHROMA_LOCATION_COSITED_EVEN = 0,
VK_CHROMA_LOCATION_MIDPOINT = 1,
// Provided by VK_KHR_sampler_ycbcr_conversion
VK_CHROMA_LOCATION_COSITED_EVEN_KHR = VK_CHROMA_LOCATION_COSITED_EVEN,
// Provided by VK_KHR_sampler_ycbcr_conversion
VK_CHROMA_LOCATION_MIDPOINT_KHR = VK_CHROMA_LOCATION_MIDPOINT,
} VkChromaLocation;
// Provided by VK_KHR_sampler_ycbcr_conversion
// Equivalent to VkChromaLocation
typedef VkChromaLocation VkChromaLocationKHR;
-
VK_CHROMA_LOCATION_COSITED_EVEN specifies that downsampled chroma samples are aligned with luma samples with even coordinates.
-
VK_CHROMA_LOCATION_MIDPOINT specifies that downsampled chroma samples are located half way between each even luma sample and the nearest higher odd luma sample.
Applications can enable sRGB to linear conversion for the R, G, and B
components of a Y′CBCR image during sampling by
including VkSamplerYcbcrConversionYcbcrDegammaCreateInfoQCOM structure
in the pNext chain of VkSamplerYcbcrConversionCreateInfo.
The VkSamplerYcbcrConversionYcbcrDegammaCreateInfoQCOM structure is
defined as:
// Provided by VK_QCOM_ycbcr_degamma
typedef struct VkSamplerYcbcrConversionYcbcrDegammaCreateInfoQCOM {
VkStructureType sType;
void* pNext;
VkBool32 enableYDegamma;
VkBool32 enableCbCrDegamma;
} VkSamplerYcbcrConversionYcbcrDegammaCreateInfoQCOM;
-
sTypeis a VkStructureType value identifying this structure. -
pNextisNULLor a pointer to a structure extending this structure. -
enableYDegammaindicates sRGB to linear conversion is enabled for the G component. -
enableCbCrDegammaindicates sRGB to linear conversion is enabled for the R and B components.
To destroy a sampler Y′CBCR conversion, call:
// Provided by VK_VERSION_1_1
void vkDestroySamplerYcbcrConversion(
VkDevice device,
VkSamplerYcbcrConversion ycbcrConversion,
const VkAllocationCallbacks* pAllocator);
// Provided by VK_KHR_sampler_ycbcr_conversion
// Equivalent to vkDestroySamplerYcbcrConversion
void vkDestroySamplerYcbcrConversionKHR(
VkDevice device,
VkSamplerYcbcrConversion ycbcrConversion,
const VkAllocationCallbacks* pAllocator);
-
deviceis the logical device that destroys the Y′CBCR conversion. -
ycbcrConversionis the conversion to destroy. -
pAllocatorcontrols host memory allocation as described in the Memory Allocation chapter.
In addition to the predefined border color values, applications can provide
a custom border color value by including the
VkSamplerCustomBorderColorCreateInfoEXT structure in the
VkSamplerCreateInfo::pNext chain.
The VkSamplerCustomBorderColorCreateInfoEXT structure is defined as:
// Provided by VK_EXT_custom_border_color
typedef struct VkSamplerCustomBorderColorCreateInfoEXT {
VkStructureType sType;
const void* pNext;
VkClearColorValue customBorderColor;
VkFormat format;
} VkSamplerCustomBorderColorCreateInfoEXT;
-
sTypeis a VkStructureType value identifying this structure. -
pNextisNULLor a pointer to a structure extending this structure. -
customBorderColoris a VkClearColorValue representing the desired custom sampler border color. -
formatis a VkFormat representing the format of the sampled image view(s). This field may be VK_FORMAT_UNDEFINED if thecustomBorderColorWithoutFormatfeature is enabled.
|
If If |
If the sampler is created with VK_BORDER_COLOR_FLOAT_OPAQUE_BLACK,
VK_BORDER_COLOR_INT_OPAQUE_BLACK,
VK_BORDER_COLOR_FLOAT_CUSTOM_EXT, or
VK_BORDER_COLOR_INT_CUSTOM_EXT borderColor, and that sampler
will be combined with an image view that does not have an
identity swizzle, and
VkPhysicalDeviceBorderColorSwizzleFeaturesEXT::borderColorSwizzleFromImage
is not enabled, then it is necessary to specify the component mapping of the
border color, by including the
VkSamplerBorderColorComponentMappingCreateInfoEXT structure in the
VkSamplerCreateInfo::pNext chain, to get defined results.
The VkSamplerBorderColorComponentMappingCreateInfoEXT structure is
defined as:
// Provided by VK_EXT_border_color_swizzle
typedef struct VkSamplerBorderColorComponentMappingCreateInfoEXT {
VkStructureType sType;
const void* pNext;
VkComponentMapping components;
VkBool32 srgb;
} VkSamplerBorderColorComponentMappingCreateInfoEXT;
-
sTypeis a VkStructureType value identifying this structure. -
pNextisNULLor a pointer to a structure extending this structure. -
componentsis a VkComponentMapping structure specifying a remapping of the border color components. -
srgbindicates that the sampler will be combined with an image view that has an image format which is sRGB encoded.
The VkComponentMapping components member describes a remapping
from components of the border color to components of the vector returned by
shader image instructions when the border color is used.
The VkSamplerBlockMatchWindowCreateInfoQCOM structure is defined as:
// Provided by VK_QCOM_image_processing2
typedef struct VkSamplerBlockMatchWindowCreateInfoQCOM {
VkStructureType sType;
const void* pNext;
VkExtent2D windowExtent;
VkBlockMatchWindowCompareModeQCOM windowCompareMode;
} VkSamplerBlockMatchWindowCreateInfoQCOM;
-
sTypeis a VkStructureType value identifying this structure. -
pNextisNULLor a pointer to a structure extending this structure. -
windowExtentis a VkExtent2D specifying a the width and height of the block match window. -
windowCompareModeis a VkBlockMatchWindowCompareModeQCOM specifying the compare mode.
The VkBlockMatchWindowCompareModeQCOM enum describes how block match values within the window are compared. VkBlockMatchWindowCompareModeQCOM is defined as:
// Provided by VK_QCOM_image_processing2
typedef enum VkBlockMatchWindowCompareModeQCOM {
VK_BLOCK_MATCH_WINDOW_COMPARE_MODE_MIN_QCOM = 0,
VK_BLOCK_MATCH_WINDOW_COMPARE_MODE_MAX_QCOM = 1,
} VkBlockMatchWindowCompareModeQCOM;
-
VK_BLOCK_MATCH_WINDOW_COMPARE_MODE_MIN_QCOM specifies that windowed block match operations return the minimum error within the window.
-
VK_BLOCK_MATCH_WINDOW_COMPARE_MODE_MAX_QCOM specifies that windowed block match operations return the maximum error within the window.