このページでは、ShaderLab コードで Tags
ブロックを使用して Pass (パス) にタグを割り当てる方法について説明します。また、LightMode
タグの使用に関する情報も含まれています。
シェーダーオブジェクトの仕組みや、シェーダーオブジェクト、サブシェーダー、パスの関係については、シェーダーの基礎概念 を参照してください。
タグは、データのキーと値のペアで、パスに割り当てることができます。Unity は、事前定義されたタグと値を使用して、指定されたパスをいつどのように使用するかを決定します。または、カスタム値を使用して独自のカスタムのパスタグを作成することもできます。C# コードからパスタグにアクセスできます。
最もよく使われる定義済みのパスタグは、LightMode
タグで、これはすべてのレンダーパイプラインで使用されます。その他のパスタグは、レンダーパイプラインによって異なります。詳しくは、以下のページを参照してください。
機能名 | ビルトインレンダーパイプライン | ユニバーサルレンダーパイプライン (URP) | HD レンダーパイプライン (HDRP) | カスタム SRP |
---|---|---|---|---|
ShaderLab: Pass Tags ブロック | あり | あり | あり | あり |
ShaderLab: LightMode Pass タグ | あり | あり | あり | あり |
ShaderLab でタグをパスに割り当てるには、Tags
ブロックを Pass
ブロックの中に配置します。
SubShader と Pass の両方が Tags
ブロックを使用していますが、動作が異なることに注意してください。SubShader のタグを Pass に割り当てても効果はなく、その逆も同様です。その違いは以下に示すように、 Tags
ブロックをどこに置くかによります。
Tags
ブロックを、Pass
ブロック内に配置します。Tags
ブロックを SubShader
ブロック内に置き、かつ、Pass
ブロックの外になるように配置します。サブシェーダーへのタグの割り当てについては、サブシェーダーへのタグの割り当て を参照してください。
シグネチャ | 機能 |
---|---|
Tags {"<name1>" = "<value1>" "<name2>" = "<value2>"} |
与えられたタグをパスに適用します。 タグは数に制限なく定義できます。 |
C#スクリプトからパスタグの値にアクセスするには、Shader.FindPassTagValue API を使用します。これは Unity の定義済みのパスタグにも、自分で作成したカスタムのパスタグにも対応しています。
ノート: LightMode パスタグと直接連携する API がいくつかあります。詳細については、C# スクリプトによる LightMode タグの使用 を参照してください。
LightMode
タグは定義済みのパスタグです。Unity が、あるフレーム中にパスを実行するかどうか、指定したフレーム内でいつ Unity がパスを実行するか、そして Unity が出力に対して何をするかを決定するために使用されます。
ノート: LightMode
タグは、ライティングと関連する LightMode enum とは関係ありません。
すべてのレンダーパイプラインは、LightMode
タグを使用しますが、定義済みの値とその意味は異なります。詳細については、構文と有効な値 を参照してください。
ビルトインレンダーパイプラインでは、LightMode
タグを設定しない場合、Unity はライトや影なしでパスをレンダリングします。これは本質的に、LightMode
の値を Always
にすることと同じです。スクリプタブルレンダーパイプラインでは、SRPDefaultUnlit
の値を使って、LightMode タグのないパスを参照できます。
シグネチャ | 機能 |
---|---|
“LightMode” = “[値]” | このパスの LightMode 値を設定します。 |
このタグの有効な値は、レンダーパイプラインによって異なります。
Material.SetShaderPassEnabled と ShaderTagId は、LightMode
タグの値を使用して、Unity が与えられたパスをどのように処理するかを決定します。
スクリプタブルレンダーパイプラインでは、LightMode
タグのカスタム値を作成することができます。次に、このカスタム値を使って、DrawingSettings 構造体を構成することにより、ScriptableRenderContext.DrawRenderers の指定した呼び出しの間に、どのパスを描画するかを決定できます。詳細とコード例については、カスタムレンダーパイプラインでのシンプルなレンダーループの作成 を参照してください。
Shader "Examples/ExampleLightMode"
{
SubShader
{
Pass
{
Tags { "LightMode" = "Always" }
// パスを定義するコードの残りをここに記述。 here.
}
}
}