このページには、ShaderLab コードで Name
ブロックを使用して、Pass (パス) に名前を割り当てるための情報が含まれています。パスの定義については、ShaderLab: パスの定義 を参照してください。シェーダーオブジェクトの仕組み、およびシェーダーオブジェクト、サブシェーダー、パスの関係については、シェーダーの基礎概念 を参照してください。
パスは名前を持つことができます。UsePass
コマンドや、いくつかの C# API では、名前でパスを参照する必要があります。パスの名前は、フレームデバッガー ツールに表示されます。
機能名 | ビルトインレンダーパイプライン | ユニバーサルレンダーパイプライン (URP) | HD レンダーパイプライン (HDRP) | カスタム SRP |
---|---|---|---|---|
ShaderLab: Name ブロック | はい | はい | はい | はい |
ShaderLab でパスに名前を割り当てるには、Name
ブロックを Pass
ブロックの中に配置します。
シグネチャ | 機能 |
---|---|
Name "<name>" |
パスの名前を設定します。 |
内部的には、Unity は名前を大文字に変換します。ShaderLab コードで名前を参照する場合は、大文字のバリアントを使用する必要があります。例えば、値が “example” の場合、EXAMPLE として参照する必要があります。
同じ SubShader 内の複数のパスが同じ名前の場合、Unity はコードの最初のパスを使用します。
C# スクリプトからパスの名前にアクセスするには、Material.FindPass、Material.GetPassName、ShaderData.Pass.Name などの API を使用します。
ノート: Material.GetShaderPassEnabled と Material.SetShaderPassEnabled は、名前でパスを参照するのではなく、LightMode tag の値を使ってパスを参照します。
このサンプルコードでは、ContainsNamedPass という Shader オブジェクトを作成します。その中に ExampleNamedPass というパスが含まれています。
Shader "Examples/ContainsNamedPass"
{
SubShader
{
Pass
{
Name "ExampleNamedPass"
// パスを定義する残りのコードをここに記述します。
}
}
}
次に、以下の C# コードで、このパスの名前をクエリできます。
using UnityEngine;
public class GetPassName : MonoBehaviour
{
// このスクリプトを MeshRenderer コンポーネントを含むゲームオブジェクトに配置します
void Start() {
// マテリアルを取得します
var material = GetComponent<MeshRenderer>().material;
// マテリアルに割り当てられたシェーダーオブジェクトの
// アクティブなサブシェーダーの最初のパスの名前を取得します
var passName = material.GetPassName(0);
// 名前をコンソールに出力します
Debug.Log(passName);
}
}