Version: Unity 6.0 (6000.0)
语言 : 中文
检查您有多少着色器变体
默认着色器关键字

剥离着色器变体

您可以阻止编译着色器变体。这就是所谓的剥离 (stripping)。剥离不需要的变体可以大大减少构建时间、文件大小、着色器加载时间和运行时内存使用量。在较大的项目或具有复杂着色器的项目中,这是一个非常重要的考虑因素。

如果剥离了材质在运行时需要的着色器变体,Unity 会尝试选择可用的类似着色器变体。为了避免这种情况,可以使用以下方法:

  • 如果使用 shader_feature 关键字,请勿使用该关键字来更改在运行时执行的代码分支。
  • 查看现有的着色器变体,以帮助您了解材质在运行时需要的着色器变体和关键字组合。
  • 将着色器添加到图形设置 (Graphics Settings) 中的始终包含的着色器 (Always Included Shaders) 列表中。

在声明着色器关键字时限制着色器变体

着色器关键字的声明方式会限制其产生的变体数量:

  • 尽可能使用 shader_feature 而不是 multi_compile - 请参阅着色器中的条件
  • 确保不使用 multi_compile 来定义未使用的关键字。

有关在手动编码着色器中声明关键字的信息,请参阅在 HLSL 中声明和使用着色器关键字。有关在 Shader Graph 中声明关键字的信息,请参阅 Shader Graph:黑板 (Blackboard)

指明哪些着色器关键字会影响哪个着色器阶段

在声明关键字时,Unity 会假定着色器的所有阶段都包含该关键字的条件代码。

您可以添加以下后缀来指明仅某些阶段包含关键字的条件代码,这样 Unity 就不会生成不必要的着色器变体。

  • _vertex
  • _fragment
  • _hull
  • _domain
  • _geometry

例如,使用 #pragma shader_feature_fragment RED GREEN BLUE 表示仅在片元阶段使用 3 个关键字来创建条件代码。

无法将这些后缀添加到 #pragma dynamic_branch,因为 dynamic_branch 不会创建变体。

根据图形 API,这些后缀的行为可能不同或无效。例如:

  • 这些后缀对 OpenGL、OpenGL ES 或 Vulkan 没有影响。
  • _geometry_raytracing 后缀对 Metal 没有影响。Metal 会将_vertex_hull_domain视为单个阶段。

使用预处理器宏按平台限制变体

在 Unity 2021.3 及更高版本中,可以使用目标平台预处理器宏来创建条件着色器代码,因此可以在内存有限的平台上限制变体。

代码示例会执行以下操作:

  • 如果为 SHADER_API_DESKTOP 平台进行构建,Unity 会为每种可能的关键字组合构建变体。
  • 如果为其他平台进行构建,Unity 仅会针对构建中的材质所使用的关键字组合构建变体。
#ifdef SHADER_API_DESKTOP
   #pragma multi_compile _ RED GREEN BLUE WHITE
#else
   #pragma shader_feature RED GREEN BLUE WHITE
#endif

您可以使用目标平台预处理器宏在 shader_featuremulti_compiledynamic_branch 之间进行选择。有关何时使用各类条件的更多信息,请参阅着色器条件

创建用户控制的质量设置

在为内存有限的游戏主机和移动平台进行构建时,可以通过仅允许用户在少量的质量设置之间进行切换来限制着色器变体。

例如,如果使用关键字 DYNAMIC_LIGHTINGSOFT_SHADOWSHIGH_QUALITY_LIGHTMAPS,则可以创建以下内容:

  • 启用 DYNAMIC_LIGHTING 的“低质量”设置。
  • 启用 DYNAMIC_LIGHTINGSOFT_SHADOWSHIGH_QUALITY_LIGHTMAPS 的“高质量”设置。

这意味着,Unity 在 DYNAMIC_LIGHTING 关闭时不会为其创建着色器变体,同时也避免了这 3 个关键字开关状态下可能产生的多种不同组合。

您可以使用目标平台预处理器宏在内存有限的平台上有条件地创建更少的质量设置和更少的变体。例如,以下代码示例将允许用户在 SHADER_API_DESKTOP 平台上在 8 种设置排列间进行切换,但在 SHADER_API_MOBILE 平台上只能在 2 种排列间进行切换。

#if SHADER_API_DESKTOP
   #pragma multi_compile SHADOWS_LOW SHADOWS_HIGH
   #pragma multi_compile REFLECTIONS_LOW REFLECTIONS_HIGH
   #pragma multi_compile CAUSTICS_LOW CAUSTICS_HIGH
#elif SHADER_API_MOBILE
   #pragma multi_compile QUALITY_LOW QUALITY_HIGH
   #pragma shader_feature CAUSTICS // Uses shader_feature, so Unity strips variants that use CAUSTICS if there are no Materials that use the keyword at build time.
#endif

剥离 Editor UI 中的着色器变体

Unity Editor__ UI__(即用户界面,User Interface)让用户能够与您的应用程序进行交互。Unity 目前支持三种 UI 系统。更多信息
See in Glossary
中有多个位置可以配置着色器剥离:

  • 图形设置 (Graphics Settings) 窗口中,配置着色器剥离 (Shader stripping) 部分中的设置:

  • 确保始终包含的着色器 (Always-included shaders) 设置下不含任何不必要的着色器。

  • 剥离与 GPU 实例化、光照贴图和雾效相关的变体。

  • 在内置渲染管线中,如果层设置 (Tier settings) 不同并不重要,请确保它们彼此相同。有关更多信息,请参阅图形层

  • 在通用渲染管线 (URP) 中,禁用 URP 资源中未使用的功能。有关更多信息,请参阅着色器剥离

如果使用通用渲染管线,还可以执行以下操作:

如果使用高清渲染管线,还可以执行以下操作:

使用 Editor 脚本剥离着色器变体

对于无法通过其他方式剥离的着色器变体,可以在 Editor 脚本中使用以下 API 来执行构建时剥离:

有关此主题的更多信息,请参阅剥离可编程着色器变体

检查您有多少着色器变体
默认着色器关键字