通过R8G8B8A8格式和邮箱显示模式(mailbox present mode)创建交换链
创建交换链需要获取大量额外信息并准备大量参数。为了了解准备工作阶段的所有步骤和次序,以及使用已得到信息的方式,我们将使用任意选择的参数创建一个交换链。我们将设置一种邮箱显示模式、最常见的R8G8B8A8颜色格式(与OpenGL的RGBA8格式类似,基于无符号标准化值)、无图像转换方式,以及一种标准的着色图像用法。
具体处理过程
(1)获取物理设备的句柄,将该句柄存储在一个VkPhysicalDevice类型的变量中,将该变量命名为physical_device。
(2)获取已创建显示曲面的句柄,将该句柄存储在一个VkSurfaceKHR类型的变量中,将该变量命名为presentation_surface。
(3)获取通过physical_device变量中句柄创建的逻辑设备的句柄,将该逻辑设备句柄存储在一个类型为VkDevice,名为logical_device的变量中。
(4)创建一个VkSwapchainKHR类型的变量,将其命名为old_swapchain。如果之前创建了交换链,就将这个旧交换链的句柄存储在old_swapchain变量中;否则,就将VK_NULL_HANDLE赋予old_swapchain变量。
(5)创建一个VkPresentModeKHR类型的变量,将其命名为desired_present_mode。
(6)查明VK_PRESENT_MODE_MAILBOX_KHR显示模式是否得到了该物理设备的支持,并将该显示模式赋予desired_present_mode变量。如果该显示模式没有得到支持,则可使用VK_PRESENT_MODE_FIFO_KHR模式(请参阅“选择显示模式”小节)。
(7)创建一个VkSurfaceCapabilitiesKHR类型的变量,将其命名为surface_capabilities。
(8)获取显示曲面的功能,并将这些数据存储在surface_capabilities变量中。
(9)创建一个uint32_t类型的变量,将其命名为number_of_images。根据已获得的显示曲面功能,将图像数量下限赋予number_of_images变量。
(10)创建一个VkExtent2D类型的变量,将其命名为image_size。根据已获得的显示曲面功能,将交换链图像的尺寸赋予image_size变量。
(11)确保image_size变量中width和height成员的值大于0。如果二者中有一个成员没有大于0,就不要尝试创建交换链,但是不需要关闭应用程序,因为窗口最小化时可能会出现这种情况。
(12)创建一个VkImageUsageFlags类型的变量,将其命名为image_usage。将VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT图像使用方式赋予该变量。
(13)创建一个VkSurfaceTransformFlagBitsKHR类型的变量,将其命名为surface_transform。将恒等转换(VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR)方式赋予该变量。根据已获取的显示曲面功能,查明该转换方式是否得到了支持。如果该转换方式没有得到支持,就将surface_capabilities变量中currentTransform成员的值赋予surface_transform变量。
(14)创建一个VkFormat类型的变量,将其命名为image_format。创建一个VkColor SpaceKHR类型的变量,将其命名为image_color_space。
(15)使用已获得的显示曲面功能,尝试通过VK_COLOR_SPACE_SRGB_NONLINEAR_KHR颜色空间使用VK_FORMAT_R8G8B8A8_UNORM图像格式。如果该图像格式和颜色空间对中的任何一个没有得到支持,则可从显示曲面功能中选择其他值。
(16)创建一个VkSwapchainKHR类型的变量,将其命名为swapchain。
(17)使用logical_device、presentation_surface、number_of_images、image_format、image_color_space、size_of_images、image_usage、surface_transform、desired_present_mode和old_swapchain变量,创建一个交换链并将该交换链的句柄存储在swapchain变量中。不要忘记查明该交换链创建操作是否成功完成。
(18)创建一个std::vector<VkImage>
类型的变量,将其命名为swapchain_images。将已创建交换链图像的句柄存储在该变量中。
具体运行情况
在创建交换链时,首先确定需要使用哪种显示模式。因为邮箱显示模式可以在避免画面撕裂的情况下显示最新图像,其效果与三重缓冲类似,所以是个不错的选择。

然后,需要获取显示曲面的功能并使用它们设置图像数量、图像尺寸、图像使用场景、在显示图像时应用的转换方式,以及图像的格式和颜色空间。


最后,完成这些准备工作后,就可以创建交换链了。销毁旧的交换链(在需要使用新交换链替换先前创建的旧交换链的情况下),获取随交换链一起创建图像的句柄。

酷客网相关文章:
评论前必须登录!
注册