Unity3D:图形层

推荐:将NSDT场景编辑器加入你的3D工具链
3D工具集:NSDT简石数字孪生

图形层

在内置渲染管线中,当应用程序在具有不同功能的硬件上运行时,可以使用图形层应用不同的图形设置。您可以使用 Unity 的内置层设置来配置通用设置,也可以在自己的着色器代码或 C# 代码中定义自定义行为。

注意:此功能仅在内置渲染管线中受支持。在其他渲染管线中,Unity 仍然会在启动时检查硬件并将其值存储在 Graphics.activeTier 中;但是,此字段的值不起作用,Unity 不会执行与图形层相关的任何其他操作。

图形层概述

当 Unity 首次加载应用程序时,它会检查硬件和图形 API,并确定当前环境对应于哪个图形层。

图形层包括:

价值硬件对应的图形层枚举值对应的着色器关键字
1Android:仅支持 OpenGL ES 2 的设备
iOS:iPhone 5S 之前的 iPhone(不包括 5S,但包括 5C)、第 5 代(含 5 代)、第 4 代 iPad、iPad mini 第一代
桌面:DirectX 9
XR:HoloLens
第 1 层UNITY_HARDWARE_TIER1
2Android:支持 OpenGL ES 3 的设备,支持 Vulkan
iOS 的设备:从 iPhone 5S 开始的 iPhone、iPad Air、iPad mini 第 2 代、iPod 第 6 代、AppleTV
WebGL:所有设备
第 2 层UNITY_HARDWARE_TIER2
3桌面: OpenGL, Metal, Vulkan, DirectX 11+第 3 层UNITY_HARDWARE_TIER3

将图形层与 C# 脚本结合使用

Unity 将当前图形层的值存储在 Graphics.activeTier 中,由 GraphicsTier 枚举表示。若要基于当前图形层添加自定义行为,可以针对此值进行测试。

要覆盖 的值,请直接设置该值。请注意,在 Unity 加载任何因图形层而异的着色器之前,您必须执行此操作。设置此值的好位置是在加载主场景之前在预加载场景中。Graphics.activeTier

层设置

在 Unity 编辑器中,可以配置层设置。层设置允许您启用或禁用每个层的图形功能。

层设置的工作原理是更改 Unity 内部着色器代码中的预处理器指令。这些更改会自动影响内置渲染管线(如标准着色器)的预生成着色器以及 Surface 着色器的内部着色器库代码。您还可以将代码添加到自己的手动编码着色器中,以根据层设置更改其行为。有关详细信息,请参阅图形层和着色器变体。#define

默认层设置适用于大多数用例。仅当遇到性能问题,或者希望在默认情况下未启用的低端设备上启用功能时,才应更改它们。

您可以为给定构建目标的每个图形层配置不同的层设置。您可以通过以下方式更改层设置:

  • 使用“设置”部分中的“图形设置”窗口。
  • 在编辑器脚本中使用以下 API:
  • 编辑器图形设置
  • 层设置

您可以在编辑器中测试层设置。为此,请导航到编辑图形层>然后选择您希望 Unity 编辑器使用的层。

图形层和着色器变体

在内置渲染管线中,Unity 可以生成与图形层对应的着色器变体。

注意:这些层着色器变体的工作方式与常规着色器变体不同。在运行时,当 Unity 将着色器对象加载到 CPU 内存中时,它仅加载活动层的变体;它不会加载其他层的变体。这有助于减少层变体对运行时的影响。

为了生成层着色器变体,Unity 将这组着色器关键字添加到所有图形着色器:

UNITY_HARDWARE_TIER1
UNITY_HARDWARE_TIER2
UNITY_HARDWARE_TIER3

可以在 HLSL 代码中使用这些关键字为较低或较高端的硬件编写条件行为,其方式与对任何着色器关键字的操作相同。例如:

#if UNITY_HARDWARE_TIER1
// Put code for tier 1 devices here
#else
// Put code for other devices here
#endif

有关在 HLSL 代码中使用着色器关键字的详细信息,请参阅在 HLSL 中声明和使用着色器关键字。

Unity 根据当前构建目标的层设置自动生成层着色器变体,如下所示:

  • 如果所有层的所有设置都相同,Unity 不会生成任何层着色器变体。
  • 如果不同层的任何设置有任何不同,Unity 将生成所有层着色器变体。

生成所有层着色器变体后,Unity 会识别相同的层着色器变体并删除重复数据。这意味着,如果两个层的设置相同(例如,如果第 1 层不同,但第 2 层和第 3 层彼此相同),则这些变体不会增加应用程序的文件大小,Unity 加载层变体的方式意味着它们不会影响加载时间或运行时内存使用情况。但是,这仍然会导致冗余的编译工作。

如果要对不同的层使用不同的设置,但又知道这将导致冗余工作(例如,如果您知道应用程序只能在第 1 层和第 2 层设备上运行),则可以使用脚本从编译中删除不需要的层变体,与任何其他变体相同。有关详细信息,请参阅着色器变体剥离。

除了自动行为之外,您还可以强制 Unity 基于每个着色器生成层着色器变体。如果在 HLSL 代码中使用这些常量,并且想要确定 Unity 将编译所需的变体,无论当前构建的层设置是否彼此不同,这将非常有用

要手动强制 Unity 为给定着色器生成层着色器变体,请在 HLSL 代码中使用预处理器指令,并指定要为其生成每层变体的图形 API:#pragma hardware_tier_variants

# pragma hardware_tier_variants gles3

3D建模学习工作室整理翻译,转载请注明出处!

上一篇:Unity3D:选择和配置渲染管线和光照解决方案 (mvrlink.com)

下一篇:Unity3D:内置渲染管线中的渲染路径 (mvrlink.com)

NSDT场景编辑器 | NSDT 数字孪生 | GLTF在线编辑器 | 3D模型在线转换 | UnrealSynth虚幻合成数据生成器 | 3D模型自动纹理化工具
2023 power by nsdt©鄂ICP备2023000829号