Unity では、グラフィックスパイプライン の一部であるシェーダーを使う場合、通常、Shader クラスのインスタンスを使用します。Shader クラスのインスタンスは、シェーダーオブジェクトと呼ばれます。
シェーダーオブジェクトは、シェーダープログラムを使用する Unity 固有の方法で、シェーダープログラムやその他の情報のラッパーです。同一ファイル内に複数のシェーダープログラムを定義し、それらをどのように使用するかを Unity に伝えることができます。
| 機能名 | ユニバーサルレンダーパイプライン (URP) | HD レンダーパイプライン (HDRP) | カスタム SRP | ビルトインレンダーパイプライン |
|---|---|---|---|---|
| シェーダーオブジェクト | はい | はい | はい | はい |
シェーダーオブジェクトには、シェーダープログラム、GPU 上での設定を変更するための指示 (総称はレンダー状態)、それらをどのように使用するかを Unity に伝える情報が含まれています。
シーンの外観を決定するには、マテリアル を持つシェーダーオブジェクトを使います。
シェーダーオブジェクトは 2 つの方法で作成できます。それぞれに特有のアセットタイプがあります。
.shader という拡張子を持つテキストファイルです。どちらの方法でシェーダーオブジェクトを作成しても、その結果は内部的には同様に示されます。
シェーダーオブジェクトはネスト構造になっています。サブシェーダーとパスと呼ばれる構造に情報を整理します。シェーダープログラムはシェーダーバリアントに整理されます。
シェーダーオブジェクトには以下が含まれています。
また、共有シェーダーコードや、カスタムエディター を使用するかどうかなどの追加情報を定義することもできます。シェーダーオブジェクトの定義については、ShaderLab: シェーダーオブジェクトの定義 を参照してください。
SubShader (サブシェーダー) は、シェーダーオブジェクトを、異なるハードウェア、レンダーパイプライン、ランタイム設定に対応する部分に分離することができます。
SubShader には以下が含まれています。
また、すべてのパスに共通するレンダー状態などの追加情報を定義することもできます。サブシェーダーで定義できるすべての内容については、ShaderLab: サブシェーダーの定義 を参照してください。
Pass (パス) には以下が含まれています。
また、名前などの追加情報を定義することもできます。パスで定義できるすべての内容については、ShaderLab: パスの定義 を参照してください。
パスに含まれるシェーダープログラムは、シェーダーバリアントとして整理されます。シェーダーバリアントはコードを共有しますが、指定するキーワードを有効または無効にすると異なる機能を持ちます。
1 つのパスに含まれるシェーダーバリアントの数は、シェーダーコードで定義されたキーワードの数と、ターゲットプラットフォームによって異なります。各パスには少なくとも 1 つのバリアントが含まれます。
詳しくは、シェーダーバリアント を参照してください。