版本:Unity 6 (6000.0)
语言:English
将着色器关键字添加到 Inspector 窗口
内置关键字

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

检查关键字是否启用或禁用

当具有相同名称的全局和局部着色器在 GPU 上运行的程序。 更多信息
参见 词汇表
关键字处于不同的状态时,Unity 使用 LocalKeywordisOverridable 属性来确定该关键字对于单个材质或计算着色器是启用还是禁用。如果关键字以全局范围声明,则 isOverridabletrue;如果以局部范围声明,则为 false

  • isOverridabletrue 时:如果存在具有相同名称的全局关键字且已启用,则 Unity 使用全局关键字的状态。否则,Unity 使用局部关键字的状态。
  • isOverridablefalse 时:Unity 始终使用局部关键字的状态。

因此,要了解着色器关键字对于单个材质或计算着色器是启用还是禁用,必须检查 isOverridable 属性的状态以及全局和/或局部关键字状态。

此示例演示如何检查 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);
            }            
        }
    }
}

启用和禁用着色器关键字

要检查局部关键字是否已为图形着色器启用,请使用 Material.IsKeywordEnabledMaterial.EnableKeyword。对于计算着色器,请使用 ComputeShader.IsKeywordEnabledComputeShader.EnableKeyword

要检查全局关键字是否已启用,请使用 Shader.IsKeywordEnabledShader.EnableKeywordComputeShader.enabledKeywords

要启用或禁用图形着色器的局部着色器关键字,请使用 Material.SetKeywordMaterial.EnableKeywordMaterial.DisableKeyword。对于计算着色器,请使用 ComputeShader.SetKeywordComputeShader.EnableKeywordComputeShader.DisableKeyword

要启用或禁用全局着色器关键字,请使用 Shader.SetKeywordComputeShader.EnableKeywordComputeShader.DisableKeyword

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

注意:当启用或禁用与着色器变体一起使用的关键字时,Unity 会使用不同的着色器变体。在运行时更改着色器变体可能会影响性能。如果关键字的更改需要首次使用变体,则在图形驱动程序准备着色器程序时可能会导致卡顿。对于大型或复杂的着色器,或者如果全局关键字状态更改影响多个着色器,这可能是一个特殊的问题。为避免这种情况,如果将关键字与着色器变体一起使用,请确保在着色器加载和预热策略中考虑关键字变体。有关更多信息,请参阅 着色器加载

检查是否为动态分支声明了关键字

在 Unity 中,可以将着色器关键字与着色器变体一起使用,也可以与动态分支一起使用。声明关键字时由您决定。

LocalKeywordisDynamic 属性指示是否在着色器源文件中为使用动态分支声明了该关键字。如果为使用动态分支声明了该关键字,则为 true;如果为使用着色器变体声明了该关键字,则为 false

其他资源

将着色器关键字添加到 Inspector 窗口
内置关键字