Version: 6000.3
语言: 中文
内置渲染管线中的图形质量设置
在内置渲染管线中配置图形层

内置渲染管线中的图形层

在内置渲染管线获取场景内容并将其显示在屏幕上的一系列作。Unity 允许您从预构建的渲染管线中进行选择,或编写自己的渲染管线。更多信息
请参阅术语表
,当应用程序在具有不同功能的硬件上运行时,可以使用图形层应用不同的图形设置。您可以使用 Unity 的内置层设置来配置通用设置,也可以在自己的自定义行为中定义自定义行为着色器在 GPU 上运行的程序。更多信息
请参阅术语表
代码或 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
一级 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 对象Shader 类的实例,Shader 对象是着色器程序和 GPU 指令的容器,以及告诉 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 为给定着色器生成层着色器变体,请使用#pragma hardware_tier_variantspreprocessor 指令,并指定要为其生成每层变体的图形 API:

#pragma hardware_tier_variants gles3

有关可与此指令一起使用的有效图形 API 名称的列表,请参阅定位图形 API。有关一般信息#pragma指令,请参阅编译指示。

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