Vulkan之FrameBuffer

framebuffer就是帧缓冲,这又是一个新概念。同时对于vulkan而言,因为没有默认的framebuffer(话说vulkan本来就不打算管太多),所以需要自己创建。

那么什么是帧缓冲呢?帧缓冲是一个用来表示一组图像的对象,图形管线将在这些图像上绘制。帧缓冲区对象通过使用渲染通道的引用来创建的。

实际上我们在整个渲染流程中,我们最终会将渲染完成的结果放到一个内存缓冲上,这个地方就是帧缓冲。因此我们我们可以看到帧缓冲一定是跟renderpass相关的。而renderpass中的attachment就跟我们的framebuffer息息相关。

framebuffer的创建:

1
2
3
4
5
VKAPI_ATTR VkResult VKAPI_CALL vkCreateFramebuffer(
VkDevice device,
const VkFramebufferCreateInfo* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
VkFramebuffer* pFramebuffer);

framebuffer通过调用上面的函数创建,这个里面重要的内容是pCreateInfo,下面我们看下这个结构VkFramebufferCreateInfo

1
2
3
4
5
6
7
8
9
10
11
typedef struct VkFramebufferCreateInfo {
VkStructureType sType;
const void* pNext;
VkFramebufferCreateFlags flags;
VkRenderPass renderPass;
uint32_t attachmentCount;
const VkImageView* pAttachments;
uint32_t width;
uint32_t height;
uint32_t layers;
} VkFramebufferCreateInfo;

这个结构体的参数都很简单明了
attachmentCount是附着的个数
pAttachments 是指向附着的数组的指针
width, height, layer分别是帧缓冲图像的宽度,高度,层数。

一般来说framebuffer跟swapchain中的imageView数目是相等的,有多少个imageView就有多少个framebuffer。

一段简单的应用代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
void createFramebuffers() {
swapChainFramebuffers.resize(swapChainImageViews.size());

for (size_t i = 0; i < swapChainImageViews.size(); i++) {
std::array<VkImageView, 3> attachments = {
colorImageView,
depthImageView,
swapChainImageViews[i]
};

VkFramebufferCreateInfo framebufferInfo{};
framebufferInfo.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
framebufferInfo.renderPass = renderPass;
framebufferInfo.attachmentCount = static_cast<uint32_t>(attachments.size());
framebufferInfo.pAttachments = attachments.data();
framebufferInfo.width = swapChainExtent.width;
framebufferInfo.height = swapChainExtent.height;
framebufferInfo.layers = 1;

if (vkCreateFramebuffer(device, &framebufferInfo, nullptr, &swapChainFramebuffers[i]) != VK_SUCCESS) {
throw std::runtime_error("failed to create framebuffer!");
}
}
}

显示 Gitment 评论