Vulkan Specification(Vulkan规范):第十二章 采样器

12. 采样器

VkSampler 对象代表着图像采样器的状态,图像采样器被Vulkan实现用来为着色器读取图像数据并进行过滤和其他变形操作。

采样器通过VkSampler handle表示:

VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkSampler)

可调用如下命令来创建采样器对象:

VkResult vkCreateSampler(
    VkDevice                                    device,
    const VkSamplerCreateInfo*                  pCreateInfo,
    const VkAllocationCallbacks*                pAllocator,
    VkSampler*                                  pSampler);
  • device 是创建采样器的逻辑设备。

  • pCreateInfo 是一个指针,指向一个VkSamplerCreateInfo 实例,指定了采样器对象的状态。

  • pAllocator 控制CPU端内存分配,如Memory Allocation 一章所讲解。

  • pSampler 指向一个VkSampler handle,接收返回的采样器对象。

Valid Usage (Implicit)

  • device must be a valid VkDevice handle

  • pCreateInfo must be a pointer to a valid VkSamplerCreateInfo structure

  • If pAllocator is not NULLpAllocator must be a pointer to a valid VkAllocationCallbacks structure

  • pSampler must be a pointer to a VkSampler handle

Return Codes

Success

  • VK_SUCCESS

Failure

  • VK_ERROR_OUT_OF_HOST_MEMORY

  • VK_ERROR_OUT_OF_DEVICE_MEMORY

  • VK_ERROR_TOO_MANY_OBJECTS

VkSamplerCreateInfo 类型数据结构定义如下:

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 是数据结构的类型。

  • pNext 是 NULL 或者一个指向拓展特定的数据结构的指针。

  • flags 被保留。

  • magFilter 时用于查找的缩放filter,类型为:

    typedef enum VkFilter {
        VK_FILTER_NEAREST = 0,
        VK_FILTER_LINEAR = 1,
    } VkFilter;
  • minFilter 是应用到查找表的缩小过滤器,VkFilter类型。

  • mipmapMode 是应用到查找表的mipmap过滤器,在Texel Filtering 小节中有讲解,可选类型如下:

    typedef enum VkSamplerMipmapMode {
        VK_SAMPLER_MIPMAP_MODE_NEAREST = 0,
        VK_SAMPLER_MIPMAP_MODE_LINEAR = 1,
    } VkSamplerMipmapMode;
  • addressModeU 是对于U坐标在[0..1] 之外的寻址方式。参考 VkSamplerAddressMode

  • addressModeV 是对于V坐标在[0..1] 之外的寻址方式。参考 VkSamplerAddressMode

  • addressModeW 是对于V坐标在[0..1] 之外的寻址方式。参考 VkSamplerAddressMode

  •  mipLodBias 是将添加到 mipmap LOD 计算的偏差值, 此偏差值由SPIR-V提供图像采样函数提供,在 Level-of-Detail Operation 一节中讲解。

  •  anisotropyEnable 为 VK_TRUE 时开启各向异性过滤, 在 Texel Anisotropic Filtering一节中讲解,其值为 VK_FALSE 时则不开启。

  • maxAnisotropy is the anisotropy value clamp.

  • compareEnable 为 VK_TRUE 时开启查找阶段与参考值进行比对的功能,为 VK_FALSE 时则不开启。

    • Note: 一些Vulkan实现里,若这个数字不匹配,那么将使用默认着色器状态。

  • compareOp 是将应用的在过滤前获取数据的函数,在 Depth Compare Operation 一节中讲解。 参看 VkCompareOp

  • minLod 和 maxLod 是用来包裹计算出来的 level-of-detail 值,在 Level-of-Detail Operation 一节中有讲解。 maxLod必须要大于等于  minLod

  • borderColor 是将要使用的预定义的边界颜色,在Texel Replacement 一节讲解,可选类型如下:

    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,
    } VkBorderColor;
  •  unnormalizedCoordinates 控制是否使用未归一化或归一化的纹素坐标来在图像内寻址纹素。 当设置为VK_TRUE时, 用于寻找纹素的图像坐标区间在0和图像维度x、y和z之内。 当设置为 VK_FALSE时,图像坐标的区间是 0 和 1。 当 unnormalizedCoordinates 是 VK_TRUE时,采样器需符合如下要求:

    • minFilter 和 magFilter 必须相等。

    • mipmapMode 必须为 VK_SAMPLER_MIPMAP_MODE_NEAREST.

    • minLod 和 maxLod 必须为0。

    • addressModeU 和 addressModeV 必须是如下二者之一: VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE 、VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER

    • anisotropyEnable 必须为 VK_FALSE

    • compareEnable 必须为 VK_FALSE

  • 当 unnormalizedCoordinates 为 VK_TRUE时,着色器内采样器使用的图像必须满足如下要求:

    • viewType 必须是如下二者之一:VK_IMAGE_VIEW_TYPE_1D 、 VK_IMAGE_VIEW_TYPE_2D

    • 图像视图只能有单层,和一个 mip level。

  • 当 unnormalizedCoordinates 为 VK_TRUE时,着色器内置的使用采样器的图像函数必须满足如下条件:

    • The functions 不能使用投影。

    • The functions 不能使用 offsets。

 

把OpenGL的模式映射到Vulkan过滤模式

magFilter的值 VK_FILTER_NEAREST 和 VK_FILTER_LINEAR直接对应为 GL_NEAREST 和GL_LINEAR放大过滤器。 minFilter 和 mipmapMode 联合起来对应着 OpenGL 缩小过滤器 GL_minFilter_MIPMAP_mipmapMode (e.g. minFilter of VK_FILTER_LINEAR and mipmapMode of VK_SAMPLER_MIPMAP_MODE_NEAREST correspond to GL_LINEAR_MIPMAP_NEAREST)。

Vulkan filter模式并不能直接和 OpenGL GL_LINEAR 或 GL_NEAREST的 缩小 filters直接对应起来,但是,它们可以用 VK_SAMPLER_MIPMAP_MODE_NEARESTminLod = 0, 和 maxLod = 0.25, 和 使用 minFilter = VK_FILTER_LINEAR 或者 minFilter = VK_FILTER_NEAREST,相对应的来模拟。

注意,使用 maxLod 为0时,会导致 放大 总是会被执行,且 magFilter 总是被使用。 这是有效的,这是与OpenGL行为不严格一致的地方。 Clamping the maximum LOD to 0.25 allows the λ value to be non-zero and minification to be performed, while still always rounding down to the base level. If the minFilter and magFilter are equal, then using a maxLod of zero also works.

addressModeUaddressModeV, 和 addressModeW 任何一个必须是如下值:

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,
    VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE = 4,
} VkSamplerAddressMode;

这些值控制了u,v或w坐标在 [0,1] 范围之外的采样行为,在Wrapping Operation 一节中有定义。

  • VK_SAMPLER_ADDRESS_MODE_REPEAT 表明将使用重复铺排模式。

  • VK_SAMPLER_ADDRESS_MODE_MIRRORED_REPEAT 表明将使用镜像重复铺排模式。

  • VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE 表明将使用边缘展开模式(clamp to edge)。

  • VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER 表明将使用边界展开模式( clamp to border)。

  • VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE 表示镜像clamp到边缘 包围模式将会被使用。 若 VK_KHR_mirror_clamp_to_edge 拓展被启用时,这一点才有效。

一个设备上可以同时创建的采样器个数最大值依赖于硬件设备,通过VkPhysicalDeviceLimits数据结构的maxSamplerAllocationCount成员来指定。 若超过了maxSamplerAllocationCountvkCreateSampler 将返回 VK_ERROR_TOO_MANY_OBJECTS

因为 VkSampler 是一个不可分发handle类型,Vulkan实现可以为相同的采样器状态数组返回一个handle。 在这中情形下, 限制条件,所有的对象都将算作maxSamplerAllocationCount限制的一个。

正确使用

  • mipLodBias 的绝对值必须小于等于 VkPhysicalDeviceLimits::maxSamplerLodBias

  • anisotropic sampling 特征没有被启用,anisotropyEnable 必须是VK_FALSE

  • anisotropyEnable 为 VK_TRUEmaxAnisotropy 必须在`1.0` 和 name:VkPhysicalDeviceLimits::maxSamplerAnisotropy之间,闭区间

  • 若 unnormalizedCoordinates 为VK_TRUEminFilter 和magFilter 必须相等

  • 若 unnormalizedCoordinates 为 VK_TRUEmipmapMode必须为 VK_SAMPLER_MIPMAP_MODE_NEAREST

  • 若 unnormalizedCoordinates 为 VK_TRUEminLod 和maxLod 必须为0

  • 若 unnormalizedCoordinates 为 VK_TRUEaddressModeUaddressModeV 必须是VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE, 或者VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER

  • 若 unnormalizedCoordinates 为 VK_TRUEanisotropyEnable 必须为VK_FALSE

  • 若 unnormalizedCoordinates 为 VK_TRUEcompareEnable必须为VK_FALSE

  • 若 addressModeUaddressModeV 或 addressModeW其中任何一个为VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER, borderColor必须为一个有效的VkBorderColor 值

  • 若 VK_KHR_sampler_mirror_clamp_to_edge 拓展没有被启用, addressModeUaddressModeV 和 addressModeW 不能为VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE

  • 若 compareEnable 为 VK_TRUEcompareOp 必须是一个有效的VkCompareOp 值

Valid Usage (Implicit)

可调用如下命令来销毁一个采样器:

void vkDestroySampler(
    VkDevice                                    device,
    VkSampler                                   sampler,
    const VkAllocationCallbacks*                pAllocator);
  • device 是销毁采样器的逻辑设备。

  • sampler 是需要被销毁的采样器。

  • pAllocator 控制CPU端内存分配,如Memory Allocation 一章所讲解。

正确使用

  • 所有引用到sampler的被提交的命令必须已经完成了。

  • 若创建sampler 时提供了VkAllocationCallbacks,那么就必须提供兼容的回调函数。

  • 若创建sampler 时没有提供VkAllocationCallbackspAllocator 必须为`NULL`

Valid Usage (Implicit)

  • device must be a valid VkDevice handle

  • If sampler is not VK_NULL_HANDLEsampler must be a valid VkSampler handle

  • If pAllocator is not NULLpAllocator must be a pointer to a valid VkAllocationCallbacks structure

  • If sampler is a valid handle, it must have been created, allocated, or retrieved from device

Host Synchronization

  • Host access to sampler must be externally synchronized

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值