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

ano*_*000 4 vulkan

我正在关注 vulkan-tutorial.com,在教程的图像部分中它提到了布局转换,但没有详细说明它们是什么。我不喜欢在不确切知道代码的作用的情况下复制和粘贴代码,而且我在教程或谷歌上找不到足够的解释。

Nic*_*las 9

“布局转换”正是这些词的含义。当您将图像子资源的布局从一种布局转换为另一种布局时。所以你的问题似乎是......什么是布局?

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

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

重要的部分是:布局限制了如何使用图像子资源。或者更重要的是,为了以特定方式使用图像子资源,它必须处于允许该使用的布局中。

当子资源位于VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL布局中时,您只能执行从着色器内的子资源读取的操作。着色器无法写入图像,也无法将图像用作渲染目标。

现在,总体布局几乎允许在该布局内随时使用。然而,这也可能代表性能不太理想。任何更受限制的布局都可以使对图像的访问更加性能友好(取决于硬件)。

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

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