包含此页的版本:
不含此页的版本:
您可以预防着色器变体Unity 根据着色器关键字及其状态的特定组合生成的着色器程序的版本。一个着色器对象可以包含多个着色器变体。更多信息
请参阅术语表从编译中。这称为剥离。剥离不需要的变体可以大大减少构建时间、文件大小、着色器在 GPU 上运行的程序。更多信息
请参阅术语表加载时间和运行时内存使用情况。在较大的项目或具有复杂着色器的项目中,这是一个非常重要的考虑因素。
如果剥离材质在运行时需要的着色器变体,Unity 会尝试选择可用的类似着色器变体。若要避免这种情况,请使用以下方法:
shader_feature关键字,请勿使用关键字更改在运行时执行的代码分支。声明着色器关键字的方式可以限制它们生成的变体数:
shader_feature而不是multi_compile如果可能,请参阅 Unity 如何编译分支着色器。multi_compile.有关在手动编码着色器中声明关键字的信息,请参阅在 HLSL 中声明和使用着色器关键字。有关在着色器图表中声明关键字的信息,请参阅着色器图表:黑板。
声明关键字时,Unity 会假定着色器的所有阶段都包含该关键字的条件代码。
您可以添加以下后缀,以指示只有某些阶段包含关键字的条件代码,以便 Unity 不会生成不需要的着色器变体。带有这些后缀的关键字有时称为特定阶段关键字。
_vertex_fragment_hull_domain_geometry例如,使用#pragma shader_feature_fragment RED GREEN BLUE指示您仅在片段阶段使用 3 个关键字创建条件代码。
您不能将这些后缀添加到#pragma dynamic_branch因为dynamic_branch不会创建变体。
这些后缀的行为可能不同或无效,具体取决于图形 API。例如:
_geometry和_raytracing后缀对 Metal 没有影响。金属零食_vertex,_hull和_domain作为单个阶段。在 Unity 2021.3 及更高版本中,您可以使用目标平台预处理器宏创建条件着色器代码,以便限制内存有限平台上的变体。
代码示例执行以下作:
SHADER_API_DESKTOP平台,Unity 会为每个可能的关键字组合构建变体。#ifdef SHADER_API_DESKTOP
#pragma multi_compile _ RED GREEN BLUE WHITE
#else
#pragma shader_feature RED GREEN BLUE WHITE
#endif
您可以使用目标平台预处理器宏在shader_feature,multi_compile和dynamic_branch.有关何时使用每种类型的条件的详细信息,请参阅着色器条件。
当你为内存有限的主机和移动平台进行构建时,你可以通过仅允许用户在少量质量设置之间切换来限制着色器变体。
例如,如果您使用关键字DYNAMIC_LIGHTING,SOFT_SHADOWS和HIGH_QUALITY_LIGHTMAPS,您可以创建以下内容:
DYNAMIC_LIGHTING.DYNAMIC_LIGHTING,SOFT_SHADOWS和HIGH_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
在 Unity 编辑器 UI 中,您可以在多个位置配置着色器剥离:
在“图形设置”窗口中,配置“着色器剥离”部分中的设置:
确保“始终包含的着色器”设置中不包含不需要的着色器。
与GPU实例化、光照贴图和雾相关的条形变体。
在内置渲染管线(Render Pipeline) 获取场景内容并将其显示在屏幕上的一系列作。Unity 允许您从预构建的渲染管道中进行选择,或编写自己的渲染管道。更多信息
请参阅术语表,如果层设置不同并不重要,请确保它们彼此相同。有关详细信息,请参阅图形层。
在通用渲染管线(URP)中,禁用URP资产中未使用的功能。有关详细信息,请参阅着色器剥离。
如果使用通用渲染管线,还可以执行以下作:
如果你使用高清渲染管线,你还可以执行以下作:
对于无法以其他方式剥离的着色器变体,可以在编辑器脚本中使用以下 API 来执行构建时剥离:
有关此主题的更多信息,请参阅剥离可编写脚本的着色器变体