采样器

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 句柄的指针,其中返回生成的采样器对象。

有效使用
  • VUID-vkCreateSampler-device-09668
    device 必须 支持至少一个具有 VK_QUEUE_COMPUTE_BITVK_QUEUE_GRAPHICS_BIT 功能的队列族

  • VUID-vkCreateSampler-maxSamplerAllocationCount-04110
    当前设备上创建的 VkSampler 对象必须少于 VkPhysicalDeviceLimits::maxSamplerAllocationCount

有效使用(隐式)
  • VUID-vkCreateSampler-device-parameter
    device 必须是有效的 VkDevice 句柄

  • VUID-vkCreateSampler-pCreateInfo-parameter
    pCreateInfo 必须是指向有效 VkSamplerCreateInfo 结构的有效指针

  • VUID-vkCreateSampler-pAllocator-parameter
    如果 pAllocator 不是 NULL,则 pAllocator 必须是指向有效 VkAllocationCallbacks 结构的有效指针

  • VUID-vkCreateSampler-pSampler-parameter
    pSampler 必须是指向 VkSampler 句柄的有效指针

返回代码
成功
  • VK_SUCCESS

失败
  • VK_ERROR_OUT_OF_HOST_MEMORY

  • VK_ERROR_OUT_OF_DEVICE_MEMORY

  • VK_ERROR_INVALID_OPAQUE_CAPTURE_ADDRESS_KHR

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 值。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • 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 是当 anisotropyEnableVK_TRUE 时采样器使用的各向异性值钳位。如果 anisotropyEnableVK_FALSE,则忽略 maxAnisotropy

  • compareEnable 如果要在查找期间启用与参考值的比较,则为 VK_TRUE,否则为 VK_FALSE

    • 注意:如果此成员不匹配,某些实现将默认为着色器状态。

  • compareOp 是一个 VkCompareOp 值,指定在按照 深度比较操作 部分所述进行过滤之前,应用于获取数据的比较运算符。

  • minLod 用于钳制计算出的 LOD 值的最小值

  • maxLod 用于钳制计算出的 LOD 值的最大值。要避免钳制最大值,请将 maxLod 设置为常量 VK_LOD_CLAMP_NONE

  • borderColor 是一个 VkBorderColor 值,指定要使用的预定义边框颜色。

  • unnormalizedCoordinates 控制是否使用未归一化或归一化的纹素坐标来寻址图像的纹素。当 unnormalizedCoordinatesVK_TRUE 时,用于查找纹素的图像坐标范围在每个维度上都是从零到图像大小。当 unnormalizedCoordinatesVK_FALSE 时,图像坐标的范围为零到一。

    unnormalizedCoordinatesVK_TRUE 时,着色器中使用的采样器所使用的图像必须满足以下要求

    • viewType 必须VK_IMAGE_VIEW_TYPE_1DVK_IMAGE_VIEW_TYPE_2D

    • 图像视图必须具有单层和一个 mip 级别。

      unnormalizedCoordinatesVK_TRUE 时,着色器中使用的采样器的图像内置函数必须满足以下要求

    • 函数必须不使用投影。

    • 函数必须不使用偏移。

OpenGL 到 Vulkan 过滤模式的映射

magFilterVK_FILTER_NEARESTVK_FILTER_LINEAR 值直接对应于 GL_NEARESTGL_LINEAR 放大过滤器。 minFiltermipmapMode 组合起来对应于类似命名的 OpenGL 缩小过滤器 GL_minFilter_MIPMAP_mipmapMode (例如,minFilterVK_FILTER_LINEARmipmapModeVK_SAMPLER_MIPMAP_MODE_NEAREST 对应于 GL_LINEAR_MIPMAP_NEAREST)。

没有 Vulkan 过滤模式直接对应于 GL_LINEARGL_NEAREST 的 OpenGL 缩小过滤器,但是它们可以使用 VK_SAMPLER_MIPMAP_MODE_NEARESTminLod = 0 和 maxLod = 0.25,以及分别使用 minFilter = VK_FILTER_LINEARminFilter = VK_FILTER_NEAREST 来模拟。

请注意,使用 maxLod 为零会导致始终执行放大,并且始终使用 magFilter。这是有效的,只是与 OpenGL 行为不完全匹配。将最大 LOD 钳制为 0.25 允许 λ 值不为零并执行缩小,同时仍然始终向下舍入到基本级别。如果 minFiltermagFilter 相等,则使用 maxLod 为零也有效。

可以在设备上同时创建的最大采样器对象数量取决于具体实现,并由 maxSamplerAllocationCount 成员在 VkPhysicalDeviceLimits 结构中指定。

由于历史原因,如果超过 maxSamplerAllocationCount,一些实现可能会返回 VK_ERROR_TOO_MANY_OBJECTS。超出此限制将导致未定义的行为,并且应用程序不应依赖于返回的错误代码来识别何时达到限制。

由于 VkSampler 是不可调度句柄类型,因此实现可能会为相同的采样器状态向量返回相同的句柄。在这种情况下,所有此类对象都只会在 maxSamplerAllocationCount 限制中计算一次。

有效使用
  • VUID-VkSamplerCreateInfo-mipLodBias-01069
    mipLodBias 的绝对值必须小于或等于 VkPhysicalDeviceLimits::maxSamplerLodBias

  • VUID-VkSamplerCreateInfo-samplerMipLodBias-04467
    如果启用 VK_KHR_portability_subset 扩展,并且 VkPhysicalDevicePortabilitySubsetFeaturesKHR::samplerMipLodBiasVK_FALSE,则 mipLodBias 必须为零

  • VUID-VkSamplerCreateInfo-maxLod-01973
    maxLod 必须大于或等于 minLod

  • VUID-VkSamplerCreateInfo-anisotropyEnable-01070
    如果未启用 samplerAnisotropy 功能,则 anisotropyEnable 必须VK_FALSE

  • VUID-VkSamplerCreateInfo-anisotropyEnable-01071
    如果 anisotropyEnableVK_TRUE,则 maxAnisotropy 必须1.0VkPhysicalDeviceLimits::maxSamplerAnisotropy 之间(包括两者)。

  • VUID-VkSamplerCreateInfo-minFilter-01645
    如果启用采样器 Y′CBCR 转换,并且采样器 Y′CBCR 转换的潜在格式特性不支持 VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_SEPARATE_RECONSTRUCTION_FILTER_BIT,则 minFiltermagFilter 必须等于采样器 Y′CBCR 转换的 chromaFilter

  • VUID-VkSamplerCreateInfo-unnormalizedCoordinates-01072
    如果 unnormalizedCoordinatesVK_TRUE,则 minFiltermagFilter 必须相等

  • VUID-VkSamplerCreateInfo-unnormalizedCoordinates-01073
    如果 unnormalizedCoordinatesVK_TRUE,则 mipmapMode 必须VK_SAMPLER_MIPMAP_MODE_NEAREST

  • VUID-VkSamplerCreateInfo-unnormalizedCoordinates-01074
    如果 unnormalizedCoordinatesVK_TRUE,则 minLodmaxLod 必须为零

  • VUID-VkSamplerCreateInfo-unnormalizedCoordinates-01075
    如果 unnormalizedCoordinatesVK_TRUE,则 addressModeUaddressModeV 必须均为 VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGEVK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER

  • VUID-VkSamplerCreateInfo-unnormalizedCoordinates-01076
    如果 unnormalizedCoordinatesVK_TRUE,则 anisotropyEnable 必须VK_FALSE

  • VUID-VkSamplerCreateInfo-unnormalizedCoordinates-01077
    如果 unnormalizedCoordinatesVK_TRUE,则 compareEnable 必须VK_FALSE

  • VUID-VkSamplerCreateInfo-addressModeU-01078
    如果 addressModeUaddressModeVaddressModeW 中的任何一个是 VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER,则 borderColor 必须是有效的 VkBorderColor

  • VUID-VkSamplerCreateInfo-addressModeU-01646
    如果启用了采样器 Y′CBCR 转换,则 addressModeUaddressModeVaddressModeW 必须VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGEanisotropyEnable 必须VK_FALSE,并且 unnormalizedCoordinates 必须VK_FALSE

  • VUID-VkSamplerCreateInfo-None-01647
    如果启用了采样器 Y′CBCR 转换,并且 pNext 链中包含 VkSamplerReductionModeCreateInfo 结构,则采样器缩减模式 必须VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE

  • VUID-VkSamplerCreateInfo-pNext-06726
    如果未启用 samplerFilterMinmax 特性,并且 pNext 链中包含 VkSamplerReductionModeCreateInfo 结构,则采样器缩减模式 必须VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE

  • VUID-VkSamplerCreateInfo-addressModeU-01079
    如果未启用 samplerMirrorClampToEdge 特性,并且未启用 VK_KHR_sampler_mirror_clamp_to_edge 扩展,则 addressModeUaddressModeVaddressModeW 必须不能为 VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE

  • VUID-VkSamplerCreateInfo-compareEnable-01080
    如果 compareEnableVK_TRUE,则 compareOp 必须是有效的 VkCompareOp 值。

  • VUID-VkSamplerCreateInfo-magFilter-01081
    如果 magFilterminFilter 之一为 VK_FILTER_CUBIC_EXT,则 anisotropyEnable 必须VK_FALSE

  • VUID-VkSamplerCreateInfo-magFilter-07911
    如果未启用 VK_EXT_filter_cubic 扩展,并且 magFilterminFilter 之一为 VK_FILTER_CUBIC_IMG,则 VkSamplerReductionModeCreateInforeductionMode 成员 必须VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE

  • VUID-VkSamplerCreateInfo-compareEnable-01423
    如果 compareEnableVK_TRUE,则 VkSamplerReductionModeCreateInforeductionMode 成员 必须VK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE

  • VUID-VkSamplerCreateInfo-flags-02574
    如果 flags 包含 VK_SAMPLER_CREATE_SUBSAMPLED_BIT_EXT,则 minFiltermagFilter 必须相等。

  • VUID-VkSamplerCreateInfo-flags-02575
    如果 flags 包含 VK_SAMPLER_CREATE_SUBSAMPLED_BIT_EXT,则 mipmapMode 必须VK_SAMPLER_MIPMAP_MODE_NEAREST

  • VUID-VkSamplerCreateInfo-flags-02576
    如果 flags 包含 VK_SAMPLER_CREATE_SUBSAMPLED_BIT_EXT,则 minLodmaxLod 必须为零。

  • VUID-VkSamplerCreateInfo-flags-02577
    如果 flags 包含 VK_SAMPLER_CREATE_SUBSAMPLED_BIT_EXT,则 addressModeUaddressModeV 必须各自为 VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGEVK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER

  • VUID-VkSamplerCreateInfo-flags-02578
    如果 flags 包含 VK_SAMPLER_CREATE_SUBSAMPLED_BIT_EXT,则 anisotropyEnable 必须VK_FALSE

  • VUID-VkSamplerCreateInfo-flags-02579
    如果 flags 包含 VK_SAMPLER_CREATE_SUBSAMPLED_BIT_EXT,则 compareEnable 必须VK_FALSE

  • VUID-VkSamplerCreateInfo-flags-02580
    如果 flags 包含 VK_SAMPLER_CREATE_SUBSAMPLED_BIT_EXT,则 unnormalizedCoordinates 必须VK_FALSE

  • VUID-VkSamplerCreateInfo-nonSeamlessCubeMap-06788
    如果未启用 nonSeamlessCubeMap 特性,则 flags 必须不包含 VK_SAMPLER_CREATE_NON_SEAMLESS_CUBE_MAP_BIT_EXT

  • VUID-VkSamplerCreateInfo-borderColor-04011
    如果 borderColorVK_BORDER_COLOR_FLOAT_CUSTOM_EXTVK_BORDER_COLOR_INT_CUSTOM_EXT 之一,则 pNext 链中 必须包含 VkSamplerCustomBorderColorCreateInfoEXT

  • VUID-VkSamplerCreateInfo-customBorderColors-04085
    如果未启用 customBorderColors 特性,则 borderColor 必须不能为 VK_BORDER_COLOR_FLOAT_CUSTOM_EXTVK_BORDER_COLOR_INT_CUSTOM_EXT

  • VUID-VkSamplerCreateInfo-borderColor-04442
    如果 borderColorVK_BORDER_COLOR_FLOAT_CUSTOM_EXTVK_BORDER_COLOR_INT_CUSTOM_EXT 之一,并且 VkSamplerCustomBorderColorCreateInfoEXT::format 不为 VK_FORMAT_UNDEFINED,则 VkSamplerCustomBorderColorCreateInfoEXT::customBorderColor 必须format 中可表示的值范围内。

  • VUID-VkSamplerCreateInfo-None-04012
    可以在设备上同时创建的具有自定义边框颜色的采样器的最大数量是实现相关的,并由 maxCustomBorderColorSamplers 成员在 VkPhysicalDeviceCustomBorderColorPropertiesEXT 结构中指定。

  • VUID-VkSamplerCreateInfo-flags-08110
    如果 flags 包含 VK_SAMPLER_CREATE_DESCRIPTOR_BUFFER_CAPTURE_REPLAY_BIT_EXT,则 必须启用 descriptorBufferCaptureReplay 特性。

  • VUID-VkSamplerCreateInfo-pNext-08111
    如果 pNext 链中包含 VkOpaqueCaptureDescriptorDataCreateInfoEXT 结构,则 flags 必须包含 VK_SAMPLER_CREATE_DESCRIPTOR_BUFFER_CAPTURE_REPLAY_BIT_EXT

  • VUID-VkSamplerCreateInfo-flags-06964
    如果 flags 包含 VK_SAMPLER_CREATE_IMAGE_PROCESSING_BIT_QCOM,则 minFiltermagFilter 必须VK_FILTER_NEAREST

  • VUID-VkSamplerCreateInfo-flags-06965
    如果 flags 包含 VK_SAMPLER_CREATE_IMAGE_PROCESSING_BIT_QCOM,则 mipmapMode 必须VK_SAMPLER_MIPMAP_MODE_NEAREST

  • VUID-VkSamplerCreateInfo-flags-06966
    如果 flags 包含 VK_SAMPLER_CREATE_IMAGE_PROCESSING_BIT_QCOM,则 minLodmaxLod 必须为零。

  • VUID-VkSamplerCreateInfo-flags-06967
    如果 flags 包含 VK_SAMPLER_CREATE_IMAGE_PROCESSING_BIT_QCOM,则 addressModeUaddressModeV 必须分别为 VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGEVK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER

  • VUID-VkSamplerCreateInfo-flags-06968
    如果 flags 包含 VK_SAMPLER_CREATE_IMAGE_PROCESSING_BIT_QCOM,且如果 addressModeUaddressModeVVK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER,则 borderColor 必须VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK

  • VUID-VkSamplerCreateInfo-flags-06969
    如果 flags 包含 VK_SAMPLER_CREATE_IMAGE_PROCESSING_BIT_QCOM,则 anisotropyEnable 必须VK_FALSE

  • VUID-VkSamplerCreateInfo-flags-06970
    如果 flags 包含 VK_SAMPLER_CREATE_IMAGE_PROCESSING_BIT_QCOM,则 compareEnable 必须VK_FALSE

有效使用(隐式)

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_EXTflags 创建的图像中读取数据。

  • VK_SAMPLER_CREATE_SUBSAMPLED_COARSE_RECONSTRUCTION_BIT_EXT 指定在从子采样图像重建纹理访问的完整颜色值时,实现可能使用近似值。

  • VK_SAMPLER_CREATE_NON_SEAMLESS_CUBE_MAP_BIT_EXT 指定不执行立方体贴图边缘处理

  • VK_SAMPLER_CREATE_IMAGE_PROCESSING_BIT_QCOM 指定采样器将仅使用 OpImageWeightedSampleQCOMOpImageBoxFilterQCOMOpImageBlockMatchGatherSSDQCOMOpImageBlockMatchGatherSADQCOMOpImageBlockMatchWindowSSDQCOMOpImageBlockMatchWindowSADQCOMOpImageBlockMatchSSDQCOMOpImageBlockMatchSADQCOM 从图像中读取数据。

指定 VK_SAMPLER_CREATE_SUBSAMPLED_COARSE_RECONSTRUCTION_BIT_EXT 时使用的近似值是实现定义的。某些实现可能在子采样图像中的片段密度级别之间进行插值。在这种情况下,此位可能用于决定插值因子是按每个片段计算还是按更粗的粒度计算。

  • 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 值。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • reductionMode 是一个 VkSamplerReductionMode 值,用于控制纹理过滤如何组合纹素值。

如果 VkSamplerCreateInfopNext 链包含 VkSamplerReductionModeCreateInfo 结构,则该结构包含一个控制纹理过滤如何组合纹素值的模式。

如果此结构不存在,则认为 reductionModeVK_SAMPLER_REDUCTION_MODE_WEIGHTED_AVERAGE

有效使用(隐式)
  • VUID-VkSamplerReductionModeCreateInfo-sType-sType
    sType 必须VK_STRUCTURE_TYPE_SAMPLER_REDUCTION_MODE_CREATE_INFO

  • VUID-VkSamplerReductionModeCreateInfo-reductionMode-parameter
    reductionMode 必须是有效的 VkSamplerReductionMode 值。

缩减模式由 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 值。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • cubicWeights 是一个 VkCubicFilterWeightsQCOM 值,用于控制使用哪些立方权重。

如果 VkSamplerCreateInfopNext 链包含 VkSamplerCubicWeightsCreateInfoQCOM 结构,则该结构指定使用哪些立方权重。

如果该结构不存在,则 cubicWeights 被视为 VK_CUBIC_FILTER_WEIGHTS_CATMULL_ROM_QCOM

有效使用(隐式)
  • VUID-VkSamplerCubicWeightsCreateInfoQCOM-sType-sType
    sType 必须VK_STRUCTURE_TYPE_SAMPLER_CUBIC_WEIGHTS_CREATE_INFO_QCOM

  • VUID-VkSamplerCubicWeightsCreateInfoQCOM-cubicWeights-parameter
    cubicWeights 必须 是一个有效的 VkCubicFilterWeightsQCOM

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::magFilterminFilter 参数的可能值,指定用于纹理查找的过滤器为:

// 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* 参数的可能值,指定在 环绕操作 部分中定义的,对于相应的 uvw 坐标,使用范围 [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::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 控制主机内存分配,如 内存分配 章节中所述。

有效使用
  • VUID-vkDestroySampler-sampler-01082
    所有引用 sampler 的已提交命令必须已完成执行。

  • VUID-vkDestroySampler-sampler-01083
    如果创建 sampler 时提供了 VkAllocationCallbacks,则此处必须提供一组兼容的回调。

  • VUID-vkDestroySampler-sampler-01084
    如果创建 sampler 时未提供 VkAllocationCallbacks,则 pAllocator 必须NULL

有效使用(隐式)
  • VUID-vkDestroySampler-device-parameter
    device 必须是有效的 VkDevice 句柄

  • VUID-vkDestroySampler-sampler-parameter
    如果 sampler 不是 VK_NULL_HANDLE,则 sampler 必须是有效的 VkSampler 句柄

  • VUID-vkDestroySampler-pAllocator-parameter
    如果 pAllocator 不是 NULL,则 pAllocator 必须是指向有效 VkAllocationCallbacks 结构的有效指针

  • VUID-vkDestroySampler-sampler-parent
    如果 sampler 是有效的句柄,它必须是从 device 创建、分配或检索的。

主机同步
  • sampler 的主机访问必须进行外部同步。

采样器 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;
有效使用(隐式)
  • VUID-VkSamplerYcbcrConversionInfo-sType-sType
    sType 必须VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_INFO

  • VUID-VkSamplerYcbcrConversionInfo-conversion-parameter
    conversion 必须是有效的 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 转换的描述中有更详细的描述。

有效使用
有效使用(隐式)
  • VUID-vkCreateSamplerYcbcrConversion-device-parameter
    device 必须是有效的 VkDevice 句柄

  • VUID-vkCreateSamplerYcbcrConversion-pCreateInfo-parameter
    pCreateInfo 必须是指向有效 VkSamplerYcbcrConversionCreateInfo 结构的有效指针

  • VUID-vkCreateSamplerYcbcrConversion-pAllocator-parameter
    如果 pAllocator 不是 NULL,则 pAllocator 必须是指向有效 VkAllocationCallbacks 结构的有效指针

  • VUID-vkCreateSamplerYcbcrConversion-pYcbcrConversion-parameter
    pYcbcrConversion 必须是指向 VkSamplerYcbcrConversion 句柄的有效指针

返回代码
成功
  • VK_SUCCESS

失败
  • VK_ERROR_OUT_OF_HOST_MEMORY

  • VK_ERROR_OUT_OF_DEVICE_MEMORY

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 值。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • format 是从中检索颜色信息的图像的格式。

  • ycbcrModel 描述颜色模型之间转换的颜色矩阵。

  • ycbcrRange 描述编码值是否具有头部空间和底部空间,或者编码是否使用完整的数值范围。

  • components 基于 VkComponentSwizzle 枚举在范围扩展和颜色模型转换之前应用交换

  • xChromaOffset 描述与 x 维度中下采样的色度分量关联的采样位置xChromaOffset 对于色度分量未水平下采样的格式没有影响。

  • yChromaOffset 描述与 y 维度中下采样的色度分量关联的采样位置yChromaOffset 对于色度分量未垂直下采样的格式没有影响。

  • chromaFilter 是用于色度重建的滤波器。

  • 如果支持,forceExplicitReconstruction 可以用于确保显式完成重建。

forceExplicitReconstruction 设置为 VK_TRUE 可能会对显式重建不是默认操作模式的实现产生性能损失。

如果 format 支持 VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_CHROMA_RECONSTRUCTION_EXPLICIT_BIT,则 forceExplicitReconstruction 值的行为就像它是 VK_TRUE

如果 pNext 链包含一个具有非零 externalFormat 成员的 VkExternalFormatANDROID 结构,则采样器 Y′CBCR 转换对象表示外部格式转换,并且 format 必须VK_FORMAT_UNDEFINED。此类转换必须仅用于采样具有匹配 外部格式的图像视图。创建外部格式转换时,将忽略 components 的值。

有效使用
  • VUID-VkSamplerYcbcrConversionCreateInfo-format-01904
    如果要创建外部格式转换,format 必须VK_FORMAT_UNDEFINED

  • VUID-VkSamplerYcbcrConversionCreateInfo-format-04061
    如果没有创建外部格式转换,则 format 必须 表示无符号归一化值(即格式 必须UNORM 格式)。

  • VUID-VkSamplerYcbcrConversionCreateInfo-format-01650
    采样器 Y′CBCR 转换的潜在格式特性 必须 支持 VK_FORMAT_FEATURE_MIDPOINT_CHROMA_SAMPLES_BITVK_FORMAT_FEATURE_COSITED_CHROMA_SAMPLES_BIT

  • VUID-VkSamplerYcbcrConversionCreateInfo-xChromaOffset-01651
    如果采样器 Y′CBCR 转换的潜在格式特性不支持 VK_FORMAT_FEATURE_COSITED_CHROMA_SAMPLES_BIT,则当对应组件被下采样时,xChromaOffsetyChromaOffset 必须 不能为 VK_CHROMA_LOCATION_COSITED_EVEN

  • VUID-VkSamplerYcbcrConversionCreateInfo-xChromaOffset-01652
    如果采样器 Y′CBCR 转换的潜在格式特性不支持 VK_FORMAT_FEATURE_MIDPOINT_CHROMA_SAMPLES_BIT,则当对应组件被下采样时,xChromaOffsetyChromaOffset 必须 不能为 VK_CHROMA_LOCATION_MIDPOINT

  • VUID-VkSamplerYcbcrConversionCreateInfo-components-02581
    如果格式具有 _422_420 后缀,则 components.g 必须恒等置换

  • VUID-VkSamplerYcbcrConversionCreateInfo-components-02582
    如果格式具有 _422_420 后缀,则 components.a 必须恒等置换VK_COMPONENT_SWIZZLE_ONEVK_COMPONENT_SWIZZLE_ZERO

  • VUID-VkSamplerYcbcrConversionCreateInfo-components-02583
    如果格式具有 _422_420 后缀,则 components.r 必须恒等置换VK_COMPONENT_SWIZZLE_B

  • VUID-VkSamplerYcbcrConversionCreateInfo-components-02584
    如果格式具有 _422_420 后缀,则 components.b 必须恒等置换VK_COMPONENT_SWIZZLE_R

  • VUID-VkSamplerYcbcrConversionCreateInfo-components-02585
    如果格式具有 _422_420 后缀,且如果 components.rcomponents.b 中有一个是恒等置换,则这两个值 必须 都是恒等置换。

  • VUID-VkSamplerYcbcrConversionCreateInfo-ycbcrModel-01655
    如果 ycbcrModel 不是 VK_SAMPLER_YCBCR_MODEL_CONVERSION_RGB_IDENTITY,则 components.rcomponents.gcomponents.b 必须 对应于 format 的组件;也就是说,components.rcomponents.gcomponents.b 必须 不能为 VK_COMPONENT_SWIZZLE_ZEROVK_COMPONENT_SWIZZLE_ONE,且必须 不能对应于由于转换为 RGBA 而包含零或一的组件。

  • VUID-VkSamplerYcbcrConversionCreateInfo-ycbcrRange-02748
    如果 ycbcrRangeVK_SAMPLER_YCBCR_RANGE_ITU_NARROW,则通过将 component 置换应用于 format 获得的 R、G 和 B 组件的位深度 必须 均大于或等于 8。

  • VUID-VkSamplerYcbcrConversionCreateInfo-forceExplicitReconstruction-01656
    如果采样器 Y′CBCR 转换的潜在格式特性不支持 VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_CHROMA_RECONSTRUCTION_EXPLICIT_FORCEABLE_BIT,则 forceExplicitReconstruction 必须VK_FALSE

  • VUID-VkSamplerYcbcrConversionCreateInfo-chromaFilter-01657
    如果采样器 Y′CBCR 转换的潜在格式特性不支持 VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_LINEAR_FILTER_BIT,则 chromaFilter 必须 不能为 VK_FILTER_LINEAR

  • VUID-VkSamplerYcbcrConversionCreateInfo-pNext-09207
    如果 pNext 链包含 VkSamplerYcbcrConversionYcbcrDegammaCreateInfoQCOM 结构,且如果未启用 ycbcrDegamma 特性,则 VkSamplerYcbcrConversionYcbcrDegammaCreateInfoQCOM::enableYDegamma 必须VK_FALSE

  • VUID-VkSamplerYcbcrConversionCreateInfo-pNext-09208
    如果 pNext 链包含 VkSamplerYcbcrConversionYcbcrDegammaCreateInfoQCOM 结构,且如果未启用 ycbcrDegamma 特性,则 VkSamplerYcbcrConversionYcbcrDegammaCreateInfoQCOM::enableCbCrDegamma 必须VK_FALSE

  • VUID-VkSamplerYcbcrConversionCreateInfo-pNext-09209
    如果 pNext 链包含 VkSamplerYcbcrConversionYcbcrDegammaCreateInfoQCOM 结构,则 format 必须 是具有 8 位 R、G 和 B 组件的格式。

有效使用(隐式)
  • VUID-VkSamplerYcbcrConversionCreateInfo-sType-sType
    sType 必须VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_CREATE_INFO

  • VUID-VkSamplerYcbcrConversionCreateInfo-pNext-pNext
    pNext 链中任何结构(包括此结构)的每个 pNext 成员 必须NULL 或指向 VkExternalFormatANDROIDVkExternalFormatQNXVkSamplerYcbcrConversionYcbcrDegammaCreateInfoQCOM 的有效实例的指针。

  • VUID-VkSamplerYcbcrConversionCreateInfo-sType-unique
    pNext 链中每个结构的 sType必须是唯一的。

  • VUID-VkSamplerYcbcrConversionCreateInfo-format-parameter
    format 必须 为有效的 VkFormat 值。

  • VUID-VkSamplerYcbcrConversionCreateInfo-ycbcrModel-parameter
    ycbcrModel 必须 为有效的 VkSamplerYcbcrModelConversion 值。

  • VUID-VkSamplerYcbcrConversionCreateInfo-ycbcrRange-parameter
    ycbcrRange 必须 为有效的 VkSamplerYcbcrRange 值。

  • VUID-VkSamplerYcbcrConversionCreateInfo-components-parameter
    components 必须是一个有效的 VkComponentMapping 结构体

  • VUID-VkSamplerYcbcrConversionCreateInfo-xChromaOffset-parameter
    xChromaOffset 必须是一个有效的 VkChromaLocation

  • VUID-VkSamplerYcbcrConversionCreateInfo-yChromaOffset-parameter
    yChromaOffset 必须是一个有效的 VkChromaLocation

  • VUID-VkSamplerYcbcrConversionCreateInfo-chromaFilter-parameter
    chromaFilter 必须是一个有效的 VkFilter

如果 chromaFilterVK_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 位格式可以使用 VK_FORMAT_R8G8B8A8_UNORM 和组件映射实现

  • components.a = VK_COMPONENT_SWIZZLE_IDENTITY

  • components.r = VK_COMPONENT_SWIZZLE_B

  • components.g = VK_COMPONENT_SWIZZLE_R

  • components.b = VK_COMPONENT_SWIZZLE_G

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 范围扩展 部分进行了描述,该部分位于 图像操作章节。

如果 ycbcrModelVK_SAMPLER_YCBCR_MODEL_CONVERSION_RGB_IDENTITY,则不进行范围修改;在这种情况下,会忽略 VkSamplerYcbcrConversionCreateInfoycbcrRange 字段。

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 指定下采样的色度样本位于每个偶数亮度样本和最近的较高奇数亮度样本的中间位置。

应用程序可以通过在 VkSamplerYcbcrConversionCreateInfopNext 链中包含 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 值。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • enableYDegamma 指示为 G 分量启用 sRGB 到线性的转换。

  • enableCbCrDegamma 指示为 R 和 B 分量启用 sRGB 到线性的转换。

有效使用(隐式)
  • VUID-VkSamplerYcbcrConversionYcbcrDegammaCreateInfoQCOM-sType-sType
    sType 必须VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_YCBCR_DEGAMMA_CREATE_INFO_QCOM

要销毁采样器 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 控制主机内存分配,如 内存分配 章节中所述。

有效使用(隐式)
  • VUID-vkDestroySamplerYcbcrConversion-device-parameter
    device 必须是有效的 VkDevice 句柄

  • VUID-vkDestroySamplerYcbcrConversion-ycbcrConversion-parameter
    如果 ycbcrConversion 不是 VK_NULL_HANDLE,则 ycbcrConversion 必须是一个有效的 VkSamplerYcbcrConversion 句柄

  • VUID-vkDestroySamplerYcbcrConversion-pAllocator-parameter
    如果 pAllocator 不是 NULL,则 pAllocator 必须是指向有效 VkAllocationCallbacks 结构的有效指针

  • VUID-vkDestroySamplerYcbcrConversion-ycbcrConversion-parent
    如果 ycbcrConversion 是一个有效的句柄,则它必须是从 device 创建、分配或检索的

主机同步
  • ycbcrConversion 的主机访问必须进行外部同步

除了预定义的边框颜色值之外,应用程序可以通过在 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 值。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • customBorderColor 是一个 VkClearColorValue,表示所需的自定义采样器边框颜色。

  • format 是一个 VkFormat,表示采样图像视图的格式。如果启用了 customBorderColorWithoutFormat 功能,则此字段可以为 VK_FORMAT_UNDEFINED

如果 format 是深度/模板格式,则方面由 VkSamplerCreateInfo::borderColor 的值确定。如果 VkSamplerCreateInfo::borderColorVK_BORDER_COLOR_FLOAT_CUSTOM_EXT,则考虑深度方面。如果 VkSamplerCreateInfo::borderColorVK_BORDER_COLOR_INT_CUSTOM_EXT,则考虑模板方面。

如果 formatVK_FORMAT_UNDEFINEDVkSamplerCreateInfo::borderColorVK_BORDER_COLOR_INT_CUSTOM_EXT,并且采样器与具有模板格式的图像一起使用,则实现必须VkSamplerCreateInfo::customBorderColor 的第一个或第二个分量获取自定义边框颜色,并且应该从第一个分量获取。

有效使用
  • VUID-VkSamplerCustomBorderColorCreateInfoEXT-format-07605
    如果 format 不是 VK_FORMAT_UNDEFINEDformat 不是深度/模板格式,则 VkSamplerCreateInfo::borderColor 类型必须与所提供 format 的采样类型匹配,如 数值格式的解释 表的SPIR-V 类型列所示。

  • VUID-VkSamplerCustomBorderColorCreateInfoEXT-format-04014
    如果未启用 customBorderColorWithoutFormat 功能,则 format 必须不是 VK_FORMAT_UNDEFINED

  • VUID-VkSamplerCustomBorderColorCreateInfoEXT-format-04015
    如果采样器用于采样 VK_FORMAT_B4G4R4A4_UNORM_PACK16VK_FORMAT_B5G6R5_UNORM_PACK16VK_FORMAT_A1B5G5R5_UNORM_PACK16VK_FORMAT_B5G5R5A1_UNORM_PACK16 格式的图像视图,则 format 必须不是 VK_FORMAT_UNDEFINED

有效使用(隐式)
  • VUID-VkSamplerCustomBorderColorCreateInfoEXT-sType-sType
    sType 必须VK_STRUCTURE_TYPE_SAMPLER_CUSTOM_BORDER_COLOR_CREATE_INFO_EXT

  • VUID-VkSamplerCustomBorderColorCreateInfoEXT-format-parameter
    format 必须 为有效的 VkFormat 值。

如果使用 VK_BORDER_COLOR_FLOAT_OPAQUE_BLACKVK_BORDER_COLOR_INT_OPAQUE_BLACKVK_BORDER_COLOR_FLOAT_CUSTOM_EXTVK_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 值。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • components 是一个 VkComponentMapping 结构,指定边框颜色分量的重新映射。

  • srgb 指示采样器将与具有 sRGB 编码图像格式的图像视图组合。

VkComponentMapping components 成员描述了从边框颜色的分量到当使用边框颜色时由着色器图像指令返回的向量分量的重新映射。

有效使用
  • VUID-VkSamplerBorderColorComponentMappingCreateInfoEXT-borderColorSwizzle-06437
    必须启用 borderColorSwizzle 功能。

有效使用(隐式)
  • VUID-VkSamplerBorderColorComponentMappingCreateInfoEXT-sType-sType
    sType 必须VK_STRUCTURE_TYPE_SAMPLER_BORDER_COLOR_COMPONENT_MAPPING_CREATE_INFO_EXT

  • VUID-VkSamplerBorderColorComponentMappingCreateInfoEXT-components-parameter
    components 必须是一个有效的 VkComponentMapping 结构体

VkSamplerBlockMatchWindowCreateInfoQCOM 结构定义为

// Provided by VK_QCOM_image_processing2
typedef struct VkSamplerBlockMatchWindowCreateInfoQCOM {
    VkStructureType                      sType;
    const void*                          pNext;
    VkExtent2D                           windowExtent;
    VkBlockMatchWindowCompareModeQCOM    windowCompareMode;
} VkSamplerBlockMatchWindowCreateInfoQCOM;
有效使用
有效使用(隐式)
  • VUID-VkSamplerBlockMatchWindowCreateInfoQCOM-sType-sType
    sType 必须VK_STRUCTURE_TYPE_SAMPLER_BLOCK_MATCH_WINDOW_CREATE_INFO_QCOM

  • VUID-VkSamplerBlockMatchWindowCreateInfoQCOM-windowCompareMode-parameter
    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 指定窗口化的块匹配操作返回窗口内的最大误差。