Vulkan Cookbook 第二章 13 获取交换链图像的句柄

获取交换链图像的句柄

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

创建交换链对象时,获取与交换链一起创建的所有图像的数量和句柄可能非常有用。

怎么做...

1.获取已创建的逻辑设备句柄。将其储存在名为logical_device的VkDevice类型变量中。
2.将创建的交换链的句柄分配给名为swapchain的VkSwapchainKHR类型变量。
3.创建名为images_count的uint32_t类型变量。
4.调用vkGetSwapchainImagesKHR( logical_device, swapchain, &images_count, nullptr ) ,为第一个参数提供创建的逻辑设备句柄,第二个参数提供交换链句柄,并在第三个参数提供指向images_count变量的指针。在最后一个参数中提供nullptr值。
5.如果调用成功,意味着返回的值等于VK_SUCCESS,则images_count变量将包含给定交换链对象创建的图像总数。
6.创建一个VkImage类型的元素std :: vector。将向量命名为wapchain_images并调整其大小,使其能够至少保存images_count个元素。
7.调用vkGetSwapchainImagesKHR( logical_device, swapchain, &images_count, &swapchain_images[0] )并为前三个参数提供相同的参数。在最后一个参数中,提供指向swapchain_images向量第一个元素的指针。
8.成功时,向量将包含所有交换链图像的句柄。

这个怎么运作...

驱动程序可能会创建比交换链创建参数中请求图像数量更多的图像。在那里我们定义了所需的最小数量,但准许Vulkan实现创建更多。
我们需要知道能够获取其句柄的已创建图像的总数。在Vulkan中当想要渲染图像时,需要知道它的句柄。需要创建一个包装图像的图像视图,并在帧缓冲区创建工程中使用。帧缓冲区如OpenGL中,指定在渲染过程中使用的一组图像(主要是我们渲染到它们中)。
我们需要知道哪些图像与交换链一起创建的。据说当应用程序想要使用可呈现图像时,它必须从呈现引擎获取它。图像采集过程返回一个数字,而不是句柄本身。提供的数字表示使用vkGetSwapchainImagesKHR()函数(wapchain_images变量)获取的图像阵列中的图像索引。因此正确使用交换链及其图像需要了解图像总数,顺序和句柄。要获取图像总数,我们需要使用以下代码:

uint32_t images_count = 0; 
VkResult result = VK_SUCCESS;

result = vkGetSwapchainImagesKHR( logical_device, swapchain, &images_count, nullptr ); 
if( (VK_SUCCESS != result) || (0 == images_count) ) {
  std::cout << "Could not get the number of swapchain images." << std::endl;   
  return false;
}

接下来,我们可以为所有图像准备储存容器并获取它们的句柄:

swapchain_images.resize( images_count );
result = vkGetSwapchainImagesKHR( logical_device, swapchain, &images_count, &swapchain_images[0] ); 
if( (VK_SUCCESS != result) || (0 == images_count) ) {
  std::cout << "Could not enumerate swapchain images." << std::endl; 
  return false;
}

return true;

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值