Vulkan获取交换链图像的句柄

创建好交换链后,所有随交换链一起创建的图像的句柄和数量都是非常有用的信息。

具体处理过程

(1)获取已创建逻辑设备的句柄,将该句柄存储在一个VkDevice类型的变量中,将该变量命名为logical_device。
(2)将已创建交换链的句柄赋予一个VkSwapchainKHR类型的变量,将该变量命名为swapchain。
(3)创建一个uint32_t类型的变量,将其命名为images_count。
(4)调用vkGetSwapchainImagesKHR(logical_device,swapchain,&images_count,nullptr)函数。将第一个参数设置为已创建逻辑设备的句柄;将第二个参数设置为已创建交换链的句柄;将第三个参数设置为指向images_count变量的指针;将第四个参数设置为nullptr。
(5)如果该函数调用参数成功完成,就意味着该操作的返回值等于VK_SUCCESS,images_count变量会存储指定交换链中图像的总数。
(6)创建一个元素类型为VkImage的std::vector容器变量。将该vector容器变量命名为swapchain_images,并调整它的大小,使它含有的元素数量不小于images_count变量的值。
(7)调用vkGetSwapchainImagesKHR(logical_device,swapchain,&images_count,&swapchain_images[0])函数。前三个参数与上次调用该函数时前三个参数的值相同,将最后一个参数设置为指向vector容器swapchain_images变量中的第一个元素。
(8)该调用操作成功完成后,vector容器swapchain_images变量会含有所有交换链图像的句柄。

具体运行情况

驱动程序创建的图像数量,可能会比交换链创建参数中设定的图像数量更大。因此,我们只需要定义图像数量的下限,允许Vulkan实例创建更多的图像。

我们需要先知道已创建图像的总数,才能获取这些图像的句柄。在使用Vulkan的情况下,在渲染图像前,我们需要先获取图像的句柄,还必须创建用于封装图像和创建帧缓冲区的图像视图。像在OpenGL中一样,帧缓冲区设定了一组在渲染处理过程中使用的图像(这些图像多半会作为着色材料)。

但这不是需要获取随交换链创建的图像的唯一原因。当应用程序需要使用可显示的图像时,就必须从显示引擎获取该图像。在获取图像的过程中可以得到一个数字,而不是图像的句柄。显示引擎提供的这个数字是图像在图像队列(交换链)中的索引(可通过调用vkGetSwapchainImagesKHR()函数获取这组图像,将它们存储在swapchain_images变量中)。因此,要通过合适的方式使用交换链和其中的图像,就必须获取图像的总数、排列次序和句柄。

首先,可使用下列代码获得图像的总数。

Vulkan获取交换链图像的句柄

然后,就可以为所有图像准备存储空间并获取这些图像的句柄。
Vulkan获取交换链图像的句柄

酷客网相关文章:

赞(0)

评论 抢沙发

评论前必须登录!

 

Vulkan实战