帧缓冲区

      +

      介绍

      在之前的章节中,我们讨论了交换链图像和图像视图,现在我们将创建帧缓冲区对象来包装这些图像视图,以便在渲染过程中使用。帧缓冲区对象引用所有表示附件的 VkImageView 对象,例如颜色、深度和模板缓冲区。在我们的情况下,我们只需要一个颜色附件。

      创建帧缓冲区

      首先,添加一个类成员来存储帧缓冲区:

      std::vector<vk::raii::Framebuffer> swapChainFramebuffers;

      然后,在 initVulkan 中调用 createFramebuffers 函数:

      void initVulkan() {
          createInstance();
          setupDebugMessenger();
          createSurface();
          pickPhysicalDevice();
          createLogicalDevice();
          createSwapChain();
          createImageViews();
          createFramebuffers();
      }
      
      void createFramebuffers() {
      
      }

      帧缓冲区的创建非常简单。我们只需要为交换链中的每个图像视图创建一个帧缓冲区:

      void createFramebuffers() {
          swapChainFramebuffers.clear();
          for (auto imageView : swapChainImageViews) {
              vk::FramebufferCreateInfo framebufferInfo{ .renderPass = renderPass, .attachmentCount = 1, .pAttachments = &imageView, .width = swapChainExtent.width, .height = swapChainExtent.height, .layers = 1 };
              swapChainFramebuffers.emplace_back(device, framebufferInfo);
          }
      }

      请注意,我们使用的是动态渲染,因此不需要传统的渲染通道。相反,我们将在命令缓冲区中直接指定附件。

      清理

      在交换链重建时,我们需要清理帧缓冲区,因此在 cleanupSwapChain 函数中添加以下代码:

      void cleanupSwapChain() {
          swapChainFramebuffers.clear();
          swapChainImageViews.clear();
          swapChain = nullptr;
      }

      现在我们已经准备好帧缓冲区,可以开始设置命令缓冲区了。在 下一章 中,我们将创建命令缓冲区并开始绘制。