什么是图形编程中的布局转换

What are layout transitions in graphics programming

我正在关注 vulkan-tutorial.com,在教程的图像部分,它提到了布局转换,但没有详细说明它们是什么。我不喜欢在不确切了解代码功能的情况下复制和粘贴代码,而且我在教程或 google.

上找不到足够的解释

布局转换正是这些词的意思。当您将图像 sub-resource 的布局从一种布局转换为另一种布局时。所以你的问题似乎真的是......什么是布局?

在 Vulkan 抽象中,图像由 sub-resource 组成。这些代表图像的不同部分,可以独立于其他部分进行操作。例如,一个 mipmap 图像的每个 mipmap 级别是 sub-resource.

在任何特定时间,GPU 进程正在使用图像 sub-resource,sub-resource 具有布局。这是 GPU 操作的 Vulkan 抽象的一部分,因此它对 GPU 的确切含义因芯片而异。

重要的是:布局限制了您使用图像的方式 sub-resource。或者更重要的是,为了以特定方式使用图像 sub-resource,它必须处于 允许 使用的布局中。

当 sub-resource 在 VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL 布局中时,您只能在着色器中执行从 sub-resource 读取的操作。着色器无法写入图像,也无法将图像用作渲染目标。

现在,总体布局几乎可以用于任何用途。然而,这也可能代表不太理想的性能。任何更受限制的布局都可以使对图像的访问更多 performance-friendly(取决于硬件)。

因此,您的工作是跟踪您计划使用的任何图像的布局 sub-resource。现在对于大多数图像,您将使用目标传输布局上传到它们,然后将它们保留为着色器 read-only,因为您通常不会更随意地使用大多数图像。所以一般来说,这意味着跟踪你想要读取的渲染目标,以及交换链图像(你必须在呈现它们之前将它们转换到当前布局)。

布局转换通常作为两个操作之间显式依赖关系的一部分发生。这是有道理的;如果您要将数据上传到图像,稍后想从中读取数据,则需要在上传和读取之间建立依赖关系。那么你也可以做布局转换,因为转换可以修改图像字节的存储方式,所以你需要先完成传输。