为什么 Vulkan 中没有 3D 阵列图像?

Zeb*_*ish 1 vulkan

在 Vulkan API 中,包含 VK_IMAGE_VIEW_TYPE_CUBE_ARRAY 被认为是有价值的,但包含 3D 数组则不然:

typedef enum VkImageViewType {
    VK_IMAGE_VIEW_TYPE_1D = 0,
    VK_IMAGE_VIEW_TYPE_2D = 1,
    VK_IMAGE_VIEW_TYPE_3D = 2,
    VK_IMAGE_VIEW_TYPE_CUBE = 3,
    VK_IMAGE_VIEW_TYPE_1D_ARRAY = 4,
    VK_IMAGE_VIEW_TYPE_2D_ARRAY = 5,
    VK_IMAGE_VIEW_TYPE_CUBE_ARRAY = 6,
} VkImageViewType;
Run Code Online (Sandbox Code Playgroud)

立方体阵列的每 6 层视图都是另一个立方体。我实际上正在努力思考立方体数组的用例,而且我真的不认为它对 3D 数组有用,但是为什么立方体获得数组类型而不是 3D 图像。这个立方体阵列应该如何使用?有立方体阵列采样器吗?

Nic*_*las 5

就存储的位和字节而言,立方体贴图、立方体贴图数组和 2D 数组纹理最终是相同的东西。所有这些视图都是根据同一种图像创建的。您必须指定是否需要分层 2D 图像可用作数组或立方体贴图(或两者),但从概念上讲,它们都是同一件事。

每个 mipmap 级别由大小为 WxH 的 L 个图像组成,其中 W 和 H 根据原始大小和当前 mipmap 级别缩小。L 是图像创建时指定的层数,它随 mipmap 级别而变化。简而言之,每个 mipmap 级别都有固定数量的 2D 图像。立方体贴图和立方体贴图数组要求 L 分别为 6 或 6 的倍数,但它仍然是常数。

3D 图像并非如此。每个 mipmap 级别由尺寸为 WxHxD 的单个图像组成,其中 W、H 和 D 根据原始大小和当前 mipmap 级别缩小。即使您将 3D 图像的 mipmap 级别视为 D 个宽x高图像,数字 D 在 mipmap 级别之间也不是恒定的。

这些不是同一件事。

要获得 3D 阵列图像,您需要让每个 mipmap 级别包含大小为 WxHxD 的 L 个 3D 图像,其中 L 对于每个 mipmap 级别都相同。


至于立方体贴图数组的效用,与单个 2D 图像相比,它与从 2D 数组中获得的效用相同。当您需要指定要采样的多个图像之一时,可以使用数组纹理。只是在一种情况下,每个图像都是单个 2D 图像,而在另一种情况下,每个图像都是立方体贴图。

对于更具体的示例,许多高级形式的阴影贴图需要使用在运行时选择的多个阴影贴图。这是数组纹理的一个很好的用例。您可以通过使用立方体贴图将这些技术应用于点光源,但现在您需要使阵列中的各个图像成为立方体贴图,而不仅仅是单个 2D 图像。