版本:Unity 6 (6000.0)
语言:English
着色器关键字基础
选择在着色器中使用哪种类型的关键字

着色器关键字作用域基础

当您声明一组关键字时,您可以选择该组中的关键字具有局部或全局作用域。这决定了您是否可以在运行时使用全局着色器在 GPU 上运行的程序。 更多信息
参见 词汇表
关键字覆盖此关键字的状态。

默认情况下,您声明具有全局作用域的关键字。这意味着您可以在运行时使用全局着色器关键字覆盖此关键字的状态。如果您声明具有局部作用域的关键字,则意味着您无法在运行时使用全局着色器关键字覆盖此关键字的状态。有关更多信息和代码示例,请参阅使用 C# 脚本的着色器关键字

注意:如果在着色器源文件及其依赖项中存在同名的关键字,则源文件中的关键字作用域将覆盖依赖项中的作用域。依赖项包括通过Fallback 命令包含的所有着色器,以及通过UsePass 命令包含的通道。

要设置此值,请参阅以下文档

着色器关键字和 C# 关键字

局部和全局着色器关键字

当 Unity 在 C# 中表示着色器关键字时,它使用了局部着色器关键字全局着色器关键字的概念。

局部着色器关键字包含您在着色器源文件中声明的所有关键字。局部着色器关键字会影响单个着色器或计算着色器。局部关键字可以具有局部或全局作用域,这会影响全局着色器关键字是否可以覆盖它们。

全局着色器关键字充当局部着色器关键字的覆盖。您不会在着色器源文件中声明这些关键字;它们仅存在于 C# 代码中。全局着色器关键字可以同时影响多个着色器和计算着色器。

局部着色器关键字

当您在着色器源文件中声明着色器关键字时,Unity 会在 C# 中使用LocalKeyword结构体表示它。这称为局部着色器关键字

LocalKeywordisOverridable属性指示该关键字是在源文件中使用全局作用域还是局部作用域声明的。如果该关键字使用全局作用域声明,则为true,因此可以被具有相同名称的全局着色器关键字覆盖。如果该关键字使用局部作用域声明,则为false,因此无法被具有相同名称的全局着色器关键字覆盖。

Unity 将影响着色器或计算着色器的所有局部着色器关键字存储在LocalKeywordSpace结构体中。对于图形着色器,您可以使用Shader.keywordSpace访问它。对于计算着色器,您可以使用ComputeShader-keywordSpace访问它。

全局着色器关键字

除了您在源文件中声明的局部着色器关键字之外,Unity 还维护一个单独的全局着色器关键字列表。您不会在着色器源文件中声明这些关键字;相反,它们是在 C# 中使用的局部着色器关键字的运行时覆盖。全局着色器关键字可以同时影响多个着色器和计算着色器。

Unity 使用GlobalKeyword结构体表示全局着色器关键字。

当您需要为许多材质和计算着色器启用或禁用相同的着色器关键字时,设置全局着色器关键字可能很方便。但是,它具有以下潜在缺点

  • 如果着色器意外定义了同名的关键字,则设置关键字的全局状态可能会导致意外后果。您可以通过声明具有局部作用域的关键字或以减少冲突可能性方式命名关键字来防止这种情况。
  • 当您创建一个新的GlobalKeyword时,Unity 会更新其在所有此时加载的着色器和计算着色器之间全局和局部关键字空间的内部映射。这可能是一个 CPU 密集型操作。为了减少此操作的影响,请尝试在应用程序启动后不久,在应用程序加载期间创建所有全局关键字。
着色器关键字基础
选择在着色器中使用哪种类型的关键字