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