Vulkan教程翻译之十三 创建 Framebuffer

原文链接:https://vulkan.lunarg.com/doc/sdk/1.2.131.2/windows/tutorial/html/12-init_frame_buffers.html

创建 Framebuffer

本章节的代码文件是 12-init_frame_buffers.cpp

Vulkan Framebuffer

Framebuffer 代表了一个 render pass 实例中使用的内存附件的集合。这些内存附件的例子包括我们在前面示例中创建的 color image buffer 和 depth buffer。Framebuffer 提供了 render pass 在渲染时所需要的附件。

在前面的 swapchain 示例中,你创建了一个 swapchain,它为 swapchain 里的每一个"frame"提供了一个 color image attachment。在 depth buffer 示例中你还创建了一个 depth image attachment,它是被每一帧的 color image attachment 重复使用的。

在 render pass 示例中,你创建了一个 render pass 来描述附件的属性,但是实际上没有连接真正的资源(image)到 render pass。Framebuffer 本质上是连接真正的 attachment 和 render pass。

例如,如果 swapchain 里有两个 frame,你需要创建两个 framebuffer。第一个 framebuffer 包含第一个 color image buffer,是你在 swapchain 示例中使用 vkGetSwapchainImagesKHR() 获取到的。它还包含你在 depthbuffer 示例中创建的唯一的 depth buffer。第二个 framebuffer 包含第二个 color image buffer,和第一个 framebuffer 里使用的同一个 depth buffer。

Vulkan教程翻译之十三 创建 Framebuffer_第1张图片

查看代码,你可以从有两个附件的数组开始,将第二个预先初始化为 depth buffer,因为它将被所有 framebuffer 使用。稍后再填充第一个附件。注意使用"view"对象来引用 image,因为 view 包含着描述缓冲区格式和用途所需要的额外的元数据。

VkImageView attachments[2];
attachments[1] = info.depth.view;

接下来,填充结构体的创建信息:

VkFramebufferCreateInfo fb_info = {};
fb_info.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
fb_info.pNext = NULL;
fb_info.renderPass = info.render_pass;
fb_info.attachmentCount = 2;
fb_info.pAttachments = attachments;
fb_info.width = info.width;
fb_info.height = info.height;
fb_info.layers = 1;

该示例是编写来支持在运行时确定 swapchain buffer 数量,所以为 framebuffer 动态分配一个句柄数组。

info.framebuffers = (VkFramebuffer *)malloc(info.swapchainImageCount *
                                            sizeof(VkFramebuffer));

对每一个 framebuffer来说,给 swapchain 里对应的 color image buffer 设置第一个附件,但是留着第二个附件设置为相同的 depth buffer,这样它就可以被所有的 framebuffer 共享了。

for (int i = 0; i < info.swapchainImageCount; i++) {
    attachments[0] = info.buffers[i].view;
    res = vkCreateFramebuffer(info.device, &fb_info, NULL, &info.framebuffers[i]);
}

请注意,你在 renderpass 示例中定义的同一个 render pass 也与每一个 framebuffer 相关联。

你可能感兴趣的:(Vulkan教程翻译)