Vulkan Cookbook 第二章 14 使用R8G8B8A8格式和邮箱呈现模式创建交换链

使用R8G8B8A8格式和邮箱呈现模式创建交换链

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

要创建交换链,需要获取大量附加信息并准备想到多的参数。为了呈现准备阶段所需的所有步骤的顺序以及如何使用所获得的信息,我们将创建我们选择参数的交换链。为此,将设置一个邮箱呈现模式,最常用的R8G8B8A8颜色格式,带有无符号标准化值(类似OpenGL的RGBA8格式),无变换和标准颜色附件图像用法。

怎么做...

1.准备物理设备句柄。将其储存在名为physical_device的VkPhysicalDevice类型变量中。
2.获取已创建的呈现表面的句柄,并将其指定给名为presentation_surface的VkSurfaceKHR类型变量。
3.获取由physical_device变量表示的逻辑设备句柄。存放在名为logical_device的VkDevice类型变量中的。
4.创建一个名为old_swapchain的VkSwapchainKHR类型的变量。如果先前创建了交换链,将其句柄分配给old_swapchain变量。否则为其分配VK_NULL_HANDLE。
5.创建名为desired_present_mode的VkPresentModeKHR类型变量。
6.检查是否支持VK_PRESENT_MODE_MAILBOX_KHR呈现模式并将其分配给desired_present_mode变量。如果不支持此模式,请使用VK_PRESENT_MODE_FIFO_KHR模式(请参阅选择期望的呈现模式)。
7.创建一个名为surface_capabilities的VkSurfaceCapabilitiesKHR类型变量。
8.获取演示表面的功能并将其储存在surface_capabilities变脸中。
9.创建一个名为number_of_images的uint32_t类型变量。基于获取的表面功能将图像最小所需数量分配给number_of_images(请参阅选择一些交换链图像)。
10.创建一个名为image_size的VkExtent2D类型变量。基于获得的表面功能,将交换链图像的大小分配给image_size(请参阅选择交换链图像的大小)。
11.确保image_size变量的width和height大于零。如果他们不是,不要尝试创建交换链,也不要关闭应用程序-可能是因为窗口最小化。
12.创建名为image_usage的VkImageUsageFlags类型变量。为其分配VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT图像使用场景(请参阅选择交换链图像的所需使用场景)。
13.创建一个名为surface_transform的VkSurfaceTransformFlagBitsKHR类型变量。在变量中储存标识转换(值VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR)。根据获得的表面功能,检查是否支持。如果不是,则将获取的功能的currentTransform成员分配给surface_transform变量(请参阅选择交换链图像的转换)。
14.创建一个名为image_format的VkFormat类型变量和一个名为image_color_space的VkColorSpaceKHR类型变量。
15.使用获取的功能,尝试将VK_FORMAT_R8G8B8A8_UNORM图像格式与VK_COLOR_SPACE_SRGB_NONLINEAR_KHR颜色空间一起使用。如果不支持格式或颜色空间,请从曲面功能中选择其他值(请参阅 选择交换链图像的格式)。
16.创建一个名为swapchain的VkSwapchainKHR类型变量。
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.创建一个名为swapchain_images的std :: vector<VkImage>类型的变量,并将创建的交换链图像的句柄储存在其中(请参阅获取交换链图像的句柄)。

这个怎么运作...

当我们想要创建交换链时,首先需要考虑想要使用的呈现模式。由于邮箱模式准许我们在没有屏幕撕裂的情况下呈现最新图像(它类似于三重缓冲),看起来是一个不错的选择:

VkPresentModeKHR desired_present_mode; 
if( !SelectDesiredPresentationMode( physical_device, presentation_surface, VK_PRESENT_MODE_MAILBOX_KHR, desired_present_mode ) ) { 
  return false; 
}

接下来,我们需要获取呈现表面功能并使用它们来设置所学的图像数量,大小(尺寸),使用场景,演示过程中应用的变换,以及它们的格式和颜色空间:

VkPresentModeKHR desired_present_mode;
if( !SelectDesiredPresentationMode( physical_device, presentation_surface, VK_PRESENT_MODE_MAILBOX_KHR, desired_present_mode ) ) {
  return false;
}

VkSurfaceCapabilitiesKHR surface_capabilities;
if( !GetCapabilitiesOfPresentationSurface( physical_device, presentation_surface, surface_capabilities ) ) {
  return false;
}

uint32_t number_of_images;
if( !SelectNumberOfSwapchainImages( surface_capabilities, number_of_images ) ) {
  return false;
}

if( !ChooseSizeOfSwapchainImages( surface_capabilities, image_size ) ) {
  return false;
}
if( (0 == image_size.width) || (0 == image_size.height) ) {
  return true;
}

VkImageUsageFlags image_usage;
if( !SelectDesiredUsageScenariosOfSwapchainImages( surface_capabilities, swapchain_image_usage, image_usage ) ) {
  return false;
}

VkSurfaceTransformFlagBitsKHR surface_transform;
SelectTransformationOfSwapchainImages( surface_capabilities, VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR, surface_transform );

VkColorSpaceKHR image_color_space;
if( !SelectFormatOfSwapchainImages( physical_device, presentation_surface, { VK_FORMAT_R8G8B8A8_UNORM, VK_COLOR_SPACE_SRGB_NONLINEAR_KHR }, image_format, image_color_space ) ) {
  return false;
}

最后,通过所有这些准备工作,我们可以创建一个交换链,销毁旧交换链(如果我们想要替换它们),并获取随之创建的图像的句柄:

if( !CreateSwapchain( logical_device, presentation_surface, number_of_images, { image_format, image_color_space }, image_size, image_usage, surface_transform, desired_present_mode, old_swapchain, swapchain ) ) {
  return false;
}

if( !GetHandlesOfSwapchainImages( logical_device, swapchain, swapchain_images ) ) {
  return false;
}
return true;

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值