Version: 6000.3
语言: 中文
在编辑器中切换着色器关键字
添加内置关键字集

在脚本中切换着色器关键字

使用 C# 脚本启用或禁用关键字,并检查关键字是否具有局部或全局作用域。

切换关键字

要更改关键字的状态,请使用Material应用程序接口。例如Material.EnableKeyword().

在多个着色器中切换关键字

默认情况下,HLSL着色器在 GPU 上运行的程序。更多信息
请参阅术语表
关键字具有全局作用域。因此,若要在多个着色器之间切换具有相同名称的关键字,可以使用 C# 全局关键字对象。

按着这些次序:

  1. 创建一个GlobalKeyword对象,与要启用或禁用的关键字同名。
  2. 使用Shader用于启用或禁用全局关键字的 API,该关键字会调整所有着色器中具有相同名称的 HLSL 关键字。例如Shader.EnableKeyword.

注意:当您创建新的GlobalKeyword,Unity 会更新其所有加载着色器的全局和本地关键字空间之间的内部映射。这可能是 CPU 密集型作。若要减少此作的影响,请尝试在应用程序启动后,在加载应用程序时创建所有全局关键字。

防止全局关键字对象影响着色器

若要防止全局关键字对象影响着色器关键字,请为着色器关键字提供局部作用域而不是全局作用域。

_local添加到关键字指令。例如:

#pragma shader_feature_local RED

现在着色器不受全局Shader蜜蜂属。您只能使用Material像 APIMaterial.EnableKeyword().

注意:如果在着色器中使用 FallbackUsePass,则其关键字范围将替代引用着色器的关键字范围。

检查关键字的范围

要检查着色器中关键字的作用域,请在“项目”窗口中选择着色器,然后在检查器一个 Unity 窗口,显示有关当前选定游戏对象、资产或项目设置的信息,允许您检查和编辑值。更多信息
请参阅术语表
窗口打开关键字下拉列表。Unity 在 Overridable 下显示具有全局作用域的关键字,在 Not Overridable 下显示具有局部作用域的关键字。

您还可以使用 LocalKeyword.isOverridable API。

注意:术语LocalLocalKeyword表示 API 表示 HLSL 关键字,而不是 C# 关键字对象。它与关键字的范围无关。

要检查关键字是否已启用,请执行以下作:

  • 如果关键字是可重写的,请检查是否存在具有相同名称的 C# 全局关键字。如果是这样,请使用Shader应用程序接口。例如Shader.IsKeywordEnabled().
  • 如果关键字不可覆盖,请使用Material应用程序接口。例如Material.IsKeywordEnabled().

以下代码演示了如何检查 Unity 是否将关键字视为材质已启用或禁用:

using UnityEngine;
using UnityEngine.Rendering;

public class KeywordExample : MonoBehaviour
{
    public Material material;

    void Start()
    {
        CheckShaderKeywordState();
    }

    void CheckShaderKeywordState()
    {
        // Get the instance of the Shader class that the material uses
        var shader = material.shader;

        // Get all the local keywords that affect the Shader
        var keywordSpace = shader.keywordSpace;

        // Iterate over the local keywords
        foreach (var localKeyword in keywordSpace.keywords)
        {
            // If the local keyword is overridable (i.e., it was declared with a global scope),
            // and a global keyword with the same name exists and is enabled,
            // then Unity uses the global keyword state
            if (localKeyword.isOverridable && Shader.IsKeywordEnabled(localKeyword.name))
            {
                Debug.Log("Local keyword with name of " + localKeyword.name + " is overridden by a global keyword, and is enabled");
            }
            // Otherwise, Unity uses the local keyword state
            else
            {
                var state = material.IsKeywordEnabled(localKeyword) ? "enabled" : "disabled";
                Debug.Log("Local keyword with name of " + localKeyword.name + " is " + state);
            }            
        }
    }
}

使用命令缓冲区更改关键字

要使用命令缓冲区启用或禁用本地或全局关键字,请使用CommandBuffer.EnableKeywordCommandBuffer.DisableKeyword.

其他资源

在编辑器中切换着色器关键字
添加内置关键字集