您可以阻止着色器变体Unity 根据着色器关键字及其状态的特定组合生成的着色器程序版本。一个着色器对象可以包含多个着色器变体。更多信息
参见 术语表 被编译。这称为 **剔除**。剔除不需要的变体可以大大减少构建时间、文件大小、着色器在 GPU 上运行的程序。更多信息
参见 术语表 加载时间和运行时内存使用量。在大型项目或具有复杂着色器的项目中,这是一个非常重要的考虑因素。
如果您剔除了材质在运行时所需的着色器变体,Unity 会尝试选择一个可用的类似着色器变体。为避免这种情况,请使用以下方法
shader_feature
关键字,请不要使用该关键字来更改在运行时执行哪个代码分支。声明着色器关键字的方式可以限制它们生成的变体数量
shader_feature
而不是 multi_compile
- 请参阅 着色器中的条件语句。multi_compile
定义未使用的关键字。有关在手动编写的着色器中声明关键字的信息,请参阅 在 HLSL 中声明和使用着色器关键字。有关在 Shader Graph 中声明关键字的信息,请参阅 Shader Graph:黑板。
当您 声明一个关键字 时,Unity 假设着色器的所有阶段都包含该关键字的条件代码。
您可以添加以下后缀来指示只有某些阶段包含该关键字的条件代码,以便 Unity 不会生成不需要的着色器变体。
_vertex
_fragment
_hull
_domain
_geometry
例如,使用 #pragma shader_feature_fragment RED GREEN BLUE
来指示您仅在片段阶段使用这 3 个关键字创建条件代码。
您不能将这些后缀添加到 #pragma dynamic_branch
,因为 dynamic_branch
不会创建变体。
这些后缀的行为可能会有所不同或没有效果,具体取决于 图形 API。例如
_geometry
和 _raytracing
后缀对 Metal 没有影响。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
。这意味着当 DYNAMIC_LIGHTING
关闭或这 3 个关键字的各种开/关组合时,Unity 不会创建着色器变体。
您可以使用 目标平台预处理器宏 有条件地创建更少的质量设置和更少的变体,以用于内存有限的平台。例如,以下代码示例将允许用户在 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
在 Unity 编辑器 UI(用户界面) 允许用户与您的应用程序交互。Unity 目前支持三种 UI 系统。更多信息
参见 术语表 中有几个地方可以配置着色器剔除
在 图形设置窗口 中,配置 **着色器剔除** 部分中的设置
确保 **始终包含的着色器** 设置中不包含任何不需要的着色器。
剔除与 GPU 实例化、光照贴图和雾相关的变体。
在内置 渲染管线一系列操作,用于获取场景的内容并在屏幕上显示它们。Unity 允许您从预构建的渲染管线中选择,或编写您自己的渲染管线。更多信息
参见 术语表 中,如果您的层级设置不必不同,请确保它们彼此相同。有关更多信息,请参阅 图形层级。
在通用渲染管线 (URP) 中,禁用 URP 资源中未使用的功能。有关更多信息,请参阅 着色器剔除。
如果您使用通用渲染管线,您还可以执行以下操作
如果您使用高清渲染管线,您还可以执行以下操作
对于无法通过其他方式剔除的着色器变体,您可以在编辑器脚本中使用以下 API 执行构建时剔除
有关此主题的更多信息,请参阅 剔除脚本化着色器变体
Did you find this page useful? Please give it a rating:
Thanks for rating this page!
What kind of problem would you like to report?
Thanks for letting us know! This page has been marked for review based on your feedback.
If you have time, you can provide more information to help us fix the problem faster.
Provide more information
You've told us this page needs code samples. If you'd like to help us further, you could provide a code sample, or tell us about what kind of code sample you'd like to see:
You've told us there are code samples on this page which don't work. If you know how to fix it, or have something better we could use instead, please let us know:
You've told us there is information missing from this page. Please tell us more about what's missing:
You've told us there is incorrect information on this page. If you know what we should change to make it correct, please tell us:
You've told us this page has unclear or confusing information. Please tell us more about what you found unclear or confusing, or let us know how we could make it clearer:
You've told us there is a spelling or grammar error on this page. Please tell us what's wrong:
You've told us this page has a problem. Please tell us more about what's wrong:
Thank you for helping to make the Unity documentation better!
Your feedback has been submitted as a ticket for our documentation team to review.
We are not able to reply to every ticket submitted.