几何体

在尽可能多的设备上运行良好的 3D 游戏始于经过设计的 3D 艺术,以最佳方式利用图形处理器。本指南重点介绍了移动设备上 3D 资源的优化和最佳实践,以提高游戏性能并最大限度地减少功耗。

本文的部分内容基于 Arm Limited 贡献和版权的作品。

几何体的定义

几何体或多边形网格是构成 3D 对象形状的顶点、边和面的集合。这可以是汽车、武器、环境、角色或游戏中任何类型的视觉资源。

图 1. 立方体的顶点、边和三角形。

几何体由以下部分组成

  • 顶点:顶点的复数形式。这些点定义了对象在 3D 空间中的结构。

  • 边:用直线连接的两个顶点。

  • 三角形:三个顶点通过三条边相互连接形成一个三角形。这有时被称为多边形或面。在 3ds Max、Maya 或 Blender 等 3D 软件中,你通常使用四边形。四边形是四边形,更容易修改和使用。渲染时,这些多边形在屏幕上显示为三角形。

使用以下部分了解有关几何体的更多信息

三角形和多边形的使用

本节概述了使用三角形和多边形时的最佳实践。这包括以下建议

减少三角形的数量

如果你包含太多三角形,游戏性能就会受到影响。

尽可能使用最少的三角形数量。我们建议你仅使用足以获得所需质量的数量。在为移动游戏创建内容时,请考虑对性能的影响。处理顶点成本很高。顶点越少,游戏的整体性能越好。此外,你使用的三角形越少,可以在没有强大 GPU 的情况下运行游戏的设备就越多。

下图显示你可以用更少的三角形保持质量

The object on the left has 584 triangles, while the object on the right has 704.

图 2. 两个具有不同三角形数量但看起来相同的对象在阴影模式下的比较。在左侧的对象中,删除了对轮廓线没有贡献的边。

在移动平台上,单个网格的常见最大顶点数为 65,535。为了确保最大的兼容性,你必须保持在此数字以下。

此限制的原因是所有 GPU 仅保证支持 16 位索引,这些索引可以表示 0 到 65,535 个顶点的范围。大多数(但不是全部)现代 GPU 支持 32 位索引,表示 0 到 4,294,967,295 个顶点的范围。如果你在使用 16 位索引时超过了支持的范围,会导致几何体缺失或渲染错误。

始终在打算发布的任何设备上查看和测试游戏,而不是 PC 显示器。一些具有高细节级别的模型可能无法在移动设备上正确渲染,甚至无法显示。

我们建议在前景色对象上使用更多三角形,在背景对象上使用更少的三角形。这对于具有静态摄像机视角 (POV) 的游戏更有益。以下示例显示了在不同对象上适当地使用细节。

Details in foreground objects are created with triangles. Background details are baked into flat surfaces.

图 3. 此示例显示与背景对象相比,前景对象的细节级别较高。

你应该为模型使用的最大三角形数量因设备和内容而异。如果屏幕上有更多对象,请为每个模型使用更少的三角形。如果仅显示两个或三个对象,则它们可以包含更多三角形。

以下示例显示了来自不同演示的两个模型。Circuit VR 演示仅包含一个机器人角色。因为只有一个对象,所以机器人模型具有更高的三角形数量。另一个模型来自 Armies 演示。此演示在每一帧中都有数百名士兵,因此每个士兵的三角形数量更少。

图 4. 两个不同用例的三角形数量比较。左侧,CircuitVR 机器人有 11,000 个三角形。右侧,Armies 士兵有 360 个三角形。

三角形使用示例

下图是 Armies 技术演示中使用的三角形数量示例。

在 Armies 演示(这是在 Unity 中构建的 64 位移动技术演示)中,摄像机是静态的,并且有许多动画角色。总的来说,每一帧大约渲染 210,000 个三角形。此三角形数量使演示能够以大约 30 帧/秒 (FPS) 的速度稳定运行。

图 5. 来自 The Armies 技术演示的渲染示例,显示了使用的三角形数量。

场景中最大的物体,即炮塔,大约有 3,000 个三角形,因为它们占据了屏幕的大部分区域。

每个角色大约使用 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 使用情况。

On the left, there's the robot with the most detail and largest number of triangles. To the right, the robot is further away, has less detail, and uses fewer triangles.

图 12. LOD 变化时使用的顶点数对比。

在图 12 中,很难看出由 200 个三角形或 2000 个三角形组成的相同物体在远处的区别。包含更多三角形的物体增加了高资源成本,但在远距离观看时不会改善外观。

图 13. 具有不同三角形数量的远距离模型对比。

LOD 作为一个概念也可以应用于着色器复杂度和纹理分辨率。在较低的 LOD 下,可以使用不同的材质,这些材质具有更简单的着色器和更少的纹理。您还应该确保纹理具有 mipmaps,以便将较低分辨率的纹理级别应用于远处的物体。这些措施将提高性能,但会以增加数据大小为代价。

我们不建议在摄像机和物体静止的任何游戏中使用 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 岛的分割和法线贴图的质量。

An example of a smoothing group. On the left, the robot has a smoothing group applied.

图 17. 模型在使用和未使用平滑组时的对比。

如果在 3D 模型上实现平滑组,则必须从 3D 软件中导出并导入到引擎中。

网格拓扑

创建新的 3D 资源时,请确保其具有整洁的拓扑结构。干净的拓扑结构对于角色和其他需要动画和变化的对象至关重要。拓扑结构不需要完美。请记住,最终用户不会看到线框,并且纹理和材质将对模型的外观产生更大的影响。

图 18. 来自 Armies 技术演示的岩石的拓扑结构、线框和最终版本。

形状夸张

您可以夸大一些形状,使您的模型更容易理解。这在很大程度上取决于您游戏的类型和风格。由于移动设备屏幕很小,因此可能难以捕捉某些非常小的形状。夸大这些形状可以帮助用户即使在远处也能看到形状。

例如,您可以使角色的手更大,以便更容易看到。

图 19. 示例模型,显示了为了更好地可见性而夸大的比例。