几何图形

能在最大数量设备上流畅运行的 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 位索引时超出支持的范围,将导致几何图形缺失或渲染不正确。

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

我们建议在前景对象上使用更多三角形,在背景对象上使用更少三角形。这对于具有静态相机视角 (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. Armies 技术演示的渲染示例,显示了所用三角形的数量。

场景中最大的对象(加农炮塔)大约有 3,000 个三角形,因为它们占据了屏幕的很大一部分。

每个角色大约使用 360 个三角形。因为它们数量众多且只能从远处看到,所以它们使用的三角形不多。从相机视角来看,它们看起来很合适。

图 6. Armies 技术演示中低三角形士兵的视图。

在重要区域使用三角形

顶点在移动平台上非常昂贵。为了避免浪费您的处理预算,请将顶点放置在有助于游戏视觉质量的区域。3D 对象上的小细节可能在游戏的最终屏幕上不可见。由于屏幕尺寸小和 3D 对象的放置,微小细节可能无法看到。

与其关注精细细节,不如关注有助于轮廓的大形状。下图是关注轮廓的示例

图 7. 机器人周围的红线代表其轮廓。

我们建议您在相机视角不经常看到的区域使用较少的三角形。例如,汽车底部或衣柜背面。如果对象的一部分永远不会被看到,请删除该部分对象。

删除对象的一部分必须谨慎进行,并且可能会限制对象的可重用性。例如,如果删除桌子网格的底部,如果桌子倒置,用户将注意到已删除的部分。

不要使用高密度三角形网格来建模小细节。使用纹理和法线贴图进行精细细节处理。以下示例显示了使用和不使用法线贴图的相同网格。

图 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 个三角形或 2,000 个三角形组成)之间的区别。三角形数量更多的对象会增加高资源成本,但在远处观看时并不会改善外观。

图 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)内使用修改器。
    • 您可以使用 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. 显示夸张比例以获得更好可见度的示例模型。