采样器
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
指定窗口化的块匹配操作返回窗口内的最大误差。