Version: 2021.1
言語: 日本語
ShaderLab: パスの定義
ShaderLab: タグをパスに割り当てる

ShaderLab: 名前をパスに割り当てる

このページには、ShaderLab コードで Name ブロックを使用して、Pass (パス) に名前を割り当てるための情報が含まれています。パスの定義については、ShaderLab: パスの定義 を参照してください。シェーダーオブジェクトの仕組み、およびシェーダーオブジェクト、サブシェーダー、パスの関係については、シェーダーの基礎概念 を参照してください。

パスは名前を持つことができます。UsePass コマンドや、いくつかの C# API では、名前でパスを参照する必要があります。パスの名前は、フレームデバッガー ツールに表示されます。

レンダーパイプラインの互換性

機能名 ビルトインレンダーパイプライン ユニバーサルレンダーパイプライン (URP) HD レンダーパイプライン (HDRP) カスタム SRP
ShaderLab: Name ブロック

Name ブロックの使用

ShaderLab でパスに名前を割り当てるには、Name ブロックを Pass ブロックの中に配置します。

シグネチャ 機能
Name "<name>" パスの名前を設定します。

内部的には、Unity は名前を大文字に変換します。ShaderLab コードで名前を参照する場合は、大文字のバリアントを使用する必要があります。例えば、値が “example” の場合、EXAMPLE として参照する必要があります。

同じ SubShader 内の複数のパスが同じ名前の場合、Unity はコードの最初のパスを使用します。

C# スクリプトでのパス名の使用

C# スクリプトからパスの名前にアクセスするには、Material.FindPassMaterial.GetPassNameShaderData.Pass.Name などの API を使用します。

ノート: Material.GetShaderPassEnabledMaterial.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);
    }
}

ShaderLab: パスの定義
ShaderLab: タグをパスに割り当てる