Vulkan显示图像

渲染交换链图像或通过其他方式使用交换链图像后,需要将该图像还给显示引擎,该操作称为显示,它会将图像显示在屏幕上。

准备工作

本节将使用一个自定义结构:

Vulkan显示图像
该结构用于定义提供图像的交换链和用于显示的图像(该图像的索引)。在处理每个交换链时,我们都可以一次仅显示一幅图像。

具体处理过程

(1)获取支持显示操作队列的句柄,将该句柄存储在一个VkQueue类型的变量中,将该变量命名为queue。
(2)创建一个std::vector<VkSemaphore>类型的变量,将其命名为rendering_semaphores。在这个vector容器变量中存储与指定渲染命令关联的信号,这些渲染命令引用了我们想要显示的图像。
(3)创建一个std::vector<VkSwapchainKHR>类型的变量,将其命名为swapchains,该vector容器变量用于存储提供图像的所有交换链的句柄。
(4)创建一个std::vector<uint32_t>类型的变量,将其命名为image_indices。调整该vector容器变量的尺寸,使它含有的元素数量与vector容器swapchains变量含有的元素数量相同。为image_indices变量中的每个元素,赋予与swapchains变量中对应交换链中图像的索引。
(5)创建一个VkPresentInfoKHR类型的变量,将其命名为present_info。将下列值赋予该变量中的各个成员。
● 将VK_STRUCTURE_TYPE_PRESENT_INFO_KHR赋予sType成员。
● 将nullptr赋予pNext成员。
● 将waitSemaphoreCount成员的值设置为vector容器rendering_semaphores变量含有元素的数量。
● 将pWaitSemaphores成员的值设置为指向vector容器rendering_semaphores变量中第一个元素的指针。
● 将vector容器swapchains变量含有元素的数量赋予swapchainCount成员。
● 将指向vector容器swapchains变量中第一个元素的指针赋予pSwapchains成员。
● 将pImageIndices成员的值设置为指向vector容器image_indices变量中第一元素的指针。
● 将pResults成员的值设置为nullptr。
(6)调用vkQueuePresentKHR(queue,&present_info)函数,将第一个参数设置为用于提交操作的队列的句柄,将第二个参数设置为指向present_info变量的指针。
(7)通过查明该函数调用操作的返回值等于VK_SUCCESS,确认该函数调用操作成功完成。

具体运行情况

显示图像操作会将图像发送给显示引擎,显示引擎会根据显示模式显示图像。我们可以在同一时刻显示多幅图像,但是同一时刻只能从指定交换链获取一幅图像。要显示一幅图像,必须获取该图像的索引,该索引是这幅图像在通过调用vkGetSwapchainImagesKHR()函数获取的交换链图像组中的编号。

Vulkan显示图像
这段代码将提供用于显示的图像的交换链的句柄和交换链图像的索引,分别存储在vector容器swapchains变量和image_indices变量中。
TIP在将图像提交给显示引擎前,需要将图像的布局更改为VK_IMAGE_LAYOUT_PRESENT_SRC_KHR,否则显示引擎可能无法正确显示这幅图像。
信号用于通知硬件何时能够安全地显示图像。当我们提交渲染命令时,可以将一个信号与这个提交操作关联起来。当这些命令被执行完后,该信号会将本身的状态更改为已通知。我们应该创建信号,并将信号与引用了可显示图像的命令关联起来。这样当编写的应用程序显示图像并提供信号时,硬件就能够知道何时某幅图像已经不再被使用了,为显示这幅图像不会中断先前提交的操作。

酷客网相关文章:

赞(39)

评论 抢沙发

评论前必须登录!

 

Vulkan实战