RenderPass
RenderPass是现代图形API提出的新概念,简单来说RenderPass是整个Render Pipeline的一次执行。RenderPass本质是定义一个完整的渲染流程以及使用的所有资源的描述,可以理解为是一份元数据或者占位符的概念其中不包含任何真正的数据。简单来说就是各种着色器的步骤的组合。所以走完一遍渲染管线,可以看成是一次renderPass。
在Vulkan中,一个RenderPass包含了一个或多个SubPass,每个SubPass对应很多的Attachment(包括颜色,深度等),同时开发者需要定以后SubPass之间的依赖关系,最后由RenderPass管理,交给GPU执行,完成渲染动作。
Why RenderPass
在传统的图形API当中,可以随意渲染任何想要的东西到Framebuffer上。但是Vulkan的CommandBuffer是多线程上并行构建的且随着移动端GPU的Tile Base架构更流行,直接取Framebuffer数据会有问题。于是在Vulkan当中提出了RenderPass这一概念。旨在让应用程序将一帧的高层结构传递给驱动程序更加明确渲染执行步骤,而不是随意地渲染到Framebuffer中去。
Subpass
如果说RenderPass是对所有DrawCall指令的集合边界(不包含的指令不进行绘制),那么SubPass可以认为是对某些特定指令和属性的处理。尤其是Tile Base架构下,每个tile下存在多个SubPass执行,且如果后续的渲染操作和前一次的渲染操作有着相同的分辨率,并且这一块的数据需要被显示,那么前一次的渲染结果会选择高效的保存在on-chip memory上,这样的算法也需要访问上一次的渲染结果,作为下一次渲染的输入判断依据。
Vulkan 把RenderPass拆分成了一系列SubPass,且这些Subpass有着相同的分辨率和tile管理方法,并且重要的是SubPass可以作为一个SubPass下的输入,可以更高效地进行中间结果的复用,而不必等完成的RenderPass执行完。
Attachments
Vulkan中有两个attachment,一为color,一为depth。一个Attachment对应于一个VkImageView。
Color Attachment
Color Attachment用来承载经过RenderPass渲染出的结果并且之后之后会被丢给SwapChain去展示,由于在RenderPass开始的时候不需要关心之前的内容,因此使用LOAD_OP_DONT_CARE以避免花费时间加载它是有意义的。
Depth Attachment
如果RenderPass结束后且后续的RenderPass不会用此次绘制的内容,则不需要将内容保留在缓冲区里,可以设置STORE_OP_DONT_CARE,避免不必要的带宽损耗。
Dependency
想象一下,我们的RenderPass中有很多的SubPass需要执行,其中不免某些SubPass之间会有依赖,甚至严格的执行顺序,此时我们通过VkSubpassDependency来描述RenderPass中不同SubPass之间或同一个SubPass的内存和执行同步依赖。
创建RenderPass
创建RenderPass很简单,只需要完成VkRenderPassCreateInfo的属性填充即可