Vulkan创建交换链

交换链用于在屏幕上显示一组图像,这些图像能够被应用程序获取并在应用程序窗口中显示。每幅图像都拥有一组已定义的相同属性,将这些属性都设置好后,就意味着为交换链图像设定了数量、尺寸、格式和使用场景,还意味着已经获取了可用显示模式名单,并从中选用了一种显示模式,因而可以创建交换链。

具体处理过程

(1)获取已创建逻辑设备的句柄,将该句柄存储在一个类型为VkDevice、名为logical_device的变量中。
(2)将已创建显示曲面的句柄,赋予一个类型为VkSurfaceKHR、名为presentation_surface的变量。
(3)将想要使用的交换链图像数量,赋予一个类型为uint32_t、名为image_count的变量。
(4)将选定的图像格式-颜色空间对,存储在一个类型为VkSurfaceFormatKHR、名为surface_format的变量中。
(5)将选定的图像尺寸,赋予一个类型为VkExtent2D、名为image_size的变量。
(6)选定想要使用交换链图像的场景,将这些数据存储在一个VkImageUsageFlags类型的位域变量中,将该变量命名为image_usage。
(7)将选用的显示曲面转换方式,存储在一个VkSurfaceTransformFlagBitsKHR类型的变量中,将该变量命名为surface_transform。
(8)创建一个VkPresentModeKHR类型的变量,将其命名为present_mode,将想要使用的显示模式赋予该变量。
(9)创建一个VkSwapchainKHR类型的变量,将其命名为old_swapchain。如果之前已经创建了一个交换链,则可将这个旧交换链的句柄存储在old_swapchain变量中。如果没有旧的交换链,则应将VK_NULL_HANDLE赋予该变量。
(10)创建一个VkSwapchainCreateInfoKHR类型的变量,将其命名为swapchain_create_info,将下列值赋予该变量中的各个成员。
● 将成员sType的值设置为VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR。
● 将pNext成员的值设置为nullptr。
● 将0赋予flags成员。
● 将presentation_surface变量的值赋予surface成员。
● 将image_count变量的值赋予minImageCount成员。
● 使用surface_format.format成员的值设置imageFormat成员。
● 使用surface_format.colorSpace成员的值设置imageColorSpace成员。
● 将image_size变量的值赋予imageExtent成员。
● 将1赋予imageArrayLayers成员(如果想要执行分层/立体化渲染,则可为image ArrayLayers成员赋予更大的值)。
● 将image_usage变量的值赋予imageUsage成员。
● 将imageSharingMode成员的值设置为VK_SHARING_MODE_EXCLUSIVE。
● 将0赋予queueFamilyIndexCount成员。
● 将nullptr赋予pQueueFamilyIndices成员。
● 将surface_transform变量的值赋予preTransform成员。
● 将compositeAlpha成员的值设置为VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR。
● 将present_mode变量的值赋予presentMode成员。
● 将clipped成员的值设置为VK_TRUE。
● 将old_swapchain变量的值赋予oldSwapchain成员。
(11)创建一个VkSwapchainKHR类型的变量,将其命名为swapchain。
(12)调用vkCreateSwapchainKHR(logical_device,&swapchain_create_info,nullptr,&swapchain)函数。将第一个参数设置为已创建逻辑设备的句柄;将第二个参数设置为指向swapchain_create_info变量的指针;将第三个参数设置为nullptr;将第四个参数设置为指向swapchain变量的指针。
(13)通过将该函数调用操作的返回值与VK_SUCCESS进行比较,确认该函数调用操作成功完成。
(14)调用vkDestroySwapchainKHR(logical_device,old_swapchain,nullptr)函数,以便销毁旧的交换链。将第一个参数设置为已创建逻辑设备的句柄;将第二个参数设置为旧交换链的句柄;将第三个参数设置为nullptr。

具体运行情况

如前所述,交换链是一个图像集合。交换链图像是在创建交换链的过程中自动创建的,它也会随交换链一起被销毁。尽管应用程序可以获得这些图像的句柄,但是没有创建和销毁这些图像的权利。
创建交换链的过程不是很复杂,但是在创建交换链前需要准备大量数据。

Vulkan创建交换链

Vulkan创建交换链


一个应用程序窗口只能关联一个交换链。在创建新交换链时,需要销毁应用程序窗口之前关联的交换链。

Vulkan创建交换链

创建好交换链后,就可以获取它的图像并执行与已设定使用场景匹配的任务。与OpenGL(只有一个后备缓冲区,因而只能获取一幅图像)不同,我们可以获取多幅交换链图像。我们获取的交换链图像数量,取决于随交换链创建图像的已设定最少数量、选定的显示模式,以及当前渲染历史记录(新获得图像的数量和最近显示过图像的数量)。

获得一幅图像后,就可以在我们编写的应用程序中使用这幅图像了。最常见的用法是将图像作为着色材料,但用法不是只有这一个,使用交换链图像还可以执行其他任务。然而,我们必须确认指定的硬件平台的这些图像使用方式,并在创建交换链的过程中设定这些用法。并非所有硬件平台都能够支持所有图像使用方式,只有用于着色材料才是强制所有硬件平台提供支持的。

当将图像作为着色材料或其他用途时,就可以显示图像。显示图像的操作会将图像发送回显示引擎,显示引擎会根据已设定的显示模式使用新收到的图像替换当前显示的图像。

酷客网相关文章:

赞(0)

评论 抢沙发

评论前必须登录!

 

Vulkan实战