UE4移动端中的两种Resolve
一种是 MSAA Resolve,原因是MultiSample(过采样)的RenderBuffer需要经过一些加权处理(重采样)才能转换为不带MSAA信息的Attachment。这部分处理一般是硬件帮我们做了(一般为Box Filter)(Vulkan支持自定义的FilterShader),这个过程称为Resolve。
另一种为 Tiled Resolve,移动端Tiled Based Deferred GPU 架构专有词,关于TBDR架构特性,有更详细的博客解析,我这里总结从UE4移动端管线做出特殊优化:
-
FrameBuffer被Tiled划分,执行完顶点着色器后,将变换后的三角形与每个Tile做相交检测,如果相交则将三角形id存入对应Tile的动态数组(位于主存中)中(该过程称为),渲染时,每个Tile取出它的相交三角形id列表(Power VR还有个隐藏面消除),对每个三角形着色。
-
着色之后,数据是存在片上缓存中的,如果要拿出这些数据作为shader resource使用,则需要进行一个叫tiled resolve的过程,简单讲就是把放在Tile片内存上的数据传回主存,这一过程占用大量的带宽和造成大量的功耗,手机急剧发热。
-
UE4 移动Forward管线基本没有Resolve(ShadowDepth pass有一次、PostProcess那是没办法了),他们的延迟管线为Onepass Deferred,申请的GBuffer RT类型为 Memoryless,数据不出Renderpass。(注:在给UE4添加延迟端GTAO效果时,把GBuffer的Normal项Resolve和直接根据深度重建法线相比,后者的速度会更快些)。
-
Memoryless概念是Apple提出的,在Vulkan中,设置Renderpass中的VkAttachmentDescription时,可以选择如下设置:VK_ATTACHMENT_LOAD_OP_DONT_CARE、VK_ATTACHMENT_STORE_OP_DONT_CARE,此时attachment行为等同与Memoryless,另外,Vulkan中若存在多个Subpass,shader直接可以直接通过subpassLoad获取attachment buffer中的当前像素位置的值。
-
UE4 移动Forward管线为了减去Resolve,在处理折射效果时,不是用的Unity Grabpass方案,而是让折射的物体在后处理阶段渲染,这样可以直接白嫖后处理已经Resolve好的SceneColor。
-
TBDR有硬件Early-Z,不过仅对Opaque物体生效,因此,UE4.26移动端补上了Mask-Only的Early-Z Prepass,在优化植被时效果显著。