我们在创建渲染流程对象时指定使用的附着需要绑定在帧缓冲对象上使用。帧缓冲对象引用了用于表示附着的 VkImageView 对象。对于我们的程序,我们只使用了一个颜色附着。但这并不意味着我们只需要使用一张图像,每个附着对应的图像个数依赖于交换链用于呈现操作的图像个数。我们需要为交换链中的每个图像创建对应的帧缓冲,在渲染时,渲染到对应的帧缓冲上。
示例demo:
//存储所有帧缓冲对象--10
std::vector<VkFramebuffer> swapChainFramebuffers;
//帧缓冲对象的创建--10
void createFramebuffers(){
//分配足够的空间来存储所有帧缓冲对象
swapChainFramebuffers.resize(swapChainImageViews.size());
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;
//指定渲染流程对象用于描述附着信息的 pAttachment 数组
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!");
}
}
}
//销毁帧缓冲对象--10
for(auto framebuffer : swapChainFramebuffers){
vkDestroyFramebuffer(device,framebuffer,nullptr);
}