同じ名前を持つグローバルシェーダーキーワードとローカルシェーダーキーワードの状態が異なる場合、Unity は、LocalKeyword の isOverridable プロパティを使用して、個別のマテリアルまたはコンピュートシェーダーに対してキーワードが有効であるか無効であるかを判断します。キーワードがグローバルスコープで宣言されていれば isOverridable は true、ローカルスコープで宣言されていれば false となります。
isOverridable が true の場合: 同じ名前のグローバルキーワードが存在し有効になっている場合、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 となります。