11.5. 图像视图
图像对象不会被管线着色器直接读写访问。作为替代,图像视图,表示图像资源连续的一部分,带有附加的元信息,可用作上述目的。 视图必须以与图像兼容的类型来被创建,必须表示图像资源的一个有效子集合。
图像视图通过VkImageView
类型的handle表示:
VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkImageView)
可以被创建的 图像视图的类型:
typedef enum VkImageViewType {
VK_IMAGE_VIEW_TYPE_1D = 0,
VK_IMAGE_VIEW_TYPE_2D = 1,
VK_IMAGE_VIEW_TYPE_3D = 2,
VK_IMAGE_VIEW_TYPE_CUBE = 3,
VK_IMAGE_VIEW_TYPE_1D_ARRAY = 4,
VK_IMAGE_VIEW_TYPE_2D_ARRAY = 5,
VK_IMAGE_VIEW_TYPE_CUBE_ARRAY = 6,
} VkImageViewType;
图像视图的准确类型部分是隐式的,基于图像的类型、采样数量,和 下表 描述的视图创建参数。这个表格也展示了每一个图像视图类型在SPIR-V中对应的OpTypeImage Dim 和 Arrayed等参数。
可调用下面命令来创建图像视图:
VkResult vkCreateImageView(
VkDevice device,
const VkImageViewCreateInfo* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
VkImageView* pView);
-
device
是创建图像视图的逻辑设备。 -
pCreateInfo
是一个指针,指向一个VkImageViewCreateInfo
数据结构实例,它包含了创建图像视图所需的信息。 -
pAllocator
控制CPU端内存分配,如 内存分配 一章详述。 -
pView
指向一个VkImageView
handle,它是被返回的新生成的图像视图对象。
图像创建参数的一部分被视图所继承,剩余的参数被包含在pCreateInfo
中。
Valid Usage (Implicit)
-
device
must be a validVkDevice
handle -
pCreateInfo
must be a pointer to a validVkImageViewCreateInfo
structure -
If
pAllocator
is notNULL
,pAllocator
must be a pointer to a validVkAllocationCallbacks
structure -
pView
must be a pointer to aVkImageView
handle
Return Codes
-
VK_SUCCESS
-
VK_ERROR_OUT_OF_HOST_MEMORY
-
VK_ERROR_OUT_OF_DEVICE_MEMORY
VkImageViewCreateInfo
类型定义如下:
typedef struct VkImageViewCreateInfo {
VkStructureType sType;
const void* pNext;
VkImageViewCreateFlags flags;
VkImage image;
VkImageViewType viewType;
VkFormat format;
VkComponentMapping components;
VkImageSubresourceRange subresourceRange;
} VkImageViewCreateInfo;
-
sType
是这个数据结构的类型。 -
pNext
是`NULL` 或者一个指向拓展特定的数据结构的指针。 -
flags
被保留使用。 -
image
is aVkImage
on which the view will be created. -
viewType
是图像视图的类型。 -
format
是一个VkFormat
类型数据,描述了用于结束图像中数据元素的格式和类型。 -
components
指定了颜色成员(或深度成员,或转换到颜色成员之后的 stencil 成员)重映射。 参考VkComponentMapping
。 -
subresourceRange
是一个VkImageSubresourceRange
,选择来view可访问的mipmap levels和array layers。
若以VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT
创建 image
,format
可以与该图像的格式不同, 但是若它们不等同, 那么它们必须是兼容的。 图像格式兼容性在 Format Compatibility Classes 小节中定义。
Dim, Arrayed, MS | Image parameters | View parameters |
---|---|---|
|
| |
1D, 0, 0 |
|
|
1D, 1, 0 |
|
|
2D, 0, 0 |
|
|
2D, 1, 0 |
|
|
2D, 0, 1 |
|
|
2D, 1, 1 |
|
|
CUBE, 0, 0 |
|
|
CUBE, 1, 0 |
|
|
3D, 0, 0 |
|
|
Valid Usage
-
若创建
image
时没有带有VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT
,那么viewType
不能是VK_IMAGE_VIEW_TYPE_CUBE
或VK_IMAGE_VIEW_TYPE_CUBE_ARRAY
-
若 image cubemap arrays 特征没有被启用,
viewType
不能是VK_IMAGE_VIEW_TYPE_CUBE_ARRAY
-
若 ETC2 texture compression特征没有被启用,
format
不能是VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK
,VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK
,VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK
,VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK
,VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK
,VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK
,VK_FORMAT_EAC_R11_UNORM_BLOCK
,VK_FORMAT_EAC_R11_SNORM_BLOCK
,VK_FORMAT_EAC_R11G11_UNORM_BLOCK
,或VK_FORMAT_EAC_R11G11_SNORM_BLOCK
-
若ASTC LDR texture compression特征没有被启用,
format
不能是VK_FORMAT_ASTC_4x4_UNORM_BLOCK
,VK_FORMAT_ASTC_4x4_SRGB_BLOCK
,VK_FORMAT_ASTC_5x4_UNORM_BLOCK
,VK_FORMAT_ASTC_5x4_SRGB_BLOCK
,VK_FORMAT_ASTC_5x5_UNORM_BLOCK
,VK_FORMAT_ASTC_5x5_SRGB_BLOCK
,VK_FORMAT_ASTC_6x5_UNORM_BLOCK
,VK_FORMAT_ASTC_6x5_SRGB_BLOCK
,VK_FORMAT_ASTC_6x6_UNORM_BLOCK
,VK_FORMAT_ASTC_6x6_SRGB_BLOCK
,VK_FORMAT_ASTC_8x5_UNORM_BLOCK
,VK_FORMAT_ASTC_8x5_SRGB_BLOCK
,VK_FORMAT_ASTC_8x6_UNORM_BLOCK
,VK_FORMAT_ASTC_8x6_SRGB_BLOCK
,VK_FORMAT_ASTC_8x8_UNORM_BLOCK
,VK_FORMAT_ASTC_8x8_SRGB_BLOCK
,VK_FORMAT_ASTC_10x5_UNORM_BLOCK
,VK_FORMAT_ASTC_10x5_SRGB_BLOCK
,VK_FORMAT_ASTC_10x6_UNORM_BLOCK
,VK_FORMAT_ASTC_10x6_SRGB_BLOCK
,VK_FORMAT_ASTC_10x8_UNORM_BLOCK
,VK_FORMAT_ASTC_10x8_SRGB_BLOCK
,VK_FORMAT_ASTC_10x10_UNORM_BLOCK
,VK_FORMAT_ASTC_10x10_SRGB_BLOCK
,VK_FORMAT_ASTC_12x10_UNORM_BLOCK
,VK_FORMAT_ASTC_12x10_SRGB_BLOCK
,VK_FORMAT_ASTC_12x12_UNORM_BLOCK
,或VK_FORMAT_ASTC_12x12_SRGB_BLOCK
-
若 BC texture compression 特征没有被启用,
format
不能是VK_FORMAT_BC1_RGB_UNORM_BLOCK
,VK_FORMAT_BC1_RGB_SRGB_BLOCK
,VK_FORMAT_BC1_RGBA_UNORM_BLOCK
,VK_FORMAT_BC1_RGBA_SRGB_BLOCK
,VK_FORMAT_BC2_UNORM_BLOCK
,VK_FORMAT_BC2_SRGB_BLOCK
,VK_FORMAT_BC3_UNORM_BLOCK
,VK_FORMAT_BC3_SRGB_BLOCK
,VK_FORMAT_BC4_UNORM_BLOCK
,VK_FORMAT_BC4_SNORM_BLOCK
,VK_FORMAT_BC5_UNORM_BLOCK
,VK_FORMAT_BC5_SNORM_BLOCK
,VK_FORMAT_BC6H_UFLOAT_BLOCK
,VK_FORMAT_BC6H_SFLOAT_BLOCK
,VK_FORMAT_BC7_UNORM_BLOCK
,或VK_FORMAT_BC7_SRGB_BLOCK
-
若创建
image
时带有VK_IMAGE_TILING_LINEAR
,format
必须是 一种格式,至少有一个受支持的bit 是 通过以相同值的format
调用vkGetPhysicalDeviceFormatProperties
返回的VkFormatProperties
::linearTilingFeatures
其中的一个bit值。 -
创建
image
时 必须让usage
value包含 至少VK_IMAGE_USAGE_SAMPLED_BIT
,VK_IMAGE_USAGE_STORAGE_BIT
,VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT
,VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT
,或VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT
其中的一个 -
若创建
image
时带有VK_IMAGE_TILING_LINEAR
且usage
包含VK_IMAGE_USAGE_SAMPLED_BIT
,format
必须 被采样图像支持, 通过以相同值的format
调用vkGetPhysicalDeviceFormatProperties
返回的VkFormatProperties
::linearTilingFeatures
的VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT
指定的值。 -
若创建
image
时带有VK_IMAGE_TILING_LINEAR
且usage
包含VK_IMAGE_USAGE_STORAGE_BIT
,format
必须 被存储图像所支持,如VkFormatProperties
::linearTilingFeatures
中VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT
标识位所指定, 该数据结构通过以相同的format
参数调用vkGetPhysicalDeviceFormatProperties
返回, -
若创建
image
时 带有VK_IMAGE_TILING_LINEAR
,且usage
包含VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT
,format
必须被颜色附件所支持, 如VkFormatProperties
::linearTilingFeatures
中的VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT
标识位所指定, 该数据结构通过调用vkGetPhysicalDeviceFormatProperties
返回,得到相同的format
。 -
若创建
image
时带有VK_IMAGE_TILING_LINEAR
且usage
包含VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT
,format
必须 被depth/stencil附件所支持,如VkFormatProperties
::linearTilingFeatures
中的VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT
标识位所指定, 该数据结构通过以相同的format
参数调用vkGetPhysicalDeviceFormatProperties
返回 -
若创建
image
时带有VK_IMAGE_TILING_OPTIMAL
,format
中至少有一个bit位,出现在 通过以相同的format
参数调用vkGetPhysicalDeviceFormatProperties
返回的VkFormatProperties
::optimalTilingFeatures
的值当中, -
若创建
image
时带有VK_IMAGE_TILING_OPTIMAL
,且usage
包含VK_IMAGE_USAGE_SAMPLED_BIT
,format
必须 被采样图像所支持,如VkFormatProperties
::optimalTilingFeatures
中的VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT
标识位所指定, 该数据结构通过以相同的format
参数调用vkGetPhysicalDeviceFormatProperties
返回 -
若创建
image
时带有VK_IMAGE_TILING_OPTIMAL
且usage
包含VK_IMAGE_USAGE_STORAGE_BIT
,format
必须 被存储图像所支持,如VkFormatProperties
::optimalTilingFeatures
中VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT
标识位所指定, 该数据结构通过以相同的format
参数调用vkGetPhysicalDeviceFormatProperties
返回 -
若创建
image
时带有VK_IMAGE_TILING_OPTIMAL
且usage
包含VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT
,format
必须被颜色附件所支持,如VkFormatProperties
::optimalTilingFeatures
中的VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT
标识位所指定, 该数据结构通过以相同的format
参数调用vkGetPhysicalDeviceFormatProperties
返回 -
若创建
image
时带有VK_IMAGE_TILING_OPTIMAL
且usage
包含VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT
,format
必须不为 depth/stencil 附件所支持,如VkFormatProperties
::optimalTilingFeatures
中的VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT
标识位所指定, 该数据结构通过以相同的format
参数调用vkGetPhysicalDeviceFormatProperties
返回 -
subresourceRange
必须时一个对image
来说有效的图像子资源区间 (参考 图像视图) -
若创建
image
时带有VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT
标识位,format
必须与 用来创建image
的format
相兼容, 如 Format Compatibility Classes -
若创建
image
时没有带有VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT
标识位,format
必须与 创建image
的format
完全相同 -
若
image
是 非-稀疏的,那么它必须与单个VkDeviceMemory
对象完全并连续绑定。 -
subResourceRange
和viewType
必须 与图像兼容,如 compatibility table所描述。
Valid Usage (Implicit)
-
sType
must beVK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO
-
pNext
must beNULL
-
flags
must be0
-
image
must be a validVkImage
handle -
viewType
must be a validVkImageViewType
value -
format
must be a validVkFormat
value -
components
must be a validVkComponentMapping
structure -
subresourceRange
must be a validVkImageSubresourceRange
structure
VkImageSubresourceRange
类型数据结构定义如下:
typedef struct VkImageSubresourceRange {
VkImageAspectFlags aspectMask;
uint32_t baseMipLevel;
uint32_t levelCount;
uint32_t baseArrayLayer;
uint32_t layerCount;
} VkImageSubresourceRange;
-
aspectMask
是一个位掩码,表明该图像的哪个(些)aspect被视图所包含。参考VkImageAspectFlagBits
. -
baseMipLevel
是视图可以访问的第一个mipmap层级。 -
levelCount
是视图可以访问的mipmap层级的数量(从baseMipLevel
开始)。 -
baseArrayLayer
是视图可以访问的第一个array layer。 -
layerCount
是视图可以访问的array layers 的数量(从baseArrayLayer
开始)。
mipmap 层数和array layers的数量必须是图像中图像资源的子集。 如果一个应用程序想要使用在baseMipLevel
或 baseArrayLayer
之后的所有的mipmap层或者图像的layer, 它可以设置levelCount
和 layerCount
为特殊值 VK_REMAINING_MIP_LEVELS
和 VK_REMAINING_ARRAY_LAYERS
,而不用知道mipmap层和layer的准确大小。
对于立方和cube array视图,图像视图的layer从baseArrayLayer
开始,依序分别对应+X, -X, +Y, -Y, +Z, -Z 面。 对于立方体 arrays,六个连续层级的每一个都是单独的一个立方体,所以立方体map数组视图中的 立方体maps个数是 layerCount
/ 6, 且 图像数组层级 baseArrayLayer
+ i 是立方体 i / 6 的 i mod 6 个面的索引。 若不管layerCount
中显式设置的值或者VK_REMAINING_ARRAY_LAYERS
指定的值,视图中层级的数量不是6的倍数, 索引最后一个立方体的行为是未定义的。
aspectMask
是一个位掩码,表明了被使用的格式。bit位包括如下:
typedef enum VkImageAspectFlagBits {
VK_IMAGE_ASPECT_COLOR_BIT = 0x00000001,
VK_IMAGE_ASPECT_DEPTH_BIT = 0x00000002,
VK_IMAGE_ASPECT_STENCIL_BIT = 0x00000004,
VK_IMAGE_ASPECT_METADATA_BIT = 0x00000008,
} VkImageAspectFlagBits;
若format
是一个颜色,depth-only或 stencil-only 格式,那么此掩码必须对应的是 VK_IMAGE_ASPECT_COLOR_BIT
,VK_IMAGE_ASPECT_DEPTH_BIT
或 VK_IMAGE_ASPECT_STENCIL_BIT
。 若使用一个 depth/stencil 格式的 depth 和 stencil 成员,aspectMask
必须至少包含 VK_IMAGE_ASPECT_DEPTH_BIT
和 VK_IMAGE_ASPECT_STENCIL_BIT
其中一个,或全都包含。
When using an imageView of a depth/stencil image to populate a descriptor set (e.g. for sampling in the shader,或 for use as an input attachment), the aspectMask
必须 only include one bit and selects whether the imageView is used for depth reads (i.e. using a floating-point sampler或 input attachment in the shader)或 stencil reads (i.e. using an unsigned integer sampler或 input attachment in the shader). When an imageView of a depth/stencil image is used as a depth/stencil framebuffer attachment, the aspectMask
is ignored and both depth and stencil image subresources are used.
components
成员是VkComponentMapping
类型的,且描述了 从该图像的成员 重映射到 着色器图像指令返回的数组的成员。
这个重映射必须对storage image descriptors, input attachment descriptors, 和 framebuffer attachments来说是完全一致的。
Valid Usage
-
若
levelCount
is notVK_REMAINING_MIP_LEVELS
,levelCount
必须 be non-zero and (baseMipLevel
+levelCount
) 必须 be小于或 等于 themipLevels
specified inVkImageCreateInfo
when该图像 was created -
若
layerCount
is notVK_REMAINING_ARRAY_LAYERS
,layerCount
必须 be non-zero and (baseArrayLayer
+layerCount
) 必须 be小于或 等于 thearrayLayers
specified inVkImageCreateInfo
when该图像 was created
Valid Usage (Implicit)
-
aspectMask
must be a valid combination ofVkImageAspectFlagBits
values -
aspectMask
must not be0
VkComponentMapping
类型数据结构定义如下:
typedef struct VkComponentMapping {
VkComponentSwizzle r;
VkComponentSwizzle g;
VkComponentSwizzle b;
VkComponentSwizzle a;
} VkComponentMapping;
-
r
决定了输出向量中R成员的值。 -
g
决定了输出向量中G成员的值。 -
b
决定了输出向量中B成员的值。 -
a
决定了输出向量中A成员的值。
r
, g
, b
, and a
其一的值都是如下的一个:
typedef enum VkComponentSwizzle {
VK_COMPONENT_SWIZZLE_IDENTITY = 0,
VK_COMPONENT_SWIZZLE_ZERO = 1,
VK_COMPONENT_SWIZZLE_ONE = 2,
VK_COMPONENT_SWIZZLE_R = 3,
VK_COMPONENT_SWIZZLE_G = 4,
VK_COMPONENT_SWIZZLE_B = 5,
VK_COMPONENT_SWIZZLE_A = 6,
} VkComponentSwizzle;
-
VK_COMPONENT_SWIZZLE_IDENTITY
: 此成员被设置为各自的值。 -
VK_COMPONENT_SWIZZLE_ZERO
: 此成员被设置为0。 -
VK_COMPONENT_SWIZZLE_ONE
: t此成员被设置为 1或 1.0,取决于该图像视图格式的类型是整型还是浮点型,如 Format Definition 小节中每种VkFormat
所描述。 -
VK_COMPONENT_SWIZZLE_R
: 此成员被设置到该图像的R成员。 -
VK_COMPONENT_SWIZZLE_G
: 此成员被设置到该图像的G成员。 -
VK_COMPONENT_SWIZZLE_B
: 此成员被设置到该图像的B成员。 -
VK_COMPONENT_SWIZZLE_A
: 此成员被设置到该图像的A成员。
Setting the identity swizzle on a component is equivalent to setting the identity mapping on that component. That is:
Component | Identity Mapping |
---|---|
|
|
|
|
|
|
|
|
Valid Usage (Implicit)
-
r
must be a validVkComponentSwizzle
value -
g
must be a validVkComponentSwizzle
value -
b
must be a validVkComponentSwizzle
value -
a
must be a validVkComponentSwizzle
value
可调用下列命令来销毁图像视图:
void vkDestroyImageView(
VkDevice device,
VkImageView imageView,
const VkAllocationCallbacks* pAllocator);
-
device
是销毁图像视图的逻辑设备。 -
imageView
是需要被销毁的图像视图。 -
pAllocator
控制CPU端内存分配,如 内存分配 一章详述。
Valid Usage
-
所有指向
imageView
的被提交的命令 必须已经完成执行。 -
若当创建
imageView
时提供了VkAllocationCallbacks
,那么此处必须提供兼容的回调函数。 -
若当创建
imageView
时没有提供VkAllocationCallbacks
,那么此处pAllocator
必须为NULL
Valid Usage (Implicit)
-
device
must be a validVkDevice
handle -
If
imageView
is notVK_NULL_HANDLE
,imageView
must be a validVkImageView
handle -
If
pAllocator
is notNULL
,pAllocator
must be a pointer to a validVkAllocationCallbacks
structure -
If
imageView
is a valid handle, it must have been created, allocated, or retrieved fromdevice
Host Synchronization
-
Host access to
imageView
must be externally synchronized