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