知识卡片
多子通道+输入附件,让延迟渲染的中间数据留在片上
内容
延迟渲染通常要经过好几个步骤:先写深度、再生成一份包含法线/漫反射等参数的中间缓冲区(G缓冲区),最后读取这些中间结果做真正的光照计算。如果每一步都是独立的渲染通道,G缓冲区就必须完整写回主存,再在下一步完整读回。Vulkan把这几步表达成同一个渲染通道对象里的多个”子通道”,子通道之间通过显式声明的输入/输出附件关系(谁写、谁读)串联,Vulkan据此能推导出一张数据依赖的有向无环图。因为驱动提前知道G缓冲区只在这个渲染通道内部产生、消费、再也不会被别处用到,所以在支持tile-based渲染的硬件上,它可以把G缓冲区完全放在片上高速缓存里流转,永远不必落盘到主存——只有最终的颜色输出才需要真正写回。这是[[显式声明附件生命周期让驱动省掉不必要的写回]]的进一步延伸:把多个渲染步骤及其相互依赖一次性告诉驱动,换来的是中间数据完全不出片上缓存的巨大带宽节省。
参考来源
《Vulkan 应用开发指南》第13章《多通道渲染》