有时,您想在不同的环境下对同一着色器执行不同的操作。例如,您可能只想为不同的材质配置不同的设置,为不同的硬件定义功能,或在运行时动态地改变着色器的行为。您可能还希望避免在不需要时执行计算密集型代码,比如纹理读取、顶点输入、插值器或循环。
您可以使用条件语句定义GPU仅在满足特定条件时才执行的行为。
要使用着色器中的条件语句,您可以使用以下方法
在着色器中使用条件语句没有“一刀切”的方法,您应考虑针对给定的着色器和项目,评估每种方法的优缺点。
使用哪种条件语句取决于何时需要着色器切换到不同的代码分支
如果您不需要着色器在运行时切换到不同的代码分支,您可以使用Unity在您编辑时才会评估的条件语句。
例如,您可以在材质的检查器一个Unity窗口,显示有关当前选中的GameObject、资产或项目设置的信息,允许您检查和编辑值。了解更多信息更多信息
在 词汇表 中查看窗口中设置一个属性,使着色器执行以下操作
使用这种方法,着色器代码更容易编写和维护,不太可能影响构建时间、文件大小和性能。
为此,您可以使用以下方法之一
如果您使用 shader_feature
关键字定义,Unity 会保留构建中 Materials 所使用的着色器变体,并移除(“剥离”)其他着色器变体。这有助于降低构建时间并减小文件大小。
请避免在运行时使用 C# 脚本来启用或禁用 shader_feature
关键字,因为如果 Material 使用了缺失的着色器变体,Unity 会选择其他可用的变体。如果您确实需要在运行时启用或禁用关键字,请使用以下方法之一确保您的构建包含所需的所有变体
如果您需要使用 C# 脚本来在运行时使着色器切换到不同的代码分支,您可以使用 Unity 在编辑和运行时都会评估的条件。
例如,您可以使用 C# 脚本使着色器执行以下操作
为此,您可以使用以下方法之一
如果您使用 multi_compile
关键字定义,Unity 会为每个可能的着色器代码分支组合构建着色器变体,包括构建中 Materials 没有使用的组合。这意味着您可以在运行时启用和禁用关键字,但这也可能大大增加构建时间、文件大小、加载时间和内存使用。有关更多信息,请参阅 着色器变体。
动态分支不会创建着色器变体,但可能会导致您的着色器在 GPU 上的运行速度变慢,尤其是如果以下任何情况成立时
您可以通过 检查您有多少个着色器变体 来确定您是否可以在不影响 GPU 性能的情况下使用动态分支。有关动态分支的优缺点,请参阅 着色器分支。