获取交换链图像

我们已经创建了交换链,接下来需要做地就是获取交换链图像的图像句柄。我们会在之后使用这些图像句柄进行渲染操作。现在,添加成员变量用于存储这些图像句柄:

std::vector<VkImage> swapChainImages

交换链图像由交换链自己负责创建,并在交换链清除时自动被清除,不需要我们自己进行创建和清除操作。

我们在createSwapChain函数的尾部,vkCreateSwapchainKHR函数调用之后,添加代码来获取交换链图像句柄。获取它们的方法和获取其它Vulkan对象的方法类似,首先获取交换链图像的数量,然后分配数组空间,获取交换链图像句柄。

vkGetSwapchainImagesKHR(device, swapChain, &imageCount, nullptr);
swapChainImages.resize(imageCount);
vkGetSwapchainImagesKHR(device, swapChain, &imageCount, swapChainImages.data());

我们在创建交换链时指定了一个minImageCount成员变量来请求最小需要的交换链图像数量。Vulkan的具体实现可能会创建比这个最小交换链图像数量更多的交换链图像,我们在这里,我们仍然需要显式地查询交换链图像数量,确保不会出错。

最后,在成员变量中存储我们设置的交换链图像格式和范围,我们会在之后的章节使用它们。

VkSwapchainKHR swapChain;
std::vector<VkImage> swapChainImages;
VkFormat swapChainImageFormat;
VkExtent2D swapChainExtent;

        ...

swapChainImageFormat = surfaceFormat.format;
swapChainExtent = extent;

现在,我们已经拥有了可以进行绘制操作的交换链图像,以及可以呈现图像的窗口表面。从下一章节开始,我们开始真正的图形管线部分。

本章节代码:

C++:

https://vulkan-tutorial.com/code/06_swap_chain_creation.cpp