虚幻引擎4.22手机添加一次Z-PrePass

得益于UE4 MeshDrawCommand架构的优良设计,为引擎渲染管线添加一个Pass变得非常的简单。在看完虚幻官方给出的文档后,我开始修改Mobile的渲染管线,原本以为需要自己定义一套Mesh Collector流程,自己写一遍shader binding,却发现引擎的Defferd管线的PrePass非常适合做这个,这节省了我大量的时间,我只需要额外注册一个Mobile的 PrePass就可以在BuildMeshDrawCommand中收集PrePass需要的一切信息,在MobileShadingRender中在MobileBasePass之前插入一次,一切都搞定了,最后再针对美术的使用体验修改一下编辑器界面,就完事了,非常的简单粗暴。

实际上为Mobile添加一个PrePass一个下午就弄完了,接下来的一个星期时间都是在打包测试,放在RenderDoc中测了一下,DrawCall多了近50%,但时间却整体减少了 5 - 6 ms。在材质复杂程度更高时,优化会更加明显。

另外,PrePass的Early-Z优化在低端机上更加明显,低端机的View Distance比较近,小件物体没有渲染,额外的drawcall数并不多,提升能达到惊人的10-12ms(也许是我们之前的优化做得太渣了)。

开启了PrePass后,注意Z Func的切换,Base Pass使用 Z-Equal能节省近15%的时间,原因在于 Z-Equal开启时,Mask材质在片元着色器之前的深度测试中直接可以测试了,无须采样Mask贴图来确定哪一部分为镂空。

PrePass 在低端机的Z-Test可能会出现精度问题:Pre-Z存下的深度精度(虽然是FP-16但感觉并不是真正的16bit)比不上管线中使用的精度,Mask材质如草、树叶出现黑色闪烁,目前还没有比较好的解决办法,我暂时把它给屏蔽了。

最后,主动给角色、大地形的Material Blend Mode切换为Mask,可以让它们参与到 Mask Only PrePass的流程中,最大程度减少DrawCall同时减少Overdraw。

注:我发现UE4.25已经看到PrePass添加到移动管线上去了,不过它是 Mask Only的,并且目前这个特性并没有放出来。在未来的版本可能会有吧。

© - 2024 · 月光下的旅行。 禁止转载