11.3. 图像
图像表示多维(最多3维)的数组数据,可用于各种目的(比如:附件,纹理),通过描述符集合把它们绑定到一个图形或者计算管线, 或者直接当作参数直接传递个某些命令。
图像通过VkImage
类型的handle表示:
VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkImage)
可调用下列命令来创建图像:
VkResult vkCreateImage(
VkDevice device,
const VkImageCreateInfo* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
VkImage* pImage);
-
device
是创建图像的逻辑设备。 -
pCreateInfo
是一个指针,指向一个VkImageCreateInfo
数据结构实例,它包含了创建图像所需的信息。 -
pAllocator
控制CPU端内存分配,如 内存分配 一章详述。 -
pImage
指向已创建并返回的VkImage
handle。
Valid Usage
-
若
pCreateInfo
的成员flags
包含VK_IMAGE_CREATE_SPARSE_BINDING_BIT
,创建这个VkImage
不能导致当前有效稀疏资源 在总体需求的稀疏内存超过VkPhysicalDeviceLimits
::sparseAddressSpaceSize
Valid Usage (Implicit)
-
device
must be a validVkDevice
handle -
pCreateInfo
must be a pointer to a validVkImageCreateInfo
structure -
If
pAllocator
is notNULL
,pAllocator
must be a pointer to a validVkAllocationCallbacks
structure -
pImage
must be a pointer to aVkImage
handle
Return Codes
-
VK_SUCCESS
-
VK_ERROR_OUT_OF_HOST_MEMORY
-
VK_ERROR_OUT_OF_DEVICE_MEMORY
VkImageCreateInfo
类型数据结构定义如下:
typedef struct VkImageCreateInfo {
VkStructureType sType;
const void* pNext;
VkImageCreateFlags flags;
VkImageType imageType;
VkFormat format;
VkExtent3D extent;
uint32_t mipLevels;
uint32_t arrayLayers;
VkSampleCountFlagBits samples;
VkImageTiling tiling;
VkImageUsageFlags usage;
VkSharingMode sharingMode;
uint32_t queueFamilyIndexCount;
const uint32_t* pQueueFamilyIndices;
VkImageLayout initialLayout;
} VkImageCreateInfo;
-
sType
是数据结构的类型。 -
pNext
是NULL
或者一个指向 拓展特定的数据结构的指针。 -
flags
是一个位掩码,描述了图像的附加参数。参考 如下VkImageCreateFlagBits
关于受支持的bit描述。 -
imageType
是一个VkImageType
,指定了图像的基础维度,如下所描述。数组纹理的层次作为图像类别时并不能算作维度 -
format
是一个VkFormat
,描述了数据元素的格式与类型,数据包含在图像中。 -
extent
是一个VkExtent3D
,描述了基础层次中每一个维度的元素的个数。 -
mipLevels
描述了图向下采样的细节层次的个数。 -
arrayLayers
是图像中的层数。 -
samples
是图像中sub-data 元素采样的个数,其在VkSampleCountFlagBits
中被定义。 参考Multisampling。 -
tiling
是一个VkImageTiling
,指定了内存中数据元素的tiling组织方式,如下所描述。 -
usage
是一个 bitmask,描述图像的目标使用方式。参考如下的VkImageUsageFlagBits
支持的bit。 -
sharingMode
是当多个队列族的访问时图像的共享模式, 且 必须: 是下一节的 Resource Sharing 的VkSharingMode
描述的值之一。 -
queueFamilyIndexCount
是pQueueFamilyIndices
数组元素的个数。 -
pQueueFamilyIndices
是一个队列族的列表,该队列族将访问此图像 (ignored ifsharingMode
is notVK_SHARING_MODE_CONCURRENT
)。 -
initialLayout
选择 此图像的所有图像子资源的 初始VkImageLayout
状态。 参看 Image Layouts。initialLayout
必须: 是VK_IMAGE_LAYOUT_UNDEFINED
或者VK_IMAGE_LAYOUT_PREINITIALIZED
。
使用tiling
值为VK_IMAGE_TILING_LINEAR
创建的图像,比使用tiling
值为VK_IMAGE_TILING_OPTIMAL
创建的图像由更多的限制。 使用 VK_IMAGE_TILING_LINEAR
创建的图像可能不被支持,除非其他参数满足如下限制:
-
imageType
是VK_IMAGE_TYPE_2D
-
format
不是 depth/stencil 格式 -
mipLevels
是 1 -
arrayLayers
是 1 -
samples
是VK_SAMPLE_COUNT_1_BIT
-
usage
只包含VK_IMAGE_USAGE_TRANSFER_SRC_BIT
和/或VK_IMAGE_USAGE_TRANSFER_DST_BIT
除了上面表格所列,Vulkan实现可能支持附加的限制条件和功能。
对于给定的 format
, type
, tiling
, usage
, and flags
组合方式的能力,可以通过调用 vkGetPhysicalDeviceImageFormatProperties
来 向Vulkan实现查询。 返回值可表示对于图像的该种组合方式是否受支持。 若支持, VkImageFormatProperties
输出参数表示有效的 samples
bits和 extent
参数的限制的集合。
可调用如下函数来获知对于给定格式有效的标志位集合:
Valid Usage
-
format
,type
,tiling
,usage
,和flags
的组合 必须: 被支持, 若把对应的值传递到相对应的参数里,并调用vkGetPhysicalDeviceImageFormatProperties
,其返回值为VK_SUCCESS 可表明支持。 -
若
sharingMode
是VK_SHARING_MODE_CONCURRENT
,pQueueFamilyIndices
必须: 是一个指向 a pointer to an array of元素类型为uint32_t
,元素个数为queueFamilyIndexCount
的数组的指针。 -
若
sharingMode
是VK_SHARING_MODE_CONCURRENT
,queueFamilyIndexCount
必须: 大于1
-
format
不能: 是VK_FORMAT_UNDEFINED
-
extent
的成员width
,height
, 和depth
不能: 全大于`0` -
mipLevels
必须: 大于0
-
arrayLayers
必须: 大于0
-
若
flags
包含VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT
,imageType
必须是VK_IMAGE_TYPE_2D
-
若
imageType
是VK_IMAGE_TYPE_1D
,extent.width
必须: 小于等于VkPhysicalDeviceLimits
::maxImageDimension1D
或者VkImageFormatProperties
::maxExtent.width
(as returned byvkGetPhysicalDeviceImageFormatProperties
withformat
,type
,tiling
,usage
, andflags
等于 those in this structure) - 与值大的比较。 -
若
imageType
是VK_IMAGE_TYPE_2D
且flags
不包含VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT
,extent.width
和extent.height
必须: 小于等于VkPhysicalDeviceLimits
::maxImageDimension2D
, 或者VkImageFormatProperties
::maxExtent.width
/height (as returned byvkGetPhysicalDeviceImageFormatProperties
withformat
,type
,tiling
,usage
, andflags
等于 those in this structure) - 与值大的比较。 -
若
imageType
是VK_IMAGE_TYPE_2D
且flags
包含VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT
,extent.width
且extent.height
必须: 小于等于VkPhysicalDeviceLimits
::maxImageDimensionCube
, 或者VkImageFormatProperties
::maxExtent.width
/height (as returned byvkGetPhysicalDeviceImageFormatProperties
withformat
,type
,tiling
,usage
, andflags
等于 those in this structure) - 与值大的比较。 -
若
imageType
是VK_IMAGE_TYPE_2D
且flags
包含VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT
,extent.width
且extent.height
必须: 相等 且arrayLayers
必须: 大于等于 6 -
若
imageType
是VK_IMAGE_TYPE_3D
,extent.width
,extent.height
且extent.depth
必须: 小于等于VkPhysicalDeviceLimits
::maxImageDimension3D
, 或者VkImageFormatProperties
::maxExtent.width
/height/depth (as returned byvkGetPhysicalDeviceImageFormatProperties
withformat
,type
,tiling
,usage
, andflags
等于 those in this structure) - 与值大的比较。 -
若
imageType
是VK_IMAGE_TYPE_1D
,extent.height
和extent.depth
都 必须: 等于`1` -
若
imageType
是VK_IMAGE_TYPE_2D
,extent.depth
必须: 等于1
-
mipLevels
必须: 小于等于 ⌊log2(max(extent.width
,extent.height
,extent.depth
))⌋ + 1. -
若
extent.width
,extent.height
, 或者extent.depth
之中任意一个大于VkPhysicalDeviceLimits
::maxImageDimension3D
中对等的名字的成员的数量,mipLevels
必须: 小于等于VkImageFormatProperties
::maxMipLevels
(as returned byvkGetPhysicalDeviceImageFormatProperties
withformat
,type
,tiling
,usage
, andflags
等于 those in this structure) -
arrayLayers
必须小于等于VkImageFormatProperties
::maxArrayLayers
(as returned byvkGetPhysicalDeviceImageFormatProperties
withformat
,type
,tiling
,usage
, andflags
等于 those in this structure) -
若
imageType
是VK_IMAGE_TYPE_3D
,arrayLayers
必须: 等于1
. -
若
samples
不是VK_SAMPLE_COUNT_1_BIT
,imageType
必须 是VK_IMAGE_TYPE_2D
,flags
必须不能包含VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT
,tiling
必须 beVK_IMAGE_TILING_OPTIMAL
, andmipLevels
必须 be 等于1
-
若
usage
包含VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT
, then bits other thanVK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT
,VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT
, andVK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT
必须 not be set -
若
usage
包含VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT
,VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT
,VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT
,或VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT
,extent.width
必须 be 小于或 等于VkPhysicalDeviceLimits
::maxFramebufferWidth
-
若
usage
包含VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT
,VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT
,VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT
,或VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT
,extent.height
必须 be 小于或 等于VkPhysicalDeviceLimits
::maxFramebufferHeight
-
若
usage
包含VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT
,usage
必须也包含至少VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT
,VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT
,或VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT
中的一个。 -
samples
必须是一个bit value,被设置到VkImageFormatProperties
::sampleCounts
,该数值可通过 以等于此数据集结构中的format
,type
,tiling
,usage
, andflags
参数来调用vkGetPhysicalDeviceImageFormatProperties
返回。 -
若 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
-
若multisampled storage images 特征没有被启用,且
usage
包含VK_IMAGE_USAGE_STORAGE_BIT
,samples
必须是VK_SAMPLE_COUNT_1_BIT
-
若sparse bindings 特征没有被启用,
flags
必须 不能包含VK_IMAGE_CREATE_SPARSE_BINDING_BIT
-
若
imageType
isVK_IMAGE_TYPE_1D
,flags
必须 不能 包含VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT
-
若 sparse residency for 2D images特征没有被启用, 且
imageType
是VK_IMAGE_TYPE_2D
,flags
必须 不能包含VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT
-
若sparse residency for 3D images特征没有被启用, 且
imageType
isVK_IMAGE_TYPE_3D
,flags
必须不能包含VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT
-
若the sparse residency for images with 2 samples特征没有被启用,
imageType
是VK_IMAGE_TYPE_2D
, 且samples
是VK_SAMPLE_COUNT_2_BIT
,flags
必须 不能包含VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT
-
若sparse residency for images with 4 samples特征没有被启用,
imageType
是VK_IMAGE_TYPE_2D
, 且samples
是VK_SAMPLE_COUNT_4_BIT
,flags
必须 不能包含VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT
-
若 sparse residency for images with 8 samples特征没有被启用,
imageType
是VK_IMAGE_TYPE_2D
, 且samples
是VK_SAMPLE_COUNT_8_BIT
,flags
必须 不能包含VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT
-
若sparse residency for images with 16 samples特征没有被启用,
imageType
是VK_IMAGE_TYPE_2D
, 且samples
是VK_SAMPLE_COUNT_16_BIT
,flags
必须 不能包含VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT
-
若
tiling
isVK_IMAGE_TILING_LINEAR
,format
必须是一个VkFormatProperties
::linearTilingFeatures
数据中的一个特征bit的格式,该数据是通过以format
相同值为参数 调用vkGetPhysicalDeviceFormatProperties
获取的。 -
若
tiling
isVK_IMAGE_TILING_LINEAR
, 和VkFormatProperties
::linearTilingFeatures
(as returned byvkGetPhysicalDeviceFormatProperties
with the same value offormat
) 不包含VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT
,usage
必须不能包含VK_IMAGE_USAGE_SAMPLED_BIT
-
若
tiling
isVK_IMAGE_TILING_LINEAR
, 和VkFormatProperties
::linearTilingFeatures
(as returned byvkGetPhysicalDeviceFormatProperties
with the same value offormat
) 不包含VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT
,usage
必须不能包含VK_IMAGE_USAGE_STORAGE_BIT
-
若
tiling
isVK_IMAGE_TILING_LINEAR
, 和VkFormatProperties
::linearTilingFeatures
(as returned byvkGetPhysicalDeviceFormatProperties
with the same value offormat
) 不包含VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT
,usage
必须不能 包含VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT
-
若
tiling
isVK_IMAGE_TILING_LINEAR
, 和VkFormatProperties
::linearTilingFeatures
(as returned byvkGetPhysicalDeviceFormatProperties
with the same value offormat
) 不包含VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT
,usage
must not包含VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT
-
若
tiling
是VK_IMAGE_TILING_OPTIMAL
,format
必须 是 value ofVkFormatProperties
::optimalTilingFeatures
其中一个受支持的特征bit的格式 ,该数据是通过以format
相同值为参数 调用vkGetPhysicalDeviceFormatProperties
获取的。 -
若
tiling
是VK_IMAGE_TILING_OPTIMAL
, 且VkFormatProperties
::optimalTilingFeatures
(as returned byvkGetPhysicalDeviceFormatProperties
with the same value offormat
) 不包含VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT
,usage
必须不能包含VK_IMAGE_USAGE_SAMPLED_BIT
-
若
tiling
是VK_IMAGE_TILING_OPTIMAL
, 且VkFormatProperties
::optimalTilingFeatures
(as returned byvkGetPhysicalDeviceFormatProperties
with the same value offormat
) 不包含VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT
,usage
必须不能包含VK_IMAGE_USAGE_STORAGE_BIT
-
若
tiling
是VK_IMAGE_TILING_OPTIMAL
, 且VkFormatProperties
::optimalTilingFeatures
(as returned byvkGetPhysicalDeviceFormatProperties
with the same value offormat
) 不包含VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT
,usage
必须不能 包含VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT
-
若
tiling
是VK_IMAGE_TILING_OPTIMAL
, 且VkFormatProperties
::optimalTilingFeatures
(as returned byvkGetPhysicalDeviceFormatProperties
with the same value offormat
) 不包含VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT
,usage
不能 包含VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT
-
若
flags
包含VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT
或VK_IMAGE_CREATE_SPARSE_ALIASED_BIT
, 它必须也包含VK_IMAGE_CREATE_SPARSE_BINDING_BIT
Valid Usage (Implicit)
-
sType
must beVK_STRUCTURE_TYPE_IMAGE_CREATE_INFO
-
pNext
must beNULL
-
flags
must be a valid combination ofVkImageCreateFlagBits
values -
imageType
must be a validVkImageType
value -
format
must be a validVkFormat
value -
samples
must be a validVkSampleCountFlagBits
value -
tiling
must be a validVkImageTiling
value -
usage
must be a valid combination ofVkImageUsageFlagBits
values -
usage
must not be0
-
sharingMode
must be a validVkSharingMode
value -
initialLayout
must be a validVkImageLayout
value
图像的目标使用方式由 VkImageCreateInfo
::usage
掩码表示。 可用标志位如下:
typedef enum VkImageUsageFlagBits {
VK_IMAGE_USAGE_TRANSFER_SRC_BIT = 0x00000001,
VK_IMAGE_USAGE_TRANSFER_DST_BIT = 0x00000002,
VK_IMAGE_USAGE_SAMPLED_BIT = 0x00000004,
VK_IMAGE_USAGE_STORAGE_BIT = 0x00000008,
VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT = 0x00000010,
VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT = 0x00000020,
VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT = 0x00000040,
VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT = 0x00000080,
} VkImageUsageFlagBits;
这些bit 有如下的意义:
-
VK_IMAGE_USAGE_TRANSFER_SRC_BIT
表示图像 可以 被用作 转移命令的源。 -
VK_IMAGE_USAGE_TRANSFER_DST_BIT
表示图像 可以 被用作 转移命令的目标。 -
VK_IMAGE_USAGE_SAMPLED_BIT
表示图像 可以 被用于创建 适于占用VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE
或VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER
类型,且可被着色器采样的VkDescriptorSet
槽的VkImageView
。 -
VK_IMAGE_USAGE_STORAGE_BIT
表示 图像可以被用于创建适于占用VK_DESCRIPTOR_TYPE_STORAGE_IMAGE
类型的VkDescriptorSet
槽。 -
VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT
表示 该图像可以 被用于创建VkImageView
,其适于被用作VkFramebuffer
中的 一个颜色 或 resolve 附件。 -
VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT
表示 该图像可以被用于创建VkImageView
, 其适于被用作VkFramebuffer
中的 depth/stencil 附件。 -
VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT
表示 绑定到此图像的内存使用VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT
(参考 内存分配 获取详细内容) 标志位被创建的。 这个bit可以 设置给任何图像,该图像必须可以被用于创建 一个适于用作颜色、resolve、depth/stencil 或 输入附件。 -
VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT
表示 that该图像可以 被用于创建 一个VkImageView
,其适于占用一个VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT
类型的VkDescriptorSet
槽; 可从着色器中作为 输入附件 被读取;且可在缓冲区中被用作一个输入附件。
图像的其他参数可以通过 VkImageCreateInfo
::flags
指定。 可以设置的 Bits 包括:
typedef enum VkImageCreateFlagBits {
VK_IMAGE_CREATE_SPARSE_BINDING_BIT = 0x00000001,
VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT = 0x00000002,
VK_IMAGE_CREATE_SPARSE_ALIASED_BIT = 0x00000004,
VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT = 0x00000008,
VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT = 0x00000010,
} VkImageCreateFlagBits;
这些bit的含义如下:
-
VK_IMAGE_CREATE_SPARSE_BINDING_BIT
表示图像将使用稀疏内存绑定来存储。 -
VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT
表示图像可部分的使用稀疏内存绑定来存储。 使用此flog创建的图像也可以使用VK_IMAGE_CREATE_SPARSE_BINDING_BIT
flag创建。 -
VK_IMAGE_CREATE_SPARSE_ALIASED_BIT
表示 该图像 将使用稀疏内存绑定来存储,内存区间可能同时存储其他图像(或者同一图像的其他部分)。 带有此flag被创建的图像 必须也带有VK_IMAGE_CREATE_SPARSE_BINDING_BIT
标志位。 -
VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT
表示 该图像可以 被用于创建与此图像格式不同的格式的VkImageView
。 -
VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT
表示 该图像可以 被用于创建VK_IMAGE_VIEW_TYPE_CUBE
或VK_IMAGE_VIEW_TYPE_CUBE_ARRAY
类型的VkImageView
。
如果VK_IMAGE_CREATE_SPARSE_BINDING_BIT
, VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT
, 或者 VK_IMAGE_CREATE_SPARSE_ALIASED_BIT
之一被设置过了, VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT
就不能被设置了。
参考 Sparse Resource Features 和 Sparse Physical Device Features 来获取更多细节。
图像的基础维度是通过VkImageCreateInfo
::imageType
指定的,必须是如下值之一:
typedef enum VkImageType {
VK_IMAGE_TYPE_1D = 0,
VK_IMAGE_TYPE_2D = 1,
VK_IMAGE_TYPE_3D = 2,
} VkImageType;
这些值各自指定了一维-,二维-或者三维- 图像。
The tiling arrangement of data elements in an image is specified by VkImageCreateInfo
::tiling
, which 必须 be one of the values
typedef enum VkImageTiling {
VK_IMAGE_TILING_OPTIMAL = 0,
VK_IMAGE_TILING_LINEAR = 1,
} VkImageTiling;
VK_IMAGE_TILING_OPTIMAL
specifies optimal tiling (texels are laid out in an implementation-dependent arrangement, for more optimal memory access), and VK_IMAGE_TILING_LINEAR
specifies linear tiling (texels are laid out in memory in row-major或der, possibly with some padding on each row).
对于以线性tiling 创建的图像,可调用如下命令来查询图像子资源的主机端访问布局:
void vkGetImageSubresourceLayout(
VkDevice device,
VkImage image,
const VkImageSubresource* pSubresource,
VkSubresourceLayout* pLayout);
-
device
是拥有该图像的逻辑设备。 -
image
被查询布局的图像。 -
pSubresource
是一个指向VkImageSubresource
数据结构的指针,为图像子资源选择了指定的图像。 -
pLayout
指向一个VkSubresourceLayout
数据结构,存储被返回的布局。
vkGetImageSubresourceLayout
对于单个图像的生命周期来说是不变的。
Valid Usage
-
image
必须: 是使用tiling
为VK_IMAGE_TILING_LINEAR
的参数创建的。 -
pSubresource
的aspectMask
成员 必须: 只能让其一个bit 被设置。
Valid Usage (Implicit)
-
device
must be a validVkDevice
handle -
image
must be a validVkImage
handle -
pSubresource
must be a pointer to a validVkImageSubresource
structure -
pLayout
must be a pointer to aVkSubresourceLayout
structure -
image
must have been created, allocated, or retrieved fromdevice
VkImageSubresource
数据结构定义如下:
typedef struct VkImageSubresource {
VkImageAspectFlags aspectMask;
uint32_t mipLevel;
uint32_t arrayLayer;
} VkImageSubresource;
-
aspectMask
是一个VkImageAspectFlags
,筛选图像的 aspect。 -
mipLevel
选择了mipmap层级。 -
arrayLayer
选择了array layer。
Valid Usage
-
mipLevel
必须: 小于mipLevels
,由图像被创建时的VkImageCreateInfo
所指定。 -
arrayLayer
必须: 小于arrayLayers
,由图像被创建时的VkImageCreateInfo
所指定。
Valid Usage (Implicit)
-
aspectMask
must be a valid combination ofVkImageAspectFlagBits
values -
aspectMask
must not be0
该图像子资源的布局的信息 被封装在VkSubresourceLayout
数据结构中被返回:
typedef struct VkSubresourceLayout {
VkDeviceSize offset;
VkDeviceSize size;
VkDeviceSize rowPitch;
VkDeviceSize arrayPitch;
VkDeviceSize depthPitch;
} VkSubresourceLayout;
-
offset
是该图像子资源起始的偏移字节数。 -
size
该图像子资源的字节大小。size
包含 要求基于rowPitch
的 任何 额外内存。 -
rowPitch
描述了一个图像内每行纹素的字节数。 -
arrayPitch
描述了一个图像内每个array layer 的字节数。 -
depthPitch
描述了3D图像的每个切分的字节数。
对于线性排列创建的图像,rowPitch
, arrayPitch
和 depthPitch
描述 该图像子资源再线性内存中的布局。 对于未压缩的格式, rowPitch
是相邻行(y坐标相差1)之间相同x坐标的纹素之间的字节数。 arrayPitch
是该图像的相邻array layer 的同x、y坐标纹素之间的字节数。 depthPitch
是3D图像相邻切片(z坐标相差1)内同x、y坐标之间纹素之间的字节数。 通过一个寻址表达式来表示,一个图像子资源的纹素的起始字节 地址为:
// (x,y,z,layer) are in texel coordinates
address(x,y,z,layer) = layer*arrayPitch + z*depthPitch + y*rowPitch + x*elementSize + offset
对于压缩格式,rowPitch
是相邻行的压缩的纹素块的字节数。 arrayPitch
是相邻array layers的压缩纹素块之间的字节数。 depthPitch
是相邻的3D图像的切片的压缩纹素块之间的字节数。
// (x,y,z,layer) are in compressed texel block coordinates
address(x,y,z,layer) = layer*arrayPitch + z*depthPitch + y*rowPitch + x*compressedTexelBlockByteSize + offset;
arrayPitch
is undefined for images that were not created as arrays. depthPitch
is defined only for 3D images.
对于颜色格式, VkImageSubresource
的aspectMask
成员 必须 是 VK_IMAGE_ASPECT_COLOR_BIT
. 对于depth/stencil 格式,aspectMask
必须是 VK_IMAGE_ASPECT_DEPTH_BIT
或 VK_IMAGE_ASPECT_STENCIL_BIT
二者其一。 On implementations that store depth and stencil aspects separately, querying each of these image subresource layouts will return a different offset
and size
representing the region of memory used for that aspect. On implementations that store depth and stencil aspects interleaved, the same offset
and size
are returned and represent the interleaved memory allocation.
可调用如下命令来销毁图像:
void vkDestroyImage(
VkDevice device,
VkImage image,
const VkAllocationCallbacks* pAllocator);
-
device
是拥有需被销毁图像的逻辑设备。 -
image
是需被销毁的图像。 -
pAllocator
控制CPU端内存分配,如 内存分配 一章详述。
Valid Usage
-
所有直接或 通过一个
VkImageView
引用image
的已提交的命令,必须已经完成执行。 -
若创建图像时 提供了
VkAllocationCallbacks
,那么在此处必须提供兼容的回调。 -
若创建图像时没有提供
VkAllocationCallbacks
,那么pAllocator
必须为NULL
Valid Usage (Implicit)
-
device
must be a validVkDevice
handle -
If
image
is notVK_NULL_HANDLE
,image
must be a validVkImage
handle -
If
pAllocator
is notNULL
,pAllocator
must be a pointer to a validVkAllocationCallbacks
structure -
If
image
is a valid handle, it must have been created, allocated, or retrieved fromdevice
Host Synchronization
-
Host access to
image
must be externally synchronized