包含此页的版本:
不含此页的版本:
使用 C# 脚本启用或禁用关键字,并检查关键字是否具有局部或全局作用域。
要更改关键字的状态,请使用Material应用程序接口。例如Material.EnableKeyword().
默认情况下,HLSL着色器在 GPU 上运行的程序。更多信息
请参阅术语表关键字具有全局作用域。因此,若要在多个着色器之间切换具有相同名称的关键字,可以使用 C# 全局关键字对象。
按着这些次序:
GlobalKeyword对象,与要启用或禁用的关键字同名。Shader用于启用或禁用全局关键字的 API,该关键字会调整所有着色器中具有相同名称的 HLSL 关键字。例如Shader.EnableKeyword.
注意:当您创建新的GlobalKeyword,Unity 会更新其所有加载着色器的全局和本地关键字空间之间的内部映射。这可能是 CPU 密集型作。若要减少此作的影响,请尝试在应用程序启动后,在加载应用程序时创建所有全局关键字。
若要防止全局关键字对象影响着色器关键字,请为着色器关键字提供局部作用域而不是全局作用域。
加_local添加到关键字指令。例如:
#pragma shader_feature_local RED
现在着色器不受全局Shader蜜蜂属。您只能使用Material像 APIMaterial.EnableKeyword().
注意:如果在着色器中使用 Fallback 或 UsePass,则其关键字范围将替代引用着色器的关键字范围。
要检查着色器中关键字的作用域,请在“项目”窗口中选择着色器,然后在检查器一个 Unity 窗口,显示有关当前选定游戏对象、资产或项目设置的信息,允许您检查和编辑值。更多信息
请参阅术语表窗口打开关键字下拉列表。Unity 在 Overridable 下显示具有全局作用域的关键字,在 Not Overridable 下显示具有局部作用域的关键字。
您还可以使用 LocalKeyword.isOverridable API。
注意:术语Local在LocalKeyword表示 API 表示 HLSL 关键字,而不是 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.EnableKeyword或CommandBuffer.DisableKeyword.