Version: Unity 6.0 (6000.0)
语言 : 中文
内置渲染管线中的图形质量设置
在内置渲染管线中配置图形层

内置渲染管线中的图形层

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

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

图形层概述

Unity 会在首次加载应用程序时检查硬件和图形 API,并决定当前环境对应的图形层。

图形层包括:

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

图形层和着色器变体

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

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

为了生成层着色器变体,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 代码中使用 #pragma hardware_tier_variants 预处理器指令,并指定要生成逐层变体的图形 API:

#pragma hardware_tier_variants gles3

如需了解适用于此指令的图形 API 名称列表,请参阅定位图形 API。如需了解关于 #pragma 指令的一般信息,请参阅 pragma 指令

内置渲染管线中的图形质量设置
在内置渲染管线中配置图形层