要想让 3D 游戏能够在尽可能多的设备上顺畅运行,首先要对 3D 美术进行精心设计,使其能够充分利用图形处理器。本指南将重点介绍在移动设备上可对 3D 资源采取哪些优化措施和最佳实践,以提高游戏性能并最大限度降低功耗。
本文中的部分内容基于由 Arm Limited 贡献并拥有版权的作品。
几何体的定义
几何体(或多边形网格)是构成 3D 对象形状的顶点、边和面的集合。它可以是汽车、武器、环境、角色或游戏中任何类型的视觉资源。
图 1. 立方体的顶点、边和三角形。
几何体由以下几部分构成:
顶点:这些点定义了 3D 空间中对象的结构。
边:一条连接两个顶点的直线段。
三角形:通过三条边将三个顶点两两连接就构成了一个三角形。其有时称为多边形或面。在 3ds Max、Maya 或 Blender 等 3D 软件中,通常使用的是四边形。四边形是具有四条边的多边形,更易于修改和使用。在渲染时,这些多边形在屏幕上显示为三角形。
请通过以下部分详细了解几何体:
三角形和多边形的使用
此部分将概述使用三角形和多边形时的最佳做法。其中包括以下建议:
减少三角形的数量
如果包含的三角形过多,游戏性能就会受到影响。
请尽可能减少所用三角形的数量。我们建议您使用的三角形数量刚刚好满足质量要求即可。在为移动游戏创建内容时,请考虑性能受到的影响。处理顶点的开销很大。顶点越少,游戏的整体性能就越高。另一方面,使用的三角形越少,游戏就能在越多没有强大 GPU 的设备上运行。
下图显示了即便使用较少三角形也能维持画质的情况:
图 2. 这是由不同数量三角形构成的两个对象的对比图,两个对象在着色模式下看起来相同。在左侧的对象中,移除了对轮廓没有影响的边。
在移动平台上,单个网格的顶点数上限一般为 65535。为确保最大程度的兼容性,顶点数必须低于这个数字。
设此限制的原因在于,所有 GPU 都只能保证支持 16 位索引(可以表示一个从 0 到 65535 个顶点的范围)。大多数(但并非所有)新型 GPU 都支持 32 位索引(表示一个从 0 至 4294967295 个顶点的范围)。使用 16 位索引时,如果顶点数超出支持的范围,就会导致几何体缺失或渲染错误。
请务必在您打算将游戏发布到的所有类型的目标设备(而不仅仅是 PC 显示器)上查看和测试游戏。一些细节级别高的模型在移动设备上可能无法正确渲染,甚至无法显示。
我们建议对前景对象使用更多三角形,对背景对象使用较少三角形。这种做法对采用静态镜头视点 (POV) 的游戏更有益。以下示例显示了如何对不同对象适当使用细节。
图 3. 此示例显示了前景对象的细节级别比背景对象高。
应为模型使用的三角形数量上限因设备和内容而异。如果屏幕上的对象变多,就对每个模型使用更少的三角形。如果屏幕上仅显示两三个对象,每个对象就可以包含更多三角形。
以下示例展示了不同演示中的两个模型。Circuit VR 演示只有一个机器人角色。由于只有一个对象,因此该机器人模型的三角形数量较多。另一个模型来自 Armies 演示。该演示的每一帧中都有数百名士兵,因此每个士兵的三角形数量较少。
图 4. 这是两个不同用例的三角形数量的对比图。左侧的 CircuitVR 机器人有 11,000 个三角形。右侧的 Armies 士兵有 360 个三角形。
三角形使用示例
下图为 Armies 技术演示中使用的三角形数量示例。
Armies 演示是使用 Unity 构建的 64 位移动技术演示,其中的镜头是采用许多动画角色的静态视角。每帧总计要渲染约 210000 个三角形。此三角形数量可让演示以大约 30 帧/秒 (FPS) 的速度稳定运行。
图 5. Armies 技术演示中的渲染示例显示了所使用的三角形数量。
场景中最大的对象(炮塔)约有 3000 个三角形,因为它们占据了屏幕的很大一部分。
每个角色大约使用 360 个三角形。由于角色的数量非常多且离视点较远,因此角色并未使用很多三角形。从镜头的 POV 来看,他们看起来很合适。
图 6. Armies 技术演示中使用较少三角形的士兵视图。
在重要区域使用三角形
顶点在移动平台上的开销非常高。为避免对图像处理预算造成任何浪费,请将顶点放在有助于提高游戏视觉质量的区域。3D 对象的小细节可能不会呈现在游戏的最终屏幕上。微小细节则可能因屏幕尺寸小和 3D 对象的展示位置而使用户根本看不到。
与其呈现精致的细节,不如将重点放在有助于构成轮廓的大形状上。下图就是将重点放在轮廓上的效果示例:
图 7. 机器人周围的红线表示其轮廓。
我们建议对从镜头 POV 不经常看到的区域(例如车底或衣柜背面)使用较少的三角形。如果对象的某个部分永远不会呈现在屏幕上,请删除对象的该部分。
删除对象的某个部分必须谨慎,而且删除某些部分可能会限制对象的可重用性。例如,如果您删除了桌子网格桌底的部分,那么当桌子倒置时,用户便会发现被删除的部分。
请勿使用高密度的三角形网格对小细节建模。请对精致细节使用纹理和法线贴图。以下示例展示了同一网格使用和不使用法线贴图的效果。
图 8. 这是使用法线贴图和不使用法线贴图的模型的对比图。
移除微小三角形
微小三角形是不会对场景最终视觉效果产生影响的非常小的三角形。
所有由大量多边形构成的 3D 对象在离开镜头时都存在微小三角形问题。微小三角形没有行业标准定义,但微小三角形通常可理解为在最终图像中小于 1 到 10 个像素的三角形。微小三角形的弊端在于,即使此类三角形对最终图像没有影响,GPU 仍要无一遗漏地对其执行所有处理。
微小三角形有以下两个成因:
- 细节过小且由众多三角形构成。
- 对象离镜头较远且由大量三角形构成。
图 9. 距离对微小三角形的影响。
在图 9 中,前景机器人没有微小三角形。背景机器人却有微小三角形,因为每个三角形的大小仅为 1 到 10 个像素。
图 10. 这是非常详细的模型之间的微小三角形对比图。突出显示区域中的大多数三角形都太小,以致于无法在手机屏幕上看到。
对于离镜头较远的对象,请使用细节级别 (LOD)。此技术可以降低对象的复杂程度,使其更简单,从而降低对象的三角形密度。
请勿使用大量三角形对细节建模。请使用纹理和法线贴图来实现此类精致细节。您可以合并对最终图像无影响的过小顶点和三角形细节。
请务必减少微小三角形的数量,因为它们会影响内存带宽。三角形越多,发送到 GPU 的数据就越多。在移动设备上,这可能会影响电池续航时间。功耗增加可能会导致温控降频,进而限制 GPU 的性能上限。
避免使用细长三角形
此类三角形在最终图像中渲染时,在一个维度上小于 10 个像素,而在屏幕上的跨度却很大。相较于其他三角形,细长三角形的处理开销通常更高。
在下图中,远观时柱子的斜面有一个细长三角形。如果近观,这些斜面是没有问题的。
图 11. 柱子的斜面为细长三角形。
我们建议您尽可能从所有对象中移除细长三角形。
对于有光泽的对象,在镜头移动时,细长三角形可能会导致光线闪烁。当对象远离镜头时,LOD 可以帮助移除细长三角形。
如果可能的话,尽量让所有三角形接近于等边形。这可以使三角形的面积更大而边更短。与面积较大的三角形相比,细长三角形的表现通常更差。如需详细了解三角形面积,请参阅三角测量。
细节级别
细节级别 (LOD) 是指随着对象离观看视点越来越远而逐渐降低复杂程度的一项技术。最常见的 LOD 形式包括多个网格版本,其顶点数逐渐减少。LOD 不仅可以减少要处理的顶点数,还可以避免微小三角形问题。此外,放置在场景中较远处的对象的视觉效果也更好。
我们建议您尽可能使用 LOD。将重点放在对象的轮廓上。最好将重点放在对象的平坦部位上,以便减少顶点。下图显示了将 LOD 应用于机器人模型的使用情况。
图 12. 这是随着 LOD 改变所用的顶点数的对比图。
在图 12 中,当同一个对象离视点较远时,其是由 200 个三角形构成还是 2000 个三角形构成,我们很难看出其中的区别。某个对象包含的三角形越多,消耗的资源就越多,但当该对象离视点较远时,其外观也没有改善。
图 13. 由不同数量的三角形构成的远景模型的对比图。
LOD 作为一种概念,也适用于着色器复杂程度和纹理分辨率。在较低的 LOD 下,可以使用更简单的着色器以更少的纹理处理不同的材质。您还应确保纹理具有 mipmap,以便将分辨率较低的纹理级别应用于远景对象。这些措施将提升性能,但会增加数据大小,您需要做出权衡。
我们建议不要对采用静态镜头和对象的任何游戏使用 LOD。如果有对象会移近和远离镜头,LOD 会发挥其最大优势。静态对象不会移动,因此使用 LOD 并没有优势。
图 14. Armies 技术演示中不使用 LOD 的静态镜头场景。
LOD 比率
根据 LOD 减少三角形的数量时,请使用一致的比率。我们建议您每个级别减少 50% 的三角形。
请勿对简单对象使用 LOD。对三角形数量已经很少的对象使用 LOD 没有益处。The Armies 技术演示中的以下示例展示了游戏在采用静态图像和三角形数量较少的对象时的视觉效果。
图 15. 这是随着 LOD 降低的模型对比图。
验证 LOD 级别在与镜头相距适当的距离时是否会发生变化。您的分析应基于其在游戏中的使用方式。
图 16. 这是 LOD 3 模型在近距离和预期距离下的外观对比图。
对于某个对象应采用哪个 LOD 级别才合理,并没有硬性的规定。具体级别取决于对象的大小及其重要性。例如,动作游戏中的角色或赛车游戏中的汽车可能比树木之类较小背景对象的 LOD 级别更高。
请注意,过多使用 LOD 会消耗 CPU 资源。CPU 需要用更多处理能力来确定要显示的 LOD。LOD 还要占用内存,这会增加文件大小和 VRAM 使用量。此外,创建和验证 LOD 模型也需要额外的时间。
创建 LOD 网格有手动和自动两种方式。
- 您可以使用任意 3D 软件手动创建 LOD 网格。
- 具体的做法是移除循环边或减少 3D 对象的顶点数。
- 这赋予美术人员对最终作品的最大控制权,但可能需要更长的时间。
- LOD 网格也可以自动创建。
- 您可以使用 3D 软件包中的修改器,如 3ds Max 中的 ProOptimizer,或 Maya 中的 Generate LOD Meshes 功能。
- 您可以使用 LOD 生成软件,如 Simplygon 或 InstaLOD。
- 有些游戏引擎具有自动 LOD 生成功能,可供您用于创建和应用 LOD 网格。
最佳做法
还有一些其他方法既可减少游戏所需的资源,又能保持图形保真度。
平滑组或自定义顶点法线
请使用平滑组或自定义顶点法线来定义边的硬度并改变模型的外观。平滑组有助于在采用低多边形艺术风格时提高着色效果。平滑组还会影响 UV 岛拆分以及烘焙时的法线贴图质量。
图 17. 这是使用平滑组和不使用平滑组的模型的对比图。
如果在 3D 模型上实现平滑组,必须将其从 3D 软件中导出并导入引擎中。
网格拓扑
创建新的 3D 资源时,请确保它具有清晰的拓扑。清晰的拓扑对于角色以及其他有生命和变化的对象至关重要。拓扑不需要完美无瑕。请记住,最终用户不会看到线框图,而且纹理和材质对模型的外观影响较大。
图 18. Armies 技术演示中岩石的拓扑、线框图和最终版本。
对形状加以夸张
您可以对某些形状加以夸张,使模型更容易理解。这在很大程度上取决于游戏的类型和风格。由于移动设备的屏幕较小,因此很难看到某些非常小的形状。对这些形状加以夸张便于用户即使观看离视点较远的形状也能看到。
例如,您可以将角色的手设计得更大,让人更容易看到。
图 19. 示例模型以夸张的比例显示,以提高醒目程度。