文章目录
参考资料
简述
Render passes, 即渲染过程。在完成创建管道之前,我们需要告诉Vulkan渲染时将使用的帧缓冲区附件。
我们需要指定将有多少颜色和深度缓冲区,为每个缓冲区使用多少个样本,以及在整个渲染操作中应如何处理它们的内容。
所有这些信息都包装在一个render pass对象中,为其创建一个新的createRenderPass函数。在createGraphicsPipeline之前从initVulkan调用此函数。
void initVulkan() {
createInstance();
setupDebugCallback();
createSurface();
pickPhysicalDevice();
createLogicalDevice();
createSwapChain();
createImageViews();
createRenderPass();
createGraphicsPipeline();
}
void createRenderPass() {
}
Vulkan图形管线和计算管线的区别之一是,你使用图形管线来渲染出像素,组成图像以供处理或显示给用户。在复杂的图形应用程序中,图片经过很多遍构建,每一遍都生成场景的一部分,应用全帧效果如后期处理、合成、渲染用户界面元素等等。这样的一遍可以使用Vulkan 中 renderpass 对象表示。
一个单一的的renderpass对象封装了多个pass或者一系列最终图像的几个渲染阶段,renderpass对象包含输出图像所需的信息。
所有的绘制必须被包含在一个renderpass中。甚至,图形管线需要知道他们把渲染结果发往哪儿,因此,有必要在创建图形管线之前创建一个renderpass对象,告知正在生成图像的管线有关图像的信息。
一. Attachment description 附件说明
在这里,我们仅有一个颜色缓冲区附件,由交换链中的一个图像表示。
void createRenderPass() {
VkAttachmentDescription colorAttachment = {};
colorAttachment.format = swapChainImageFormat;
colorAttachment.samples = VK_SAMPLE_COUNT_1_BIT;
}
颜色附件的格式应该与交换链图像的格式匹配,而且我们还没有对多重采样做任何事情,所以只要使用1个样本。
colorAttachment.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
colorAttachment.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
colorAttachment.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
colorAttachment.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
loadOp和storeOp决定在呈现之前和呈现之后如何处理附件中的数据。loadOp和storeOp应用于颜色和深度数据,以及stencilLoadOp/
stencilStoreOp应用于模具数据。这里不会对模板缓冲区执行任何操作,因此加载和存储的结果是无关的。
1.1 loadOp
- VK_ATTACHMENT_LOAD_OP_LOAD: 指定将保留渲染区域中图像的先前内容。对于深度/模具格式的附件,这将使用访问类型V