Vulkan Cookbook 第四章 10 使用立方体图像视图创建分层2D图像

使用立方体图像(CUBEMAP)视图创建分层2D图像

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

怎么做...

在3D应用程序或游戏中使用图像的一个非常常见的例子是CUBEMAP,用于模拟反映其环境的对象。但我们不创建一个立方体图像,我们需要创建一个分层图像,并通过图像视图告诉硬件它必须将其图层解释为6个CUBEMAP面。

1.获取逻辑设备句柄。并将其储存在名为logical_device的VkDevice类型变量中。
2.选择一个图像的大小,记住它必须是正方形的。将图像的维度保存在名为size的uint32_t类型变量中。
3.选择图像的mipmap级别的数量,使用所选数字初始化名为num_mipmaps的uint32_t类型变量。
4.考虑将使用图像的所有不同场景。将所有这些用法的逻辑或(or)储存在名为usage的VkImageUsageFlags类型变量中。
5.创建VK_IMAGE_TYPE_2D类型的图像。VK_FORMAT_R8G8B8A8_UNORM格式。六个图层、每个纹素一个样本、对其余图像的参数使用logical_device、size、num_mipmaps和usage变量。将创建的图像的句柄储存在名为image的VkImage类型变量中(请参阅创建图像内容)。
6.获取从中获取logical_device句柄的物理设备句柄。将其储存在名为physical_device的VkPhysicalDevice类型的变量中。
7.获取physical_device的内存属性。使用具有VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT属性的内存类型分配内存对象。将分配的内存对象的句柄存储在名为memory_object的VkDeviceMemory类型变量中,并将其绑定到图像(请参阅分配内存对象和将其绑定到图像)。
8.选择颜色方面并将其存储在名为aspect的VkImageAspectFlags类型变量中。
9.创建VK_IMAGE_VIEW_TYPE_CUBE类型和VK_FORMAT_R8G8B8A8_UNORM格式的图像视图。在创建图像视图期间使用logical_device、image和aspect变量。将创建的句柄存储在名为image_view的VkImageView类型变量中(请参阅创建图像视图内容)。

这个怎么运作...

创建CUBEMAP的过程与创建其他类型的图像非常相似。首先我们创建图像本身。只需要记住图像应该至少有六层,可以解释为CUBEMAP的六个面。对于CUBEMAP我们也不能为每个纹素使用多个样本:

if( !CreateImage( logical_device, VK_IMAGE_TYPE_2D, VK_FORMAT_R8G8B8A8_UNORM, { size, size, 1 }, num_mipmaps, 6, VK_SAMPLE_COUNT_1_BIT, usage, true, image ) ) {
  return false;
}

接下来,我们以与其他资源相同的方式分配和绑定内存对象:

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

最后,我们需要创建一个图像视图。通过它指定一个CUBEMAP视图类型:

if( !CreateImageView( logical_device, image, VK_IMAGE_VIEW_TYPE_CUBE, VK_FORMAT_R8G8B8A8_UNORM, aspect, image_view ) ) {
  return false;
}

提示:使用CUBEMAP图像视图时,图像层对应+ X, -  X,+ Y,-Y,+ Z和-Z顺序的面。

猜你喜欢

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