Version: 6000.3
语言: 中文
检查你有多少个着色器变体
默认着色器关键字

条带着色器变体

您可以预防着色器变体Unity 根据着色器关键字及其状态的特定组合生成的着色器程序的版本。一个着色器对象可以包含多个着色器变体。更多信息
请参阅术语表
从编译中。这称为剥离。剥离不需要的变体可以大大减少构建时间、文件大小、着色器在 GPU 上运行的程序。更多信息
请参阅术语表
加载时间和运行时内存使用情况。在较大的项目或具有复杂着色器的项目中,这是一个非常重要的考虑因素。

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

  • 如果您使用shader_feature关键字,请勿使用关键字更改在运行时执行的代码分支。
  • 检查你拥有哪些着色器变体,以帮助你了解材质在运行时需要哪些着色器变体和关键字组合。
  • 将着色器添加到“图形设置”中的“始终包含的着色器”列表中。

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

声明着色器关键字的方式可以限制它们生成的变体数:

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

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

声明关键字时,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 没有影响。金属零食_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_feature,multi_compiledynamic_branch.有关何时使用每种类型的条件的详细信息,请参阅着色器条件

创建用户控制的质量设置

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

例如,如果您使用关键字DYNAMIC_LIGHTING,SOFT_SHADOWSHIGH_QUALITY_LIGHTMAPS,您可以创建以下内容:

  • 打开的“低质量”设置DYNAMIC_LIGHTING.
  • 打开的“高质量”设置DYNAMIC_LIGHTING,SOFT_SHADOWSHIGH_QUALITY_LIGHTMAPS.

这意味着 Unity 不会为DYNAMIC_LIGHTING当它关闭时,或者 3 个关键字的许多不同组合打开和关闭。

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

#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

编辑器UI中的条带着色器变体

在 Unity 编辑器 UI 中,您可以在多个位置配置着色器剥离:

  • “图形设置”窗口中,配置“着色器剥离”部分中的设置:

  • 确保“始终包含的着色器”设置中不包含不需要的着色器。

  • 与GPU实例化、光照贴图和雾相关的条形变体。

  • 在内置渲染管线(Render Pipeline) 获取场景内容并将其显示在屏幕上的一系列作。Unity 允许您从预构建的渲染管道中进行选择,或编写自己的渲染管道。更多信息
    请参阅术语表
    ,如果层设置不同并不重要,请确保它们彼此相同。有关详细信息,请参阅图形层

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

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

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

使用编辑器脚本的条带着色器变体

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

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

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