处理窗口大小变化

当窗口大小变化时,需要对深度缓冲进行处理,让深度缓冲的大小和新的窗口大小相匹配。为此我们扩展recreateSwapChain函数在窗口大小改变时重建深度缓冲:

void recreateSwapChain() {
    vkDeviceWaitIdle(device);

    cleanupSwapChain();

    createSwapChain();
    createImageViews();
    createRenderPass();
    createGraphicsPipeline();
    createDepthResources();
    createFramebuffers();
    createCommandBuffers();
}

最后,需要注意在交换链的清除函数cleanupSwapChain中添加对深度缓冲相关的清除操作:

void cleanupSwapChain() {
    vkDestroyImageView(device, depthImageView, nullptr);
    vkDestroyImage(device, depthImage, nullptr);
    vkFreeMemory(device, depthImageMemory, nullptr);

        ...
}

至此,我们就可以使用深度测试来渲染三维对象。在下一章节,我们将介绍如何绘制一个带有纹理的三维模型。

本章节代码:

C++:

https://vulkan-tutorial.com/code/26_depth_buffering.cpp

Vertex Shader:

https://vulkan-tutorial.com/code/26_shader_depth.vert

Fragment Shader:

https://vulkan-tutorial.com/code/26_shader_depth.frag