大家好,我是腾讯游戏的引擎技术负责人曹舜。今天,我很高兴向大家介绍我们如何将SmartGI和NanoMesh引入到移动平台。
我的演讲包括几个关键主题。首先,我将介绍这个计划背后的故事,然后是这两个核心功能的实现细节,最后是我们目前的进展和未来计划。
整个项目始于一个简单的目标:重塑移动平台上的渲染流程,以优化运行时性能和内容创作的工作流程。虽然在桌面和游戏主机上无缝渲染已经很常见,但如今大多数移动游戏开发者仍然面临额外的工作量,如光照烘焙和手动LOD设置。这不仅是一个漫长而痛苦的过程,还存在引入人为错误的风险,因为涉及到数百甚至数千个参数。好消息是,我们最近的工作为游戏开发者提供了一个使用一套高精度资产和统一的开发流程,就可以适用于所有平台的制作和渲染管线。
我们的渲染流程分为三个阶段。第一个模块是NanoMesh,它是一个具有移动友好的材质着色器、可见性缓冲和自动LOD的延迟渲染流程。然后我们有一系列先进的光照技术,包括全局光照。最后是一个功能丰富的后处理器,支持VRS、超分、预测插帧等特性。
SmartGI和NanoMesh是我们技术的两个主要特性,一个用于光照,另一个用于网格渲染,这里是我们支持的特性列表。
让我们从SmartGI开始,它是一种混合方法,可以在包括移动平台在内的所有平台上实时提供全局光照。在这里,我们首先尝试使用屏幕空间算法收集光照数据,当屏幕空间方法失败时,我们切换到使用DDGI和SurfelGI。关于这些方法已经有很多文档和代码示例可用,所以我不会过多讨论它们。相反,我将重点介绍我们独特的解决方案,即Brick GI。
Brick GI是一种基于层次化体素的方法,但它与传统的剪切地图方法不同。我们不会生成围绕相机中心的固定数量的剪切地图。相反,我们将场景划分为与世界空间轴对齐的固定大小的虚拟区域。每个4x4x4的砖块集合构成一个砖块组,总共有64个砖块。我们利用无符号64位整数的每一位来指示哪些具体的砖块是活动的,并在砖块组上执行射线行进。对于每个活动的砖块,我们分配一个区域在砖块图集中存储反照率、法线和辐照度信息。
一旦构建了砖块层次结构,它只会在两种情况下进行更新:首先是相机移动,其次是网格的添加、变形或销毁。
用砖块替代体素带来了许多优势。例如,它提高了内存效率,并允许更精细的体素细节。逐帧捕获和光照注入对性能的影响很小。这种方法还可以使用HDDA代替SDF。
目前,SmartGI已成功应用于多个游戏项目中,显著提升了动态光照的视觉质量和用户体验。
现在让我们转向NanoMesh,它由三个主要概念组成:聚类剔除、可见性缓冲管理和延迟材质(与GBuffer的创建相关)。我们的优化工作主要集中在剔除和可见性缓冲生成上。最后的流式传输阶段也非常重要。
在深入讨论聚类剔除的实现细节之前,让我们简要回顾一下它的优势。
首先,如图所示,在实例级别进行剔除时,通常会看到许多对象,尽管它们大部分被遮挡或不可见,但仍然会被传输到GPU进行渲染。通过在聚类级别管理剔除的粒度,大多数三角形可以在到达GPU之前被有效地消除。其次,使用聚类可以用更少的位数表示三角形索引。基本上,8位足以覆盖0到127的范围,因此索引缓冲区的大小可以减小一半。此外,与网格LOD相比,聚类提供了更细粒度的流式控制,便于按需加载。
正如我们在这里所看到的,使用聚类和实例级别剔除之间的剔除率存在显著差异。
这是我们延迟+渲染流程的全面流程图,在离线阶段进行聚类生成,类似于虚幻引擎中的Nanite。另一方面,我们对其进行了许多调整和优化,使其能够在移动平台上运行。
在聚类生成阶段,我们将最细的聚类分组在一起,然后根据1/f(level)的结果显著减少整个组内的三角形数量。随后,我们生成更少的聚类,并迭代此过程,直到剩余的聚类满足我们预定义的条件。函数f(level)可以根据对象的特定特性进行调整,以达到最佳的三角形减少率。这就是我们使聚类生成适应场景的方式。
在运行时,我们根据设备的功耗和聚类与观察者视角的接近程度进一步微调聚类剔除的预设参数。这种策略不仅增强了剔除比例,还确保了在移动平台上视觉质量、性能和节能之间的平衡。
这是关于自适应聚类剔除的竞争性分析结果。如图所示,启用此功能后,游戏的帧率要稳定得多。紫色曲线代表具有自适应剔除的帧率,与绿色曲线(代表没有自适应剔除的帧率)相比,紫色曲线更平滑,波动性更小。这种改进也反映在帧时间的方差减少上,表明了流畅而一致的游戏体验。
确实,可见性缓冲在渲染中起着至关重要的作用,主要是为了最小化带宽使用,特别是对于移动设备而言。通过尽可能保持这些缓冲区的大小较小,我们可以显著提高性能和效率。
与Nanite在桌面和游戏主机上的做法相比,我们既不依赖软光栅化过程,也不依赖64位原子操作,这使得在当前移动设备上渲染大规模几何体成为可能。
这是NanoMesh与Arm Immortalis G720的最新测试结果,优化工作仍在进行中。
在传统的移动渲染流程中,我们无法以可接受的帧率处理如此复杂的场景。现在,有了NanoMesh的出现,我们可以在一些零售手机上以默认频率和功耗设置轻松达到60帧。
除了性能之外,仅仅启用NanoMesh就可以节省超过90%的功耗。更不用说通过摆脱不必要的LOD冗余来节省开发成本和移动包大小了。
传统的LOD方法中,示例包大小为1.8 GB,而使用NanoMesh后,仅为557 MB,减小了70%,下载速度也提高了70%。如果仅看网格数据的大小,NanoMesh仅使用大约16%的存储空间就能达到相同甚至更好的质量。
另外,还有一个方面是生产效率。在我们的实验中,设置每个模型的LOD平均需要16分钟,总共20个模型需要320分钟。而NanoMesh的预处理仅需80分钟,快了4倍!想象一下,对于开发一款三A级移动游戏,我们可以节省多少时间。
需要注意的是,我们在移动平台上的工作还远未完成。例如,我们仍在努力支持大量的局部光源和实时阴影。这超出了近似间接光照,需要一个全面的解决方案。同时,我们后续也会将GI算法进行升级,并且也会引入基于神经网络的surfel的算法。
至于NanoMesh,我们的重点是进一步优化带宽使用和减少绘制调用的数量,更重要的是,使其在所有平台上都能支持蒙皮网格。这将为移动游戏中的角色动画开启一个新时代。
感谢大家参加我们的讲座。我们将持续致力于突破实时渲染的界限,并期待与您在未来分享更多更新。如果您对我们的技术有任何兴趣,请随时与我联系。