包含此页的版本:
不含此页的版本:
在内置渲染管线获取场景内容并将其显示在屏幕上的一系列作。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 会识别并删除相同的层着色器变体。这意味着,如果两个层的设置相同(例如,如果第 1 层不同,但第 2 层和第 3 层彼此相同),则这些变体不会增加应用程序的文件大小,并且 Unity 加载层变体的方式意味着它们不会影响加载时间或运行时内存使用。但是,这仍然会导致冗余的编译工作。
如果要对不同的层使用不同的设置,但您也知道这将导致冗余工作(例如,如果您知道您的应用程序只能在第 1 层和第 2 层设备上运行),则可以使用脚本从编译中剥离不需要的层变体,与任何其他变体相同。有关详细信息,请参阅着色器变体剥离。
除了自动行为之外,您还可以强制 Unity 按着色器生成层着色器变体。如果您在 HLSL 代码中使用这些常量,并且希望确保 Unity 将编译所需的变体,而不管当前版本的层设置是否彼此不同,这将非常有用
要手动强制 Unity 为给定着色器生成层着色器变体,请使用#pragma hardware_tier_variantspreprocessor 指令,并指定要为其生成每层变体的图形 API:
#pragma hardware_tier_variants gles3
有关可与此指令一起使用的有效图形 API 名称的列表,请参阅定位图形 API。有关一般信息#pragma指令,请参阅编译指示。