このページには、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);
    }
}