Vulkan帧缓冲区

一、简介
我们在创建渲染流程对象时指定使用的附着需要绑定在帧缓冲对象上使用。帧缓冲对象引用了用于表示附着的 VkImageView 对象。对于我们的程序,我们只使用了一个颜色附着。但这并不意味着我们只需要使用一张图像,每个附着对应的图像个数依赖于交换链用于呈现操作的图像个数。我们需要为交换链中的每个图像创建对应的帧缓冲,在渲染时,渲染到对应的帧缓冲上。

二、帧缓冲实例分析
基本的Vulkan编程流程:
在这里插入图片描述
在render pass创建阶段我们指定了具体的附件,并通过VkFramebuffer对象包装绑定。帧缓冲区对象引用表示为附件的所有的VkImageView对象。在我们的例子中只会使用一个帧缓冲区:color attachment。然而我们作为附件的图像依赖交换链用于呈现时返回的图像。这意味着我们必须为交换链中的所有图像创建一个帧缓冲区,并在绘制的时候使用对应的图像。
最后,在类成员中创建另一个std::vector用于保存framebuffers:
std::vector swapChainFramebuffers;
我们在新的函数createFramebuffers中为数组创建对象集合,这个函数在initVulkan创建完管线后调用:
void initVulkan(){
createInstance();
setupDebugCallback();
createSurface();
pickPhysicalDevice();
createLogicalDevice();
createSwapChain();
createImageViews();
createRenderPass();
createGraphicsPipeline();
createFramebuffers();
}

动态调整用于保存framebuffers的容器大小。
void createFramebuffers(){
swapChainFramebuffers.resize(swapChainImageViews.size());
}
我们接下来迭代左右的图像视图并通过它们创建对应的framebuffers:
for(size_t i=0;i<swapChainImageViews.size();i++){
VkImageView attachments[] = {
swapChainImageViews[i]
};
VkFramebufferCreateInfo framebufferInfo = {};
framebufferInfo.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
framebufferinfo.renderPass = renderPass;
framebufferInfo.attachmentCount = 1;
framebufferInfo.pAttachments = attachments;
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!”);
}
}
如上所示,创建framebuffers是非常直接的,首先需要指定framebuffer需要兼容的renderPass,我们只能使用与其兼容的渲染通道的帧缓冲区,这大体上也意味着他们使用相同的附件数量和类型。
AttachmentCount和pAttachments参数指定在渲染通道的pAttachment数组中绑定到相应的附件描述的VkImageView对象。
layer是指定图像数组中的层数。
在图像视图和渲染通道渲染完毕之后,删除对应的帧缓冲区:
void cleanup(){
for(size_t i=0;i<swapChainFramebuffers.size();i++){
vkDestroyFramebuffer(device,swapChainFramebuffers[i],nullptr);
}
}
到这里,我们就基本上对帧缓冲填充好了数据,接下来只需要调用Draw函数即可完成绘图工作。

三、总结
本篇文章中,我们对帧缓冲进行了简单的讨论。所谓帧缓冲,大家可以这样理解:帧缓冲区是由像素组成的二维数组,每一个存储单元对应屏幕上的一个像素,整个帧缓冲对应一帧图像即当前屏幕画面。帧缓冲通常包括:颜色缓冲、深度缓冲和累积缓冲,这些缓冲区可能在一块内存区域,也可能单独分开。

发布了146 篇原创文章 · 获赞 28 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/weixin_38498942/article/details/103785870
今日推荐