Vulkan Cookbook 第二章 15 获取交换链图像

获取交换链图像

译者注:示例代码点击此处

在我们使用交换链图像之前,我们需要向表示引擎询问它。 该过程称为图像采集。 它将表示从vkGetSwapchainImagesKHR()函数获取的图像数组中的图像索引,如获取交换链图像的句柄中所述。

做好准备

要在Vulkan中获取图像,我们需要指定尚未说明的两种类型中的一种,这些是信号量和围栏。
信号量用于同步设备队列。这意味着当我们提交命令进行处理时,这些命令可能需要完成另一个工作。在这种情况下,我们可以指定这些命令在执行之前应该等待其他命令。这就是信号量的用途。它们用于内部队列同步,但是我们不能使用它们用作应用程序与提交的命令同步。(请参阅第三章命令缓冲区和同步创建信号量)。

怎么做...

1.获取已经创建的逻辑设备句柄,并将其储存在名为logical_device的VkDevice变量。
2.储备交换链对象的句柄并将其分配给名为swapchain的VkSwapchainKHR变量。
3.准备一个名为semaphore的VkSemaphore类型信号量变量,或者准备一个名为fence的VkFence类型围栏变量。我们可以同时准备两个同步对象,但至少需要其中一个。
4.创建名为image_index的uint32_t类型变量。
5.调用vkAcquireNextImageKHR( logical_device, swapchain, <timeout>, semaphore, fence, &image_index )。第一个参数提供逻辑设备句柄,第二个参数为交换链对象的句柄,对于名为<timeout>的第三个参数提供一个事件值,之后函数将返回超时错误。您还需要提供一个或两个同步原语-交换链和(或者)围栏。对于最后一个参数,提供指向image_index变量的指针。
译者注:还需要提供一个或两个同步原语-交换链和(或者)围栏这里的交换链应该是作者写错了,应该是信号量才对!
6.检查vkAcquireNextImageKHR()函数返回值。如果返回为VK_SUCCESS或VK_SUBOPTIMAL_KHR,则调用成功,image_index变量将保存交换链图像的索引,该索引指向vkGetSwapchainImagesKHR()函数获取的数组元素(请参阅获取交换链图像的句柄)。但是如果返回了VK_ERROR_OUT_OF_DATE_KHR值,则无法使用交换链中的任何图像。我们必须销毁给定的交换链并再次重新创建它才能获取图像。

这个怎么运作...

vkAcquireNextImageKHR()函数返回由vkGetSwapchainImagesKHR()函数获取的交换链图像数组的索引。他不会返回该图像的句柄。一下是代码说明:

VkResult result; 

result = vkAcquireNextImageKHR( logical_device, swapchain, 2000000000, semaphore, fence, &image_index );
switch( result ) { 
  case VK_SUCCESS: 
  case VK_SUBOPTIMAL_KHR: 
    return true; 
default: 
  return false; 
}
 

在代码示例中,我们调用vkAcquireNextImageKHR()函数。由于呈现引擎的内部机制,有时可能无法立即显示图像。甚至可能无限期地等待!它发生在我们想要获取比呈现引擎可以提供的更多图像的情况下。这就是为什么在前面函数的第三个参数中,我们提供了一个以纳秒为单位的超时值。它告诉硬件可以等待图像多长时间。在此之后该功能将通知我们获取图像花费的时间太长。在上面的示例中,我们告知驱动程序我们不希望获得图像的时间超过2秒。
其它有趣的参数是信号量和围栏。当我们获得图像时,仍然可能不会立即使用。我们需要等待所有先前提交的引用此图像的操作完成。为此,可以使用围栏,应用程序可以使用该围栏来检查何时可以安全地修改图像。我们可以告诉驱动,在有可用的图像之前需要等待,直到图像可用再开始执行命令。为此,使用信号量通常是更好的选择。
提示:在应用程序端等待会比仅仅在GPU上等待更多地损害性能。

在交换链图像采集期间,返回值也非常重要。当函数返回VK_SUBOPTIMAL_KHR值时,意味着我们仍然可以使用图像,但它可能不再适合于呈现引擎。我们应该重新创建交换链并从中获取图像。但不需要立即这样做。当函数返回VK_ERROR_OUT_OF_DATE_KHR值时,不能再使用给定交换链中的图像,我们需要尽快重新创建它。

关于交换链图像采集的最后一点需要注意的是,在我们使用图像之前,需要改变(转换)其布局。布局是图像的内部存储器组织,根据使用图像的当前目的,可能会有所不同。如果我们想以不同的方式使用图像,需要更改其布局。

例如,呈现引擎使用的图像必须具有VK_IMAGE_LAYOUT_PRESENT_SRC_KHR布局,但是如果我们想要渲染图像,它必须具有VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL布局。更改布局的操作成为转换(请参阅第4章“资源和内存”中的“设置图像内存屏障”)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值