如何处理可呈现图像的布局?

rat*_*eak 5 framebuffer vulkan

一个可呈现的图像开始于VK_IMAGE_LAYOUT_UNDEFINEDVK_IMAGE_LAYOUT_PRESENT_SRC_KHR在它们被呈现一次之后。

很多例子做的过渡vkImages,以VK_IMAGE_LAYOUT_PRESENT_SRC_KHR立即创建后vkSwapchain。这允许他们使用VK_IMAGE_LAYOUT_PRESENT_SRC_KHRfor oldLayout但是不允许在创建交换链后立即进行转换。

可呈现图像的使用必须仅在图像由 返回之后vkAcquireNextImageKHR和由 呈现之前发生vkQueuePresentKHR这包括转换图像布局和渲染命令。

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

rat*_*eak 5

有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. 在创建交换链后进行转换,但使用vkAcquireNextImageKHRvkQueuePresentKHR确保应用程序在转换时拥有图像。无法保证您获得图像的顺序因此有可能永远不会返回一张图像。

  • 在出现之后阅读这些图像几乎没有理由(也很危险),因此 1. 在 95% 的情况下。 (2认同)