6

一个像样的图像开始于VK_IMAGE_LAYOUT_UNDEFINED但将VK_IMAGE_LAYOUT_PRESENT_SRC_KHR在它们被呈现一次之后。

许多示例vkImagesVK_IMAGE_LAYOUT_PRESENT_SRC_KHR创建vkSwapchain. 这允许他们使用VK_IMAGE_LAYOUT_PRESENT_SRC_KHRfor oldLayout但是不允许在创建交换链后立即进行转换。

只有在图像返回之后vkAcquireNextImageKHR,并且在图像被呈现之前,才能使用可呈现的图像vkQueuePresentKHR这包括转换图像布局和渲染命令。

我有哪些选择可以正确处理交换链图像布局?

4

2 回答 2

6

有 3 个选项。从最好到最差(IMO)排序:

  1. 只需将renderPass中附件的initialLayout设置为VK_IMAGE_LAYOUT_UNDEFINEDVK_IMAGE_LAYOUT_UNDEFINED每次转换。这是允许的,这意味着您不关心图像中的数据。大多数情况下,无论如何您都会清除或完全覆盖图像。

    [VkImageMemoryBarrier] 的有效用法
    [...]

    • oldLayout 必须是VK_IMAGE_LAYOUT_UNDEFINEDVK_IMAGE_LAYOUT_PREINITIALIZED否则受屏障影响的图像区域的当前布局
  2. 跟踪哪些图像已经通过管道,并oldLayout在记录 commandBuffer 时相应地选择。

  3. 在创建交换链后执行转换,但使用vkAcquireNextImageKHRandvkQueuePresentKHR以确保应用程序在转换时拥有图像。无法保证您获取图像的顺序因此可能永远不会返回一张图像。

于 2016-05-30T11:01:22.047 回答
1

我一直在尝试第四个选项,但对其有效性的一些输入会很有用。创建交换链时,图像位于 中VK_IMAGE_LAYOUT_UNDEFINED,对我来说,这似乎表明它们都可供应用程序使用,因为它们需要VK_IMAGE_LAYOUT_PRESENT_SRC_KHR演示,因此不应显示或排队。但是,我在规范中没有找到任何可以保证这一点的东西。

规范说,如果我们愿意,我们可以从交换链获取多个图像:

如果交换链有足够的可展示图像,应用程序可以获取多个图像而无需干预 vkQueuePresentKHR。应用程序可以按照与获取图像的顺序不同的顺序呈现图像。

使用上面的结论,我只是调用vkAcquireNextImageKHR来获取交换链的每个图像并立即更改所有图像的布局。在那之后,我展示了所有这些,可以说让它们进入系统。

从某种意义上说,所有图像都由交换链交给我,这似乎是可行的,但话又说回来,我发现不能保证在创建交换链后可以立即获取所有图像。

于 2016-06-21T15:18:10.817 回答