当具有相同名称的全局和局部着色器在 GPU 上运行的程序。 更多信息
参见 词汇表关键字处于不同的状态时,Unity 使用 LocalKeyword
的 isOverridable
属性来确定该关键字对于单个材质或计算着色器是启用还是禁用。如果关键字以全局范围声明,则 isOverridable
为 true
;如果以局部范围声明,则为 false
。
isOverridable
为 true
时:如果存在具有相同名称的全局关键字且已启用,则 Unity 使用全局关键字的状态。否则,Unity 使用局部关键字的状态。isOverridable
为 false
时: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.IsKeywordEnabled 或 Material.EnableKeyword。对于计算着色器,请使用 ComputeShader.IsKeywordEnabled 或 ComputeShader.EnableKeyword。
要检查全局关键字是否已启用,请使用 Shader.IsKeywordEnabled 或 Shader.EnableKeyword 或 ComputeShader.enabledKeywords。
要启用或禁用图形着色器的局部着色器关键字,请使用 Material.SetKeyword、Material.EnableKeyword 或 Material.DisableKeyword。对于计算着色器,请使用 ComputeShader.SetKeyword、ComputeShader.EnableKeyword 或 ComputeShader.DisableKeyword。
要启用或禁用全局着色器关键字,请使用 Shader.SetKeyword、ComputeShader.EnableKeyword 或 ComputeShader.DisableKeyword。
要使用命令缓冲区启用或禁用局部或全局关键字,请使用 CommandBuffer.EnableKeyword 或 CommandBuffer.DisableKeyword。
注意:当启用或禁用与着色器变体一起使用的关键字时,Unity 会使用不同的着色器变体。在运行时更改着色器变体可能会影响性能。如果关键字的更改需要首次使用变体,则在图形驱动程序准备着色器程序时可能会导致卡顿。对于大型或复杂的着色器,或者如果全局关键字状态更改影响多个着色器,这可能是一个特殊的问题。为避免这种情况,如果将关键字与着色器变体一起使用,请确保在着色器加载和预热策略中考虑关键字变体。有关更多信息,请参阅 着色器加载。
在 Unity 中,可以将着色器关键字与着色器变体一起使用,也可以与动态分支一起使用。声明关键字时由您决定。
LocalKeyword
的 isDynamic 属性指示是否在着色器源文件中为使用动态分支声明了该关键字。如果为使用动态分支声明了该关键字,则为 true
;如果为使用着色器变体声明了该关键字,则为 false
。