研发实战:Arm分享一体式VR优化技巧,提升画质、流畅和稳定性
下面五点只是VR优化技巧宝典中的冰山一角
(映维网 2020年10月13日)如果你缺乏移动开发经验,将内容从PC和主机移植到所述平台或许是一个棘手的过程。在将作品带到Oculus Quest时同样如此,而且另一个挑战是,VR一体机是贴到用户面前,所以一丁点的错误都会清晰易见。能够正确地优化项目将意味着下面两个结果中的一个:流畅和愉快的用户体验;过热GPU造成的不断掉帧。
日前,Arm通过视频为Oculus Start Program带来了一个约20分钟的移动VR优化教程。下面映维网整理了视频中的五大要点:
1. 纹理压缩十分重要
即便纹理导出为PNG、JPEG、TGA或PSD,但在项目运行时它们不会保持为所述格式。每个纹理都会转换成可由GPU更快读取的格式,从而减少带宽,并且在VRAM中占用更少的内存。尽管你可以选择一系列不同的解决方案,但Arm建议移动平台采用ASTC(自适应可扩展纹理压缩/Adaptive Scalable Texture Compression)。ASTC由Arm和AMD开发,其最大的特点之一是它为你提供了众多用于控制压缩质量的选项。在一开始,不同级别的块大小(Block-Size)或许会令人感到害怕。所以,Arm建议你从5x5或6x6开始,然后为占用较少视图空间的资源放大块大小。但一定要尝试不同的设置,从而找寻最适合项目的选项。
你可以在项目中尝试的另一个选项是ETC(Ericsson Texture Compression)。但这通常会给纹理留下更高的内存占用空间、更低的视觉质量,并会降低运行时的性能。更多关于ASTC,如何使用ASTC,以及不同ASTC编码器选项的信息请访问这一页面(Arm在8月20日发布了ASTC v2.0编码器的升级版)。
2. 用LODs(Level OF Details)降低顶点数和避免微三角形
我们都知道几何对性能有着巨大的影响。网格的顶点越少,计算的速度就越快。保持正在渲染的顶点数有时会与项目的美术视觉产生冲突。这时我们可以利用LODs。
对于远离用户的网格,LODs将显示较低多边形的版本。相关模型属于预制型,其变化的距离可控。在更复杂的场景中,用户可以看到远处,而这将有助于减少顶点数,并解决另一个问题:微三角形(Mirco Triangles)。这种三角形在完全渲染时占据1-10个像素。尽管它们对最终图像的贡献不大,但GPU依然需要对其进行完整的处理。
3. 用Mipmaps来提高项目的性能和视觉
Mipmapping就像LODs,但主要针对纹理方面。Mipmap是以较低分辨率保存的纹理副本。在GPU对纹理进行采样时,它会根据片元所占的纹理空间大小选择合适的Mip级别。乍一看,Mipmap似乎有点奇怪。纹理的副本确实会增加它们的内存占用。但作为交换,你可以提高GPU的性能,因为它不必以全分辨率渲染远离camera的对象。同时,它可以防止纹理锯齿。当结合使用时,Mipmap和LODs可以加快场景渲染。
4. 细长三角形
正我前面所提,组成网格的顶点越少,GPU计算的速度就越快。但是,即便是低多边形网格都可能会存在一定的问题,并对GPU施加更大的压力。最常见的是细长三角形。对于这种三角形,由于第三个顶点距离遥远,所以它在完全渲染时将占据数十个像素。问题出现的原因是,GPU需要以方形块的形式处理多个像素。这是一个挑战,因为即便这个三角形只占视图控件的一小部分,GPU都必须对多个块执行计算。最好的选择是删除所有的细长三角形,并确保三角形尽可能接近等边。
5. 利用Alpha to Coverage
在保持出色性能并同时减少Alpha值对象的锯齿对虚拟现实而言是一个挑战。Alpha测试是一种广泛实现的Alpha合成形式,并且是不少游戏引擎的默认设置。但它可以在对象边缘产生服务器锯齿效果。Alpha混合是一种替代方法,但如果没有多边形排序,它将无法按顺序渲染对象,而且排序是一个非常计算成本昂贵的操作。
Alpha-to-Coverage(ATOC)可以通过将片元着色器的Alpha组件输出转换为覆盖遮罩,并将其与多采样遮罩相结合来帮助减少锯齿。然后,它将使用AND运算符并仅渲染通过所述操作的像素。
上图左侧是一个基本的Alpha测试,右侧则是ATOC。即便是静态图像,锯齿都非常显著,而当图像处于运动状态时,变化要明显得多。尽管实现这一点听起来相当困难,但Arm提供一个针对各个引擎的简单指南。
6. 热身
由于虚拟现实项目的多学科性质,五个技巧难以完全地覆盖方方面面。要开发出一个优秀的项目,你需要付出大量的努力。上面只是优化技巧的冰山一角。若要探索更多关于优化几何体、纹理和材质的详细信息,请关注Arms Best Practices for Artisters,并同时查看Unity项目示例和UE4项目示例中的VR图形技术。另外,呼吁大家积极向社区分享你的技巧和建议,从而帮助大家一同进步。