《Vulkan Tutorial》 笔记 16:FrameBuffers
本部分结果可参考 16_FrameBuffers
本章涉及到的关键对象和流程如下所示
在 Ch 14 Render Passes 中我们已经创建了一个有着和 swapChainImageFormat 一样格式的 colorAttachment 的 RenderPass。
现在我们需要创建一个与和这个 RenderPass 所兼容的 FrameBuffer。Framebuffer 是一个包含了多个图像的集合,这些图像可以是颜色、深度或模板缓冲区。在我们的案例中,目前只有一个 Color Attachment。
RenderPass 和 Framebuffer 是 兼容 的关系。在后续部分,你会看到在创建 Framebuffer 时需要传入 RenderPass 的句柄。这个 RenderPass 只是用来验证 Framebuffer 中的 Attachment 是否和 RenderPass 中的 Attachment 兼容,并不是绑定关系。实际上,只要 Framebuffer 的 attachment 配置(数量、格式、尺寸等)与其他 RenderPass 兼容,也可以与这些 RenderPass 一起使用。
Attachment 所使用的 Image,取决于 swapChain 的 Image。因此我们需要为 SwapChain 中的每一个 Image 都创建一个 Framebuffer。
创建类 FrameBuffersMgr 如下:
1 | class FrameBuffersMgr |
其中 swapChainFramebuffers 是一个 std::vector<VkFramebuffer>,用来存储每个 Framebuffer 的句柄,其中的每一个元素与 swapChain 中的 Image 一一对应。
createFramebuffers 函数的实现如下:
1 | void FrameBuffersMgr::createFramebuffers() |
VkFramebufferCreateInfo 的构造比较直观:
sType:结构体类型renderPass:需要使用的 FrameBuffer 的 Render PassattachmentCount:Attachment 的数量pAttachments:Attachment 的 Image View 数组width:Framebuffer 的宽度,即与绑定的 Image 的宽度相同height:Framebuffer 的高度,即绑定的 Image 的高度相同layers:Framebuffer 的层数,通常为 1,除非是 XR 应用
destroyFramebuffers 函数的实现如下:
1 | void FrameBuffersMgr::destroyFramebuffers() |
在 HelloTriangleApplication::initVulkan 和 HelloTriangleApplication::cleanupSwapChain 中分别调用 createFramebuffers 和 destroyFramebuffers:
1 |
|

