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 validVkDevice
handle -
pCreateInfo
must be a pointer to a validVkSamplerCreateInfo
structure -
If
pAllocator
is notNULL
,pAllocator
must be a pointer to a validVkAllocationCallbacks
structure -
pSampler
must be a pointer to aVkSampler
handle
Return Codes
-
VK_SUCCESS
-
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过滤模式
Vulkan filter模式并不能直接和 OpenGL 注意,使用 |
addressModeU
, addressModeV
, 和 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
成员来指定。 若超过了maxSamplerAllocationCount
,vkCreateSampler
将返回 VK_ERROR_TOO_MANY_OBJECTS
。
因为 VkSampler
是一个不可分发handle类型,Vulkan实现可以为相同的采样器状态数组返回一个handle。 在这中情形下, 限制条件,所有的对象都将算作maxSamplerAllocationCount
限制的一个。
正确使用
-
mipLodBias
的绝对值必须小于等于VkPhysicalDeviceLimits
::maxSamplerLodBias
-
若anisotropic sampling 特征没有被启用,
anisotropyEnable
必须是VK_FALSE
-
若
anisotropyEnable
为VK_TRUE
,maxAnisotropy
必须在`1.0` 和 name:VkPhysicalDeviceLimits::maxSamplerAnisotropy
之间,闭区间 -
若
unnormalizedCoordinates
为VK_TRUE
,minFilter
和magFilter
必须相等 -
若
unnormalizedCoordinates
为VK_TRUE
,mipmapMode
必须为VK_SAMPLER_MIPMAP_MODE_NEAREST
-
若
unnormalizedCoordinates
为VK_TRUE
,minLod
和maxLod
必须为0 -
若
unnormalizedCoordinates
为VK_TRUE
,addressModeU
和addressModeV
必须是VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE
, 或者VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER
-
若
unnormalizedCoordinates
为VK_TRUE
,anisotropyEnable
必须为VK_FALSE
-
若
unnormalizedCoordinates
为VK_TRUE
,compareEnable
必须为VK_FALSE
-
若
addressModeU
,addressModeV
或addressModeW
其中任何一个为VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER
,borderColor
必须为一个有效的VkBorderColor
值 -
若 VK_KHR_sampler_mirror_clamp_to_edge 拓展没有被启用,
addressModeU
,addressModeV
和addressModeW
不能为VK_SAMPLER_ADDRESS_MODE_MIRROR_CLAMP_TO_EDGE
-
若
compareEnable
为VK_TRUE
,compareOp
必须是一个有效的VkCompareOp
值
Valid Usage (Implicit)
-
sType
must beVK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO
-
pNext
must beNULL
-
flags
must be0
-
magFilter
must be a validVkFilter
value -
minFilter
must be a validVkFilter
value -
mipmapMode
must be a validVkSamplerMipmapMode
value -
addressModeU
must be a validVkSamplerAddressMode
value -
addressModeV
must be a validVkSamplerAddressMode
value -
addressModeW
must be a validVkSamplerAddressMode
value
可调用如下命令来销毁一个采样器:
void vkDestroySampler(
VkDevice device,
VkSampler sampler,
const VkAllocationCallbacks* pAllocator);
-
device
是销毁采样器的逻辑设备。 -
sampler
是需要被销毁的采样器。 -
pAllocator
控制CPU端内存分配,如Memory Allocation 一章所讲解。
正确使用
-
所有引用到
sampler
的被提交的命令必须已经完成了。 -
若创建
sampler
时提供了VkAllocationCallbacks
,那么就必须提供兼容的回调函数。 -
若创建
sampler
时没有提供VkAllocationCallbacks
,pAllocator
必须为`NULL`
Valid Usage (Implicit)
-
device
must be a validVkDevice
handle -
If
sampler
is notVK_NULL_HANDLE
,sampler
must be a validVkSampler
handle -
If
pAllocator
is notNULL
,pAllocator
must be a pointer to a validVkAllocationCallbacks
structure -
If
sampler
is a valid handle, it must have been created, allocated, or retrieved fromdevice
Host Synchronization
-
Host access to
sampler
must be externally synchronized