从 VkImageCreateInfo 计算 VkImageAspectFlagsBits?

问题描述

在 Vulkan 规范的附录 H 中,它说:

方面(图像):

一幅图像可能包含每个像素的多种或多个方面的数据,其中每个方面都是 管道以特定方式使用,并且可能与其他存储方式不同或分开存储 方面。例如,图像格式的颜色成分构成了图像的颜色方面。 图像,并可用作帧缓冲区颜色附件。一些操作,比如深度测试, 仅对图像的特定方面进行操作。其他操作,如图像/缓冲区副本,仅 一次只对一个方面进行操作。

此外还有 VkImageAspectFlagBits 类型,它(我认为)列出了图像可能具有的 7 个方面:

VK_IMAGE_ASPECT_COLOR_BIT
VK_IMAGE_ASPECT_DEPTH_BIT
VK_IMAGE_ASPECT_STENCIL_BIT
VK_IMAGE_ASPECT_MetaDATA_BIT
VK_IMAGE_ASPECT_PLANE_0_BIT
VK_IMAGE_ASPECT_PLANE_1_BIT
VK_IMAGE_ASPECT_PLANE_2_BIT

VkImageCreateInfo 没有方面字段。

如果我理解正确,给定的 VkImage 包含这 7 个方面的一个子集,对吗?

有没有办法从 VkImage 的 VkImageCreateInfo 推断出 7 个方面中的哪一个

即,您将如何编写一个函数来返回图像具有哪些方面的位掩码?

VkImageAspectFlagsBits GetimageAspects(const VkImageCreateInfo& info) { ??? }

解决方法

您主要可以从图像的格式中推导出图像的哪些方面:

  • VK_IMAGE_ASPECT_COLOR_BIT 指格式中可用的所有 R、G、B 和/或 A 组件。
  • VK_IMAGE_ASPECT_DEPTH_BIT 指的是 D 组件。
  • VK_IMAGE_ASPECT_STENCIL_BIT 指的是 S 组件。
  • VK_IMAGE_ASPECT_PLANE_n_BIT 指的是多平面格式的平面,即名称中带有 2PLANE3PLANE 的平面。这些方面主要用于复制命令,但也可用于创建单个平面而不是整个图像的 VkImageView
  • VK_IMAGE_ASPECT_METADATA_BIT 是奇怪的,其存在不是基于格式。相反,具有稀疏驻留 (VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT) 的图像具有元数据方面。

如果图像没有与方面对应的组件或标志,则它不具有该方面。