Vulkan 什么是图像资源

Vulkan 什么是图像资源,Vulkan的资源简单来说就是一块保存了数据的内存区域的视图。Vulkan主要支持两种类型的资源:缓存和图像。图像是交换链实现的必要条件。

Vulkan的图像通常被表示为连续的纹理数据,包括1D/2D/3D的形式。这些图像主要被作为附件或者纹理使用。

  • 附件attachment):图像被关联到流水线上,作为帧缓存的颜色或者深度附件使用,这样我们可以将它作为一个辅助表面来实现多通道的处理。
  • 纹理texture):图像作为描述符接口使用,在着色器阶段(片元着色器)作为采样器的形式使用。

如果读者有OpenGL的开发经验,那么你可能会注意到Vulkan中的图像用法与OpenGL的用法是完全不同的。在Vulkan中,创建一幅图像需要设置一组按位定义的参数来设置图像的用途类型,例如作为颜色附件、作为深度/模板附件、作为采样器图像(在着色器中)、图像加载/存储,等等。另外,你还需要设置图像的重复贴图模式(线性或者优化形式)。此外也需要设置图像在内存中重复或者swizzle的布局方式。

Vulkan中的纹理的概念可以主要划分为图像、图像布局、图像视图

  • 图像image):图像在Vulkan中用来表示纹理对象。它包括了一些元数据信息,可以用来计算内存分配的需求。内存需求信息对于内存分配的过程是非常有用的。一幅图像还包含了其他更多的信息,例如格式、大小,以及类型(稀疏映射、立方体映射,等等)。一幅图像可能包含一些子资源,例如基于mipmap层级或者纹理数组层级的多图像。每幅图像,或者图像子资源,都需要设置一个对应的图像布局。
  • 图像布局image layout):图像布局是一种存储图像纹理信息的特定实现方式,它可以将图像采用网格坐标的表示方式保存在内存当中。保存在内存中的图像内容与具体的实现平台相关。每幅图像都有特定的用途,例如,颜色附件、着色器中的采样器图像加载/存储,或者用于超大图像的稀疏纹理。对于这些特定的用途,实现平台需要提供对应的纹理布局,确保图像在内存中的排列方式总是符合最优化的性能要求。
    每一种图像布局都是特殊的。每种布局都有自己独特的特性。例如,如果某幅图像的图像布局被设置为VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,那么它可以作为颜色图像附件使用,并且性能也会得到优化。但是,它将无法用于传输。

  • 图像视图image view):图像本身不能直接被API或者流水线着色器调用并用于读取或者写入。相反,我们需要用到图像视图。它并不仅仅是图像对象的一个外部接口,而是提供了对应的元数据来记录一段连续的图像子资源。

图像创建过程概述

下面我们将提供一个按步骤执行的图像创建过程的快速教程。它可以帮助读者迅速对图像、图像视图,以及对应的内存分配过程有一个总体的认识。后续6.2节和6.3节将会分别讲解图像以及内存分配相关的知识,并且深入讲解相应的API函数。

下面我们将介绍如何使用Vulkan API一步一步地新建一幅图像资源。

1)首先,创建图像对象:

  • 使用函数vkCreateImage()创建一个图像对象(VkImage)。这个函数需要接收一个VkImageCreateInfo结构体作为输入参数,用来设置一些重要的图像特性参数,以创建一个或者多个图像对象。在这里,图像对象还没有真正在设备端进行物理内存的分配,但是它已经具备了逻辑内存信息,可以在下一步当中用来分配内存。这些内存信息来自于VkImageCreateInfo对象,其中包括格式、大小、创建标识量等内容。

2)然后,分配图像内存:

  • 获取内存需求:在分配图像所需的内存区块之前,我们需要计算自己需要分配的合理内存大小。这个过程可以通过API函数vkGetimageMemoryRequirements()实现。它会根据图像的属性自动计算出合适的尺寸参数。它需要用到VkCreateImageinfo对象,即前一个步骤执行得到的结果。
  • 确定内存类型:下一步,我们从可用的内存类型当中选择正确的内存类型。这个内存类型需要尽量满足用户设置的所有属性要求。
  • 分配设备内存:通过函数vkAllocateMemory()分配设备内存(VkDeviceMemory)。
  • 绑定分配后的内存:将分配得到的设备内存(VkDeviceMemory)通过函数vkBindimageMemory()绑定给图像对象(VkImage)。

3)设置图像布局格式:

  • 根据应用程序的需求设置正确的图像布局,这一步需要用到流水线图像内存的同步屏障功能,即函数vkCmdPipelineBarrier()。

4)创建图像视图:

  • 图像只能通过图像视图来访问。通过vkCreateImageView()函数创建图像视图也是整个流程的最后一步。然后我们可以通过API函数或者流水线着色器来使用图像对象。

整个过程如图所示:

Vulkan 什么是图像资源

酷客网相关文章:

赞(0)

评论 抢沙发

评论前必须登录!