当您声明一组关键字时,您选择是否将其与着色器变体根据着色器关键字及其状态的特定组合,Unity 生成的着色器程序的版本。一个着色器对象可以包含多个着色器变体。更多信息
参见 术语表 或与 动态分支 一起使用。
#define
预处理器指令。是否选择“多编译”或“着色器功能”取决于您如何使用关键字。如果您使用关键字配置项目中的材质并且不从 C# 脚本一段代码,允许您创建自己的组件、触发游戏事件、随时间推移修改组件属性以及以任何您喜欢的方式响应用户输入。更多信息
参见 术语表 在运行时更改其值,则应使用“着色器功能”来减少项目中着色器关键字和变体的数量。如果您在运行时使用 C# 脚本启用和禁用关键字,则应使用“多编译”以防止错误地删除变体。有关着色器删除的更多信息,请参见 着色器变体删除。
着色器中的条件语句没有“一刀切”的方法,您应该考虑每种方法在给定着色器、给定项目中的优缺点。
使用哪种条件语句取决于您何时需要着色器切换到不同的代码分支
如果您不需要着色器在运行时切换到不同的代码分支,则可以使用 Unity 仅在您编辑时评估的条件语句。
例如,您可以在材质的 检查器一个 Unity 窗口,显示有关当前选定的游戏对象、资源或项目设置的信息,允许您检查和编辑值。更多信息
参见 术语表 窗口中设置一个属性,以使着色器执行以下操作
如果您使用这种方法,着色器代码编写和维护起来更简单,并且不太可能影响构建时间、文件大小和性能。
为此,请使用以下方法之一
如果您使用shader_feature
关键字定义,Unity 会保留构建中材质使用的着色器变体,并删除(“剥离”)其他着色器变体。这可以缩短构建时间并减小文件大小。
避免在运行时使用 C# 脚本启用或禁用shader_feature
关键字,因为如果材质使用缺少的着色器变体,Unity 会改为选择其他可用的变体。如果您确实需要在运行时启用或禁用关键字,请使用以下方法之一来确保构建包含您需要的所有变体
如果您需要使用 C# 脚本使着色器在运行时切换到不同的代码分支,则可以使用 Unity 在您编辑时和运行时都评估的条件语句。
例如,您可以使用 C# 脚本使着色器执行以下操作
为此,请使用以下方法之一
如果您使用multi_compile
关键字定义,Unity 会为着色器代码分支的每种可能组合构建一个着色器变体,包括构建中材质未使用的组合。这意味着您可以在运行时启用和禁用关键字,但也可能会大大增加构建时间、文件大小、加载时间和内存使用量。参见 着色器变体。
动态分支不会创建着色器变体,但可能意味着您的着色器在 GPU 上运行速度较慢,尤其是在以下任一情况为真时
您可以 检查您有多少个着色器变体,以查看您是否可以在不影响 GPU 性能的情况下使用动态分支。有关动态分支的优缺点的更多信息,请参见 着色器分支。