パスは、シェーダーオブジェクトの基本要素です。GPU の状態や、GPU 上で動作するシェーダープログラムを設定するための命令が含まれています。
単純なシェーダーオブジェクトには 1 つのパスしか含まれない場合がありますが、より複雑なシェーダーは複数のパスを含むことができます。別々のパスを使用して、異なる動作を持つシェーダーオブジェクトの部分を定義できます。例えば、レンダー状態の変更を必要とする部分、異なるシェーダープログラム、または異なる LightMode パスタグなどです。
ノート: スクリプタブルレンダーパイプラインを基本にしたレンダーパイプラインでは、RenderStateBlock を使って GPU でレンダー状態を変更することができ、特にパスを必要としません。
ShaderLab で通常のパスを定義するには、Pass ブロックを SubShader ブロック内に配置します。
また、UsePass や GrabPass コマンドを使って、2 つの特別なタイプのパスを定義することもできます。これらのコマンドの詳細については、ShaderLab コマンド:UsePass または ShaderLab コマンド:GrabPass を参照してください。
パスは名前を持つことができます。UsePass コマンドや、いくつかの C# API では、名前でパスを参照する必要があります。パスの名前は、フレームデバッガー ツールに表示されます。
ShaderLab でパスに名前を割り当てるには、Name ブロックを Pass ブロックの中に配置します。
内部的には、Unity は名前を大文字に変換します。ShaderLab コードで名前を参照する場合は、大文字のバリアントを使用する必要があります。例えば、値が “example” の場合、EXAMPLE として参照する必要があります。
同じ SubShader 内の複数のパスが同じ名前の場合、Unity はコードの最初のパスを使用します。
C# スクリプトからパスの名前にアクセスするには、Material.FindPass、Material.GetPassName、ShaderData.Pass.Name などの API を使用します。
注意Material.GetShaderPassEnabled と Material.SetShaderPassEnabled は、名前でパスを参照するのではなく、LightMode タグ の値を使ってパスを参照します。
このサンプルコードは、1 つの SubShader を含むシェーダーオブジェクトを作成するための構文を示しています。SubShader には 1 つのパスが含まれます。
Shader "Examples/SinglePass"
{
SubShader
{
Pass
{
Name "ExamplePassName"
Tags { "ExampleTagKey" = "ExampleTagValue" }
// ShaderLab commands go here.
// HLSL code goes here.
}
}
}