几何体

在最大数量的设备上运行良好的 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 下,可以使用不同的材质,这些材质使用更简单的着色器和更少的纹理。您还应该确保纹理具有 mipmap,以便将较低分辨率的纹理级别应用于远处的物体。这些措施将提高性能,但代价是增加数据的大小。

我们不建议在摄像机和物体静止的任何游戏中使用 LOD。LOD 最大的好处是用于靠近和远离摄像机的物体。静态物体不会移动,因此 LOD 没有好处。

图 14. 来自 Armies 技术演示的静态摄像机场景,未使用 LOD。

LOD 比例

减少 LOD 三角形数量时,请使用一致的比例。我们建议您每个级别减少 50% 的三角形。

不要在简单物体上使用 LOD。三角形数量已经很少的物体无法从 LOD 中获益。来自 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。
    • 您可以使用 Simplygon 或 InstaLOD 等 LOD 生成软件。
    • 一些游戏引擎具有自动 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. 显示了为了更好地可见性而夸大的比例的示例模型。