可呈现的图片从VK_IMAGE_LAYOUT_UNDEFINED
开始,但在呈现一次后将为VK_IMAGE_LAYOUT_PRESENT_SRC_KHR
。
很多示例在创建vkImages
后立即将所有VK_IMAGE_LAYOUT_PRESENT_SRC_KHR
转换为vkSwapchain
。这允许他们使用VK_IMAGE_LAYOUT_PRESENT_SRC_KHR
作为oldLayout
。 But doing the transition right after creation of the swapchain is not allowed.
只有在
vkAcquireNextImageKHR
返回图像之后,vkQueuePresentKHR
呈现图像之前,才能使用可呈现图像。 这包括转换图像布局和渲染命令。
我有什么选择正确处理交换链图像布局?
答案 0 :(得分:4)
有3种选择。从最好到最差(IMO)订购:
只需将renderPass中附件的initialLayout设置为VK_IMAGE_LAYOUT_UNDEFINED
或每次都从VK_IMAGE_LAYOUT_UNDEFINED
过渡。 This is allowed并且暗示您不关心图像中仍然存在的数据。大多数情况下,无论如何,你都会清除或完全覆盖图像。
有效用法 [VkImageMemoryBarrier] [ [...]
- oldLayout必须为
VK_IMAGE_LAYOUT_UNDEFINED
,VK_IMAGE_LAYOUT_PREINITIALIZED
或受屏障影响的图像区域的当前布局
跟踪已经通过管道的图像,并在录制commandBuffer时相应地选择oldLayout
。
创建交换链后进行转换,但使用vkAcquireNextImageKHR
和vkQueuePresentKHR
确保应用程序在转换时拥有图像。无法保证您获得图像的顺序因此可能无法返回一张图像。
答案 1 :(得分:1)
我一直在尝试第四种选择,但对其有效性的一些输入会很有用。在创建交换链时,图像位于VK_IMAGE_LAYOUT_UNDEFINED
,这对我来说似乎表明他们可以全部用于应用程序,因为他们需要VK_IMAGE_LAYOUT_PRESENT_SRC_KHR
进行演示,所以不应该显示或在队列中。我没有在规范中找到任何可以保证这一点的内容。
规范说我们可以根据需要从交换链中获取多个图像:
如果交换链具有足够的可呈现图像,则应用程序可以获取多个图像而无需干预vkQueuePresentKHR。应用程序可以按照与获取图像不同的顺序显示图像。
使用上面的结论我刚调用vkAcquireNextImageKHR
来获取交换链的每个图像,并立即更改所有这些图像的布局。之后,我提出了所有这些内容,以便让他们进入系统。
似乎工作的意思是所有图像都是由交换链传递给我的,但是再一次,我发现并不能保证在创建交换链之后可以立即获取所有图像。