Overview
VkImage
用于存储图像数据,支持 2D
,3D
图像以及Multi Layer
,Multi MipLevel
的图像,它可以用于纹理,渲染目标等
VkImage
比 vkBuffer
更加复杂,因为它们是多维的,有独特的布局和格式信息,可以作为过滤,深度或者模板测试等复杂操作的源或者目标,和VkBuffer
一样,一旦设备内存绑定到一个VkImage
上,这个内存绑定就不能再次改变了
VkImage Create
VkImage
的创建和VkBuffer
类似,首先要确定图像的格式,用途,采样数等属性,然后通过 Vulkan 的内存分配机制来分配对应的内存
一般的创建过程如下:
- 选择图像的格式和属性:根据应用需求选择合适的图像格式和维度
- 创建图像:使用
vkCreateImage
函数创建一个VkImage
对象 - 查询内促要求:使用
vkGetImageMemoryRequirements
查询VkImage
的内存需求 - 分配内存: 根据查询到的内存要求,使用
vkAllocateMemory
分配内存 - 绑定内存: 使用
vkBindImageMemory
将分配到的内存绑定到VkImage
对象
其中的 vkCreateImage
的函数原型:
VKAPI_ATTR VkResult VKAPI_CALL vkCreateImage(
VkDevice device, // 逻辑设备
const VkImageCreateInfo* pCreateInfo, // createInfo
const VkAllocationCallbacks* pAllocator, // 内存分配器
VkImage* pImage); // Image 对象
其中的 VkImageCreateInfo
定义如下:
typedef struct VkImageCreateInfo {
VkStructureType sType; // 必须是 VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO,表示该结构体的类型
const void* pNext; // nullptr 或指向扩展结构体的指针,用于扩展
VkImageCreateFlags flags; // 用于拓展,一般为 nullptr
VkImageType imageType; // 一维 二维 还是三维的 类型
VkFormat format; // 颜色格式 比如:VK_FORMAT_R8G8B8A8_SRGB
VkExtent3D extent; // 图像的宽度、高度和深度,使用 VkExtent3D 结构体指定
uint32_t mipLevels; // mipmap 的层数,指定生产的 mipmap 级别数量
uint32_t arrayLayers; // 指定图像数组的层数
VkSampleCountFlagBits samples; // 采样计数,指定 MSAA 的级别
VkImageTiling tiling; // 图像的 tiling 模式,比如:VK_IMAGE_TILING_OPTIMAL 和 VK_IMAGE_TILING_LINEAR
VkImageUsageFlags usage; // 图像的用途标志
VkSharingMode sharingMode; // 共享模式和独占模式
uint32_t queueFamilyIndexCount; // queueFamily Index 的 count
const uint32_t* pQueueFamilyIndices; // queueFamily Index
VkImageLayout initialLayout; // 图像的初始布局
} VkImageCreateInfo;
其中 VkImageType ImageType
设置图像是几维的,可以选择为:
typedef enum VkImageType {
VK_IMAGE_TYPE_1D = 0,
VK_IMAGE_TYPE_2D = 1</