Vulkan Cookbook 第四章 9 创建2D图像和视图

创建2D图像和视图

译者注:示例代码点击此处

在许多流行的应用程序或游戏中使用的最常见图像类型是具有RGBA四个组建和每个纹素32位的典型2D纹理。要在Vulkan中创建这样的资源,我们需要创建一个2D图像和一个适合的图像视图。

怎么做...

1.获取逻辑设备句柄并使用它来初始化名为logical_device的VkDevice类型变量。
2.选择图像中使用的数据格式,并使用所选值初始化名为format的VkFormat类型变量。
3.选择图像的大小。将其存储在名为size的VkExtent2D类型的变量中。
4.选择应构成图像的mipmap级别数量,初始化名为num_mipmaps的uint32_t类型变量。
5.使用名为num_layers的uint32_t类型变量指定图像层数量。
6.选择纹素样本的数量并将其存储在名为samples的VkSampleCountFlagBits类型变量中。
7.想一想图像将在应用程序中使用的所有目的。将所有这些用法的逻辑和(or)值存储在名为usage的VkImageUsageFlags类型变量中。
8.使用logical_device、format、size、num_mipmaps、num_layers、samples和usage变量创建VK_IMAGE_TYPE_2D类型的映像。将创建的图像句柄存储在名为image的VkImage类型变量中(请参阅创建图像内容)。
9.获取从中获取logical_device句柄的物理设备句柄。将物理设备句柄存储在名为physical_device的VkPhysicalDevice类型变量中。
10.获取physical_device的内存属性并使用它们来分配将绑定到image变量的图像内存对象。确保使用具有VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT属性的内存类型。将分配的内存对象储存在名为memory_object的VkDeviceMemory类型变量中(请参阅分配内存对象和将其绑定到图像)。
11.选择用于图像视图创建的图像方面(颜色或深度和/或模板)并将其存储在名为aspect的VkImageAspectFlags类型变量中。
12.创建VK_IMAGE_VIEW_TYPE_2D类型的图像视图。在创建图像视图期间使用logical_device,image,format和aspect变脸。将创建的句柄存储在名为image_view的VkImageView类型变量中(请参阅创建图像视图内容)。

这个怎么运作...

图像创建要求我们执行三个一般步骤:
    1.创建一个图像。
    2.创建一个内存对象(或使用现有对象)并将其绑定到图像。
    3.创建图像视图。

对于通常用作纹理的图像,我们需要创建VK_IMAGE_TYPE_2D类型的图像格式VK_FORMAT_R8G8B8A8_UNORM,但我们可以根据需求设置这些参数。图像的其余部分取决于图像的大小(换句话说,我们是从现有图像文件创建纹理,需要匹配图像文件的尺寸),应该应用于图像的过滤类型(如果我们想要使用mipmapping),样本数量(如果应该进行多重采样),以及所需的使用场景。

图像创建可以简化为以下代码:

if( !CreateImage( logical_device, type, format, { size.width, size.height, 1 }, 1, 1, VK_SAMPLE_COUNT_1_BIT, usage | VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT, false, input_attachment ) ) {
      return false;
}

接下来,我们需要分配内存对象并将其绑定到图像,如分配内存对象和将其绑定到图像内容中所述。为了获得最佳性能,应该在快速的设备本地内存上分配内存对象,如下所示。

if( !AllocateAndBindMemoryObjectToImage( physical_device, logical_device, input_attachment, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, memory_object ) ) {
      return false;
}

我们当然可以使用现有的内存对象,如果它满足图像的内存要求并且有足够的储存空间。

之后,必须创建一个图像视图。有了它我们可以告诉硬件如何解释图像数据。还可以为视图使用不同(但仍然兼容)的格式。但是对于许多(如果不是大多数)目的没有这个必要,我们将指定与图像相同的格式。对于标准2D纹理,我们还使用颜色方面来创建视图,但对于具有深度数据的图像(换句话说,对于用作深度附件的图像)必须指定深度方面。有关图像视图创建的更多详细信息,请按照创建图像的内容:

if( !CreateImageView( logical_device, image, VK_IMAGE_VIEW_TYPE_2D, format, aspect, image_view ) ) { 
  return false; 
}

现在,图像已准备好在我们的应用程序中使用。我们可以将数据从文件上传到图像,并将其用作着色器内的纹理(在这种情况下,我们还需要一个采样器和描述符集)。还可以将图像的视图绑定到帧缓冲区,并将其用作颜色附件(渲染目标)。

猜你喜欢

转载自blog.csdn.net/qq_19473837/article/details/84934533