从 VkImageCreateInfo 计算 VkImageAspectFlagsBits?

Calculating VkImageAspectFlagsBits from VkImageCreateInfo?

在 Vulkan 规范的附录 H 中说:

Aspect (Image):

An image may contain multiple kinds, or aspects, of data for each pixel, where each aspect is used in a particular way by the pipeline and may be stored differently or separately from other aspects. For example, the color components of an image format make up the color aspect of the image, and may be used as a framebuffer color attachment. Some operations, like depth testing, operate only on specific aspects of an image. Others operations, like image/buffer copies, only operate on one aspect at a time.

此外,还有一种类型 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 中推断出 VkImage 具有 7 个方面中的哪一个?

也就是说,您将如何编写一个 returns 图像具有哪些方面的位掩码的函数?

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

您基本上可以从图像的格式中得出图像的哪些方面:

  • VK_IMAGE_ASPECT_COLOR_BIT指格式中所有可用的R,G,B,and/orA成分。
  • 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) 的图像具有元数据方面。

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