Vulkan 创建图像视图

Vulkan 创建图像视图,我们将了解图形资源创建所需的所有Vulkan API函数。我们还会深入了解数据图像、图像视图,以及图像布局的相关概念。

创建图像

Vulkan中的图像资源是通过VkImage对象来表示的。这个对象可以支持多维图像数据的表示,最大为三维数据数组。图像的创建是通过vkCreateImage()函数完成的,它的语法如下所示:

Vulkan 创建图像视图

函数参数的相关说明如表所示:
Vulkan 创建图像视图
vkCreateImage()需要VkImageCreateInfo作为输入的第二个参数,这个结构体的详细定义如下所示:

Vulkan 创建图像视图

VkImageCreateInfo结构体中所有成员参数的说明如表所示:

Vulkan 创建图像视图
图像控制结构体VkImageCreateInfo中的参数usage必须是枚举量VkImageUsage-FlagBits的组合。以下给出这个枚举量类型的语法定义,并做解释:

Vulkan 创建图像视图

这些按位与的标识量的具体意义如表所示:
Vulkan 创建图像视图

我们使用VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT枚举量分配的内存大小一开始和需要的内存大小是不一样的,但是随着程序的逐步执行,内存空间也逐渐增长到指定值。

参数flag保存在VkImageCreateInfo结构体当中,它可以用来告知应用程序图像资源是如何进行管理的,例如内存、格式,以及属性,它的枚举类型是VkImageCreateFlagBits。以下给出了可用参数的具体语法:

Vulkan 创建图像视图
这些枚举量的具体定义如表所示:
Vulkan 创建图像视图

销毁图像对象
如果我们不需要再使用图像对象了,那么可以直接使用vkDestroyimage()销毁这个对象。它的语法如下:
Vulkan 创建图像视图

这个函数可以使用三个参数,它们的定义如表所示:
Vulkan 创建图像视图

理解图像的布局

我们现在了解一下Vulkan标准中已经支持的多种图像布局方式。它们是通过VkImageLayout枚举量来定义的,可用的数值如下所示。

  • VK_IMAGE_LAYOUT_UNDEFINED:这个布局不支持设备访问。它最适合用来设置图像变化时的intialLayout或者oldLayout参数。这个布局改变的时候不会保存任何已有的数据。
  • VK_IMAGE_LAYOUT_GENERAL:这个布局可以支持所有形式的设备访问。
  • VK_IMAGE_LAYOUT_PREINITIALIZED:这个布局同样不支持设备访问,最适合用来设置intialLayout或者oldLayout参数。但是图像变化的时候原有的内容数据是可以保存下来的。如果我们在初始化阶段需要保证数据稳定可用,这个布局方式是最合适的。此时数据可以直接立即保存到设备内存中,不需要额外执行布局变换的操作。
  • VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL:这个布局非常适合保存色彩图像。它事实上只能用于VkFrameBuffer的颜色附件和已解析的附件。如果要使用这个布局方式的话,图像本身的usage参数必须设置为VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT。
    图像的子资源不能独立设置usage枚举参数,我们只能针对完整图像进行设置。
  • VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL:这个布局只能用来设置VkFrameBuffer的深度/模板附件。如果要使用这个布局,图像本身的usage参数必须设置为VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT。
  • VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL:这个布局方式和VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL很类似,但是它只能用于只读形式的VkFrameBuffer附件或者着色器中的只读图像,此时图像必须是纹理采样器、合并图像/采样器,或者输入附件的形式。图像创建时必须设置为VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT。
  • VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL:这个布局方式必须用于只读属性的图像,例如,纹理采样器,合并图像/采样器,或者输入附件。图像的子资源创建时必须设置为VK_IMAGE_USAGE_SAMPLED_BIT或者VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT。
  • VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL:这个布局必须作为传输流水线中传输指令的源图像的属性,并且只有图像的子资源设置为VK_IMAGE_USAGE_TRANSFER_SRC_BIT时才有效。
  • VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL:这个布局必须作为传输流水线中传输指令的目标图像的属性,并且只有图像的子资源设置为VK_IMAGE_USAGE_TRANSFER_DST_BIT时才有效。

创建图像视图

我们可以使用vkCreateImageView()创建一个图像视图。以下给出这个函数的语法:
Vulkan 创建图像视图

这个函数的参数描述如表所示:
Vulkan 创建图像视图

这里的VkCreateImageViewinfo结构体包含了和视图有关的属性,可以传递给vkCreateImageView()函数用来创建图像视图。以下给出了这个结构体的语法:
Vulkan 创建图像视图

VkImageViewCreateInfo的各个参数域的说明如表所示:
Vulkan 创建图像视图

销毁图像视图
图像视图的销毁过程是通过函数vkCreateImageView()完成的。这个函数需要三个输入参数,第一个参数device设置了负责销毁图像视图对象的逻辑设备,而图像视图对象本身(imageView)记录在第二个参数里。第三个参数pAllocator设置了宿主机内存分配的过程。函数的具体语法如下所示:
Vulkan 创建图像视图

酷客网相关文章:

赞(0)

评论 抢沙发

评论前必须登录!