在内置 渲染管线一系列将场景内容显示在屏幕上的操作。 Unity 允许您从预构建的渲染管线中选择,或编写自己的渲染管线。 更多信息
参见 术语表 中,您可以使用 **图形层级** 为在不同功能的硬件上运行的应用程序应用不同的图形设置。您可以使用 Unity 的内置 **层级设置** 来配置通用设置,或者您可以在自己的 着色器在 GPU 上运行的程序。 更多信息
参见 术语表 代码或 C# 代码中定义自定义行为。
注意: 此功能仅在内置渲染管线中受支持。在其他渲染管线中,Unity 仍然在启动时检查硬件并将其值存储在 Graphics.activeTier 中;但是,此字段的值无效,Unity 不会执行与图形层级相关的任何其他操作。
当 Unity 首次加载您的应用程序时,它会检查硬件和图形 API 并确定当前环境对应于哪个图形层级。
图形层级为
值 | 硬件 | 对应的 GraphicsTier 枚举值 | 对应的 着色器关键字 |
---|---|---|---|
1 | iOS:iPhone 5S 之前的 iPhone(不包括 5S,但包括 5C)、iPod 第 5 代及更早版本、iPad 第 4 代及更早版本、iPad mini 第一代 桌面:DirectX 9 XR:HoloLens |
层级 1 | UNITY_HARDWARE_TIER1 |
2 | Android:支持 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 |
在内置渲染管线中,Unity 可以生成与图形层级相对应的 着色器变体根据着色器关键字及其状态的特定组合,Unity 生成的着色器程序版本。着色器对象可以包含多个着色器变体。 更多信息
参见 术语表。
注意: 这些层级着色器变体的工作方式与常规着色器变体不同。在运行时,当 Unity 将 着色器对象Shader 类的实例,着色器对象是着色器程序和 GPU 指令的容器,以及告诉 Unity 如何使用它们的 information。 将它们与材质一起使用来确定场景的外观。 更多信息
参见 术语表 加载到 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 会识别并 对重复 的层级着色器变体进行去重。这意味着,如果两个层级的设置相同(例如,如果层级 1 不同,但层级 2 和层级 3 相互相同),那么这些变体不会增加应用程序的文件大小,并且 Unity 加载层级变体的方式意味着它们不会影响加载时间或运行时内存使用。但是,这仍然会导致冗余编译工作。
如果您想为不同的层级使用不同的设置,但您也知道这会导致冗余工作 - 例如,如果您知道您的应用程序只会运行在层级 1 和层级 2 设备上 - 您可以使用脚本从编译中去除不需要的层级变体,就像对任何其他变体一样。有关更多信息,请参见 着色器变体去除。
除了自动行为外,您还可以强制 Unity 在每个着色器基础上生成层级着色器变体。如果您在 HLSL 代码中使用这些常量,并且您想确保 Unity 将编译所需的变体,无论当前构建的层级设置是否彼此不同,这都是很有用的
要手动强制 Unity 为给定的着色器生成层级着色器变体,请在 HLSL 代码中使用 #pragma hardware_tier_variants
预处理器指令,并指定要为其生成每个层级变体的图形 API
#pragma hardware_tier_variants gles3
有关您可以与该指令一起使用的有效图形 API 名称列表,请参见 定位图形 API。有关 #pragma
指令的一般信息,请参见 pragma 指令。