获取交换链图像的句柄
译者注:示例代码点击此处
创建交换链对象时,获取与交换链一起创建的所有图像的数量和句柄可能非常有用。
怎么做...
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;