采样器
VkSampler 对象表示图像采样器的状态,实现使用该状态来读取图像数据并为着色器应用过滤和其他转换。
采样器由 VkSampler 句柄表示
// Provided by VK_VERSION_1_0
VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkSampler)
要创建采样器对象,请调用
// Provided by VK_VERSION_1_0
VkResult vkCreateSampler(
VkDevice device,
const VkSamplerCreateInfo* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
VkSampler* pSampler);
-
device是创建采样器的逻辑设备。 -
pCreateInfo是指向 VkSamplerCreateInfo 结构的指针,该结构指定采样器对象的状态。 -
pAllocator控制主机内存分配,如 内存分配 章节中所述。 -
pSampler是指向 VkSampler 句柄的指针,其中返回生成的采样器对象。
VkSamplerCreateInfo 结构定义为
// 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;
-
sType是标识此结构的 VkStructureType 值。 -
pNext是NULL或指向扩展此结构的结构的指针。 -
flags是描述采样器附加参数的 VkSamplerCreateFlagBits 位掩码。 -
magFilter是一个 VkFilter 值,指定应用于查找的放大过滤器。 -
minFilter是一个 VkFilter 值,指定应用于查找的缩小过滤器。 -
mipmapMode是一个 VkSamplerMipmapMode 值,指定应用于查找的 mipmap 过滤器。 -
addressModeU是一个 VkSamplerAddressMode 值,指定 [0,1) 范围之外的 U 坐标的寻址模式。 -
addressModeV是一个 VkSamplerAddressMode 值,指定 [0,1) 范围之外的 V 坐标的寻址模式。 -
addressModeW是一个 VkSamplerAddressMode 值,指定 [0,1) 范围之外的 W 坐标的寻址模式。 -
mipLodBias是要添加到 mipmap LOD 计算和 SPIR-V 中图像采样函数提供的偏差的偏差,如 LOD 操作 部分所述。 -
anisotropyEnable如果要启用各向异性过滤,则为VK_TRUE,如 纹理像素各向异性过滤 部分所述,否则为VK_FALSE。 -
maxAnisotropy是当anisotropyEnable为VK_TRUE时采样器使用的各向异性值钳位。如果anisotropyEnable为VK_FALSE,则忽略maxAnisotropy。 -
compareEnable如果要在查找期间启用与参考值的比较,则为VK_TRUE,否则为VK_FALSE。-
注意:如果此成员不匹配,某些实现将默认为着色器状态。
-
-
compareOp是一个 VkCompareOp 值,指定在按照 深度比较操作 部分所述进行过滤之前,应用于获取数据的比较运算符。 -
minLod用于钳制计算出的 LOD 值的最小值。 -
maxLod用于钳制计算出的 LOD 值的最大值。要避免钳制最大值,请将maxLod设置为常量VK_LOD_CLAMP_NONE。 -
borderColor是一个 VkBorderColor 值,指定要使用的预定义边框颜色。 -
unnormalizedCoordinates控制是否使用未归一化或归一化的纹素坐标来寻址图像的纹素。当unnormalizedCoordinates为VK_TRUE时,用于查找纹素的图像坐标范围在每个维度上都是从零到图像大小。当unnormalizedCoordinates为VK_FALSE时,图像坐标的范围为零到一。当
unnormalizedCoordinates为VK_TRUE时,着色器中使用的采样器所使用的图像必须满足以下要求-
viewType必须是VK_IMAGE_VIEW_TYPE_1D或VK_IMAGE_VIEW_TYPE_2D。 -
图像视图必须具有单层和一个 mip 级别。
当
unnormalizedCoordinates为VK_TRUE时,着色器中使用的采样器的图像内置函数必须满足以下要求 -
函数必须不使用投影。
-
函数必须不使用偏移。
-
|
OpenGL 到 Vulkan 过滤模式的映射
没有 Vulkan 过滤模式直接对应于 请注意,使用 |
可以在设备上同时创建的最大采样器对象数量取决于具体实现,并由 maxSamplerAllocationCount 成员在 VkPhysicalDeviceLimits 结构中指定。
|
由于历史原因,如果超过 |
由于 VkSampler 是不可调度句柄类型,因此实现可能会为相同的采样器状态向量返回相同的句柄。在这种情况下,所有此类对象都只会在 maxSamplerAllocationCount 限制中计算一次。
VK_LOD_CLAMP_NONE 是用于 VkSamplerCreateInfo::maxLod 的特殊常量值,用于指示不应执行最大 LOD 钳制。
#define VK_LOD_CLAMP_NONE 1000.0F
可以在 VkSamplerCreateInfo::flags 中设置的位,用于指定采样器的其他参数,包括:
// 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指定采样器将从使用包含VK_IMAGE_CREATE_SUBSAMPLED_BIT_EXT的flags创建的图像中读取数据。 -
VK_SAMPLER_CREATE_SUBSAMPLED_COARSE_RECONSTRUCTION_BIT_EXT指定在从子采样图像重建纹理访问的完整颜色值时,实现可能使用近似值。 -
VK_SAMPLER_CREATE_NON_SEAMLESS_CUBE_MAP_BIT_EXT指定不执行立方体贴图边缘处理。 -
VK_SAMPLER_CREATE_IMAGE_PROCESSING_BIT_QCOM指定采样器将仅使用OpImageWeightedSampleQCOM、OpImageBoxFilterQCOM、OpImageBlockMatchGatherSSDQCOM、OpImageBlockMatchGatherSADQCOM、OpImageBlockMatchWindowSSDQCOM、OpImageBlockMatchWindowSADQCOM、OpImageBlockMatchSSDQCOM或OpImageBlockMatchSADQCOM从图像中读取数据。
|
指定 |
-
VK_SAMPLER_CREATE_DESCRIPTOR_BUFFER_CAPTURE_REPLAY_BIT_EXT指定在捕获和重放时(例如,对于跟踪捕获和重放),采样器可以与描述符缓冲区一起使用,有关详细信息,请参见 VkOpaqueCaptureDescriptorDataCreateInfoEXT。
// Provided by VK_VERSION_1_0
typedef VkFlags VkSamplerCreateFlags;
VkSamplerCreateFlags 是一个位掩码类型,用于设置零个或多个 VkSamplerCreateFlagBits 的掩码。
VkSamplerReductionModeCreateInfo 结构定义如下:
// Provided by VK_VERSION_1_2
typedef struct VkSamplerReductionModeCreateInfo {
VkStructureType sType;
const void* pNext;
VkSamplerReductionMode reductionMode;
} VkSamplerReductionModeCreateInfo;
或等效于:
// Provided by VK_EXT_sampler_filter_minmax
typedef VkSamplerReductionModeCreateInfo VkSamplerReductionModeCreateInfoEXT;
-
sType是标识此结构的 VkStructureType 值。 -
pNext是NULL或指向扩展此结构的结构的指针。 -
reductionMode是一个 VkSamplerReductionMode 值,用于控制纹理过滤如何组合纹素值。
如果 VkSamplerCreateInfo 的 pNext 链包含 VkSamplerReductionModeCreateInfo 结构,则该结构包含一个控制纹理过滤如何组合纹素值的模式。
如果此结构不存在,则认为 reductionMode 为 VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE。
缩减模式由 VkSamplerReductionMode 指定,该值采用以下值:
// 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
typedef VkSamplerReductionMode VkSamplerReductionModeEXT;
-
VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE指定通过计算足迹中值的加权平均值来组合纹素值,使用图像操作章节中指定的权重。 -
VK_SAMPLER_REDUCTION_MODE_MIN指定通过选取足迹中具有非零权重的最小值(按分量)来组合纹素值。 -
VK_SAMPLER_REDUCTION_MODE_MAX指定通过选取足迹中具有非零权重的最大值(按分量)来组合纹素值。 -
VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE_RANGECLAMP_QCOM指定值按照VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE的描述进行组合,然后进行纹素范围钳制。
VkSamplerCubicWeightsCreateInfoQCOM 结构定义如下:
// Provided by VK_QCOM_filter_cubic_weights
typedef struct VkSamplerCubicWeightsCreateInfoQCOM {
VkStructureType sType;
const void* pNext;
VkCubicFilterWeightsQCOM cubicWeights;
} VkSamplerCubicWeightsCreateInfoQCOM;
-
sType是标识此结构的 VkStructureType 值。 -
pNext是NULL或指向扩展此结构的结构的指针。 -
cubicWeights是一个 VkCubicFilterWeightsQCOM 值,用于控制使用哪些立方权重。
如果 VkSamplerCreateInfo 的 pNext 链包含 VkSamplerCubicWeightsCreateInfoQCOM 结构,则该结构指定使用哪些立方权重。
如果该结构不存在,则 cubicWeights 被视为 VK_CUBIC_FILTER_WEIGHTS_CATMULL_ROM_QCOM。
VkSamplerCubicWeightsCreateInfoQCOM::cubicWeights 的可能值,指定在 纹素立方过滤 中使用的立方权重为:
// 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指定 Catmull-Rom 权重。 -
VK_CUBIC_FILTER_WEIGHTS_ZERO_TANGENT_CARDINAL_QCOM指定零切线基数权重。 -
VK_CUBIC_FILTER_WEIGHTS_B_SPLINE_QCOM指定 B 样条权重。 -
VK_CUBIC_FILTER_WEIGHTS_MITCHELL_NETRAVALI_QCOM指定 Mitchell-Netravali 权重。
VkSamplerCreateInfo::magFilter 和 minFilter 参数的可能值,指定用于纹理查找的过滤器为:
// 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指定最近邻过滤。 -
VK_FILTER_LINEAR指定线性过滤。 -
VK_FILTER_CUBIC_EXT指定立方过滤。
这些过滤器在 纹素过滤 中有详细描述。
VkSamplerCreateInfo::mipmapMode 的可能值,指定用于纹理查找的 mipmap 模式为:
// 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指定最近邻过滤。 -
VK_SAMPLER_MIPMAP_MODE_LINEAR指定线性过滤。
这些模式在 纹素过滤 中有详细描述。
VkSamplerCreateInfo::addressMode* 参数的可能值,指定在 环绕操作 部分中定义的,对于相应的 u,v 或 w 坐标,使用范围 [0,1] 之外的坐标进行采样的行为为:
// 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 deprecated alias
VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE_KHR = VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE,
} VkSamplerAddressMode;
-
VK_SAMPLER_ADDRESS_MODE_REPEAT指定将使用重复环绕模式。 -
VK_SAMPLER_ADDRESS_MODE_MIRRORED_REPEAT指定将使用镜像重复环绕模式。 -
VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE指定将使用钳制到边缘环绕模式。 -
VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER指定将使用钳制到边界环绕模式。 -
VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE指定将使用镜像钳制到边缘环绕模式。这仅当启用samplerMirrorClampToEdge功能,或者启用VK_KHR_sampler_mirror_clamp_to_edge扩展时才有效。
比较运算符 比较一个参考值和一个测试值,并根据选择的比较运算符返回真(“通过”)或假(“失败”)值。支持的运算符为:
// 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指定比较结果始终为假。 -
VK_COMPARE_OP_LESS指定比较结果为 参考 < 测试。 -
VK_COMPARE_OP_EQUAL指定比较结果为 参考 = 测试。 -
VK_COMPARE_OP_LESS_OR_EQUAL指定比较结果为 参考 ≤ 测试。 -
VK_COMPARE_OP_GREATER指定比较结果为 参考 > 测试。 -
VK_COMPARE_OP_NOT_EQUAL指定比较结果为 参考 ≠ 测试。 -
VK_COMPARE_OP_GREATER_OR_EQUAL指定比较结果为 参考 ≥ 测试。 -
VK_COMPARE_OP_ALWAYS指定比较结果始终为真。
比较运算符用于:
-
采样器的 深度比较操作 运算符,由 VkSamplerCreateInfo::
compareOp指定。 -
模板测试 的模板比较运算符,由 vkCmdSetStencilOp::
compareOp或 VkStencilOpState::compareOp指定。 -
深度测试 的 深度比较 运算符,由 vkCmdSetDepthCompareOp::
depthCompareOp或 VkPipelineDepthStencilStateCreateInfo::depthCompareOp指定。
每个此类用法都描述了如何确定该比较的参考值和测试值。
VkSamplerCreateInfo::borderColor 的可能值,指定用于纹理查找的边框颜色为:
// 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指定透明的浮点格式黑色。 -
VK_BORDER_COLOR_INT_TRANSPARENT_BLACK指定透明的整数格式黑色。 -
VK_BORDER_COLOR_FLOAT_OPAQUE_BLACK指定不透明的浮点格式黑色。 -
VK_BORDER_COLOR_INT_OPAQUE_BLACK指定不透明的整数格式黑色。 -
VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE指定不透明的浮点格式白色。 -
VK_BORDER_COLOR_INT_OPAQUE_WHITE指定不透明的整数格式白色。 -
VK_BORDER_COLOR_FLOAT_CUSTOM_EXT指定 VkSamplerCustomBorderColorCreateInfoEXT 结构包含在 VkSamplerCreateInfo::pNext链中,其中包含浮点格式的颜色数据。 -
VK_BORDER_COLOR_INT_CUSTOM_EXT指定 VkSamplerCustomBorderColorCreateInfoEXT 结构包含在 VkSamplerCreateInfo::pNext链中,其中包含整数格式的颜色数据。
这些颜色在 纹素替换 中有详细描述。
要销毁采样器,请调用
// Provided by VK_VERSION_1_0
void vkDestroySampler(
VkDevice device,
VkSampler sampler,
const VkAllocationCallbacks* pAllocator);
-
device是销毁采样器的逻辑设备。 -
sampler是要销毁的采样器。 -
pAllocator控制主机内存分配,如 内存分配 章节中所述。
采样器 Y′CBCR 转换
要创建启用 Y′CBCR 转换的采样器,请将 VkSamplerYcbcrConversionInfo 结构添加到 VkSamplerCreateInfo 结构的 pNext 链中。要创建采样器 Y′CBCR 转换,必须启用 samplerYcbcrConversion 功能。转换必须在管线创建时通过使用带有 VkDescriptorSetLayoutBinding 中不可变采样器的组合图像采样器来固定。
如果格式是需要采样器 Y′CBCR 转换的格式之一,或者如果图像视图具有外部格式,则对于用于访问 VK_IMAGE_ASPECT_COLOR_BIT 的图像视图,必须提供 VkSamplerYcbcrConversionInfo。
VkSamplerYcbcrConversionInfo 结构定义如下
// Provided by VK_VERSION_1_1
typedef struct VkSamplerYcbcrConversionInfo {
VkStructureType sType;
const void* pNext;
VkSamplerYcbcrConversion conversion;
} VkSamplerYcbcrConversionInfo;
或等效于:
// Provided by VK_KHR_sampler_ycbcr_conversion
typedef VkSamplerYcbcrConversionInfo VkSamplerYcbcrConversionInfoKHR;
-
sType是标识此结构的 VkStructureType 值。 -
pNext是NULL或指向扩展此结构的结构的指针。 -
conversion是一个使用 vkCreateSamplerYcbcrConversion 创建的 VkSamplerYcbcrConversion 句柄。
采样器 Y′CBCR 转换是设备特定的采样器 Y′CBCR 转换描述的不透明表示,表示为 VkSamplerYcbcrConversion 句柄
// Provided by VK_VERSION_1_1
VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkSamplerYcbcrConversion)
或等效于:
// Provided by VK_KHR_sampler_ycbcr_conversion
typedef VkSamplerYcbcrConversion VkSamplerYcbcrConversionKHR;
要创建 VkSamplerYcbcrConversion,请调用
// 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
VkResult vkCreateSamplerYcbcrConversionKHR(
VkDevice device,
const VkSamplerYcbcrConversionCreateInfo* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
VkSamplerYcbcrConversion* pYcbcrConversion);
-
device是创建采样器 Y′CBCR 转换的逻辑设备。 -
pCreateInfo是指向 VkSamplerYcbcrConversionCreateInfo 结构的指针,该结构指定请求的采样器 Y′CBCR 转换。 -
pAllocator控制主机内存分配,如 内存分配 章节中所述。 -
pYcbcrConversion是指向 VkSamplerYcbcrConversion 句柄的指针,其中返回生成的采样器 Y′CBCR 转换。
配置的采样器 Y′CBCR 转换的解释在纹理章节中关于采样器 Y′CBCR 转换的描述中有更详细的描述。
VkSamplerYcbcrConversionCreateInfo 结构定义如下
// 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
typedef VkSamplerYcbcrConversionCreateInfo VkSamplerYcbcrConversionCreateInfoKHR;
-
sType是标识此结构的 VkStructureType 值。 -
pNext是NULL或指向扩展此结构的结构的指针。 -
format是从中检索颜色信息的图像的格式。 -
ycbcrModel描述颜色模型之间转换的颜色矩阵。 -
ycbcrRange描述编码值是否具有头部空间和底部空间,或者编码是否使用完整的数值范围。 -
components基于 VkComponentSwizzle 枚举在范围扩展和颜色模型转换之前应用交换。 -
xChromaOffset描述与 x 维度中下采样的色度分量关联的采样位置。xChromaOffset对于色度分量未水平下采样的格式没有影响。 -
yChromaOffset描述与 y 维度中下采样的色度分量关联的采样位置。yChromaOffset对于色度分量未垂直下采样的格式没有影响。 -
chromaFilter是用于色度重建的滤波器。 -
如果支持,
forceExplicitReconstruction可以用于确保显式完成重建。
|
将 如果 |
如果 pNext 链包含一个具有非零 externalFormat 成员的 VkExternalFormatANDROID 结构,则采样器 Y′CBCR 转换对象表示外部格式转换,并且 format 必须是 VK_FORMAT_UNDEFINED。此类转换必须仅用于采样具有匹配 外部格式的图像视图。创建外部格式转换时,将忽略 components 的值。
如果 chromaFilter 是 VK_FILTER_NEAREST,则使用最近邻采样将色度样本重建为亮度分量分辨率。否则,使用插值重建色度样本。更多详细信息可以在 采样器 Y′CBCR 转换的描述中找到,该描述位于 图像操作章节。
VkSamplerYcbcrModelConversion 定义了从源颜色模型到着色器颜色模型的转换。可能的值包括
// 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
typedef VkSamplerYcbcrModelConversion VkSamplerYcbcrModelConversionKHR;
-
VK_SAMPLER_YCBCR_MODEL_CONVERSION_RGB_IDENTITY指定转换的输入值未被修改。 -
VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_IDENTITY指定没有模型转换,但输入值会像 Y′CBCR 一样进行范围扩展。 -
VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_709指定从 Y′CBCR 到 R′G′B′ 的颜色模型转换,该转换在 BT.709 中定义,并在 Khronos 数据格式规范的“BT.709 Y′CBCR 转换”部分中进行了描述。 -
VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_601指定从 Y′CBCR 到 R′G′B′ 的颜色模型转换,该转换在 BT.601 中定义,并在 Khronos 数据格式规范的“BT.601 Y′CBCR 转换”部分中进行了描述。 -
VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_2020指定从 Y′CBCR 到 R′G′B′ 的颜色模型转换,该转换在 BT.2020 中定义,并在 Khronos 数据格式规范的“BT.2020 Y′CBCR 转换”部分中进行了描述。
在 VK_SAMPLER_YCBCR_MODEL_CONVERSION_YCBCR_* 颜色模型中,对于采样器 Y′CBCR 范围扩展和模型转换的输入
-
Y (Y′ 亮度) 分量对应于 RGB 图像的 G 分量。
-
CB (CB 或 “U” 蓝色色差) 分量对应于 RGB 图像的 B 分量。
-
CR (CR 或 “V” 红色色差) 分量对应于 RGB 图像的 R 分量。
-
alpha 分量(如果存在)不会被颜色模型转换修改。
这些规则反映了组件交换操作后的组件映射(由 VkSamplerYcbcrConversionCreateInfo::components 控制)。
|
例如,由四个 8 位分量组成的 “YUVA” 32 位格式可以使用
|
VkSamplerYcbcrRange 枚举描述了颜色分量是使用全部数值范围编码,还是保留一些值用于动态范围头部和底部空间。VkSamplerYcbcrRange 定义如下
// 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
typedef VkSamplerYcbcrRange VkSamplerYcbcrRangeKHR;
-
VK_SAMPLER_YCBCR_RANGE_ITU_FULL指定编码值的全部范围有效,并根据 ITU 的“全范围”量化规则进行解释。 -
VK_SAMPLER_YCBCR_RANGE_ITU_NARROW指定在编码值的数值范围中保留了动态范围头部和底部空间,并且剩余的值根据 ITU 的“窄范围”量化规则进行扩展。
这些转换的公式在 采样器 Y′CBCR 范围扩展 部分进行了描述,该部分位于 图像操作章节。
如果 ycbcrModel 是 VK_SAMPLER_YCBCR_MODEL_CONVERSION_RGB_IDENTITY,则不进行范围修改;在这种情况下,会忽略 VkSamplerYcbcrConversionCreateInfo 的 ycbcrRange 字段。
VkChromaLocation 枚举定义了相对于亮度样本的下采样色度分量样本的位置,定义如下
// 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
typedef VkChromaLocation VkChromaLocationKHR;
-
VK_CHROMA_LOCATION_COSITED_EVEN指定下采样的色度样本与偶数坐标的亮度样本对齐。 -
VK_CHROMA_LOCATION_MIDPOINT指定下采样的色度样本位于每个偶数亮度样本和最近的较高奇数亮度样本的中间位置。
应用程序可以通过在 VkSamplerYcbcrConversionCreateInfo 的 pNext 链中包含 VkSamplerYcbcrConversionYcbcrDegammaCreateInfoQCOM 结构体,在 格式转换期间为 Y′CBCR 图像的 R、G 和 B 分量启用 sRGB 到线性的转换。
VkSamplerYcbcrConversionYcbcrDegammaCreateInfoQCOM 结构体定义如下
// Provided by VK_QCOM_ycbcr_degamma
typedef struct VkSamplerYcbcrConversionYcbcrDegammaCreateInfoQCOM {
VkStructureType sType;
void* pNext;
VkBool32 enableYDegamma;
VkBool32 enableCbCrDegamma;
} VkSamplerYcbcrConversionYcbcrDegammaCreateInfoQCOM;
-
sType是标识此结构的 VkStructureType 值。 -
pNext是NULL或指向扩展此结构的结构的指针。 -
enableYDegamma指示为 G 分量启用 sRGB 到线性的转换。 -
enableCbCrDegamma指示为 R 和 B 分量启用 sRGB 到线性的转换。
要销毁采样器 Y′CBCR 转换,请调用
// Provided by VK_VERSION_1_1
void vkDestroySamplerYcbcrConversion(
VkDevice device,
VkSamplerYcbcrConversion ycbcrConversion,
const VkAllocationCallbacks* pAllocator);
或等效命令
// Provided by VK_KHR_sampler_ycbcr_conversion
void vkDestroySamplerYcbcrConversionKHR(
VkDevice device,
VkSamplerYcbcrConversion ycbcrConversion,
const VkAllocationCallbacks* pAllocator);
-
device是销毁 Y′CBCR 转换的逻辑设备。 -
ycbcrConversion是要销毁的转换。 -
pAllocator控制主机内存分配,如 内存分配 章节中所述。
除了预定义的边框颜色值之外,应用程序可以通过在 VkSamplerCreateInfo::pNext 链中包含 VkSamplerCustomBorderColorCreateInfoEXT 结构体来提供自定义边框颜色值。
VkSamplerCustomBorderColorCreateInfoEXT 结构体定义如下
// Provided by VK_EXT_custom_border_color
typedef struct VkSamplerCustomBorderColorCreateInfoEXT {
VkStructureType sType;
const void* pNext;
VkClearColorValue customBorderColor;
VkFormat format;
} VkSamplerCustomBorderColorCreateInfoEXT;
-
sType是标识此结构的 VkStructureType 值。 -
pNext是NULL或指向扩展此结构的结构的指针。 -
customBorderColor是一个 VkClearColorValue,表示所需的自定义采样器边框颜色。 -
format是一个 VkFormat,表示采样图像视图的格式。如果启用了customBorderColorWithoutFormat功能,则此字段可以为VK_FORMAT_UNDEFINED。
|
如果 如果 |
如果使用 VK_BORDER_COLOR_FLOAT_OPAQUE_BLACK、VK_BORDER_COLOR_INT_OPAQUE_BLACK、VK_BORDER_COLOR_FLOAT_CUSTOM_EXT 或 VK_BORDER_COLOR_INT_CUSTOM_EXT borderColor 创建采样器,并且该采样器将与没有 identity swizzle 的图像视图组合,并且未启用 VkPhysicalDeviceBorderColorSwizzleFeaturesEXT::borderColorSwizzleFromImage,则有必要通过在 VkSamplerCreateInfo::pNext 链中包含 VkSamplerBorderColorComponentMappingCreateInfoEXT 结构来指定边框颜色的分量映射,以获得定义的结果。
VkSamplerBorderColorComponentMappingCreateInfoEXT 结构定义为
// Provided by VK_EXT_border_color_swizzle
typedef struct VkSamplerBorderColorComponentMappingCreateInfoEXT {
VkStructureType sType;
const void* pNext;
VkComponentMapping components;
VkBool32 srgb;
} VkSamplerBorderColorComponentMappingCreateInfoEXT;
-
sType是标识此结构的 VkStructureType 值。 -
pNext是NULL或指向扩展此结构的结构的指针。 -
components是一个 VkComponentMapping 结构,指定边框颜色分量的重新映射。 -
srgb指示采样器将与具有 sRGB 编码图像格式的图像视图组合。
VkComponentMapping components 成员描述了从边框颜色的分量到当使用边框颜色时由着色器图像指令返回的向量分量的重新映射。
VkSamplerBlockMatchWindowCreateInfoQCOM 结构定义为
// Provided by VK_QCOM_image_processing2
typedef struct VkSamplerBlockMatchWindowCreateInfoQCOM {
VkStructureType sType;
const void* pNext;
VkExtent2D windowExtent;
VkBlockMatchWindowCompareModeQCOM windowCompareMode;
} VkSamplerBlockMatchWindowCreateInfoQCOM;
-
sType是标识此结构的 VkStructureType 值。 -
pNext是NULL或指向扩展此结构的结构的指针。 -
windowExtent是一个 VkExtent2D,指定块匹配窗口的宽度和高度。 -
windowCompareMode是一个 VkBlockMatchWindowCompareModeQCOM,指定比较模式。
VkBlockMatchWindowCompareModeQCOM 枚举描述了如何比较窗口内的块匹配值。VkBlockMatchWindowCompareModeQCOM 定义为
// 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指定窗口化的块匹配操作返回窗口内的最小误差。 -
VK_BLOCK_MATCH_WINDOW_COMPARE_MODE_MAX_QCOM指定窗口化的块匹配操作返回窗口内的最大误差。