Version: 2023.2
言語: 日本語
シェーダーの基礎
シェーダーアセット

Shader クラス

Unityでは、グラフィックスパイプライン の一部であるシェーダーを使う場合、通常、Shader クラスのインスタンスを使用します。Shader クラスのインスタンスは、シェーダーオブジェクト と呼ばれます。

シェーダーオブジェクトは、シェーダープログラムを使うための Unity 特有の方法です。シェーダーオブジェクトは、シェーダープログラムやその他の情報のラッパーです。これを使うことにより、1 つのファイル内で複数のシェーダープログラムを定義し、それらの使用方法を Unity に指示できます。

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

機能名 ビルトインレンダーパイプライン ユニバーサルレンダーパイプライン (URP) HD レンダーパイプライン (HDRP) カスタム SRP
シェーダーオブジェクト

シェーダーオブジェクトの基礎

シェーダーオブジェクトには、シェーダープログラム、GPU 上での設定を変更するための指示 (総称はレンダー状態)、それらをどのように使用するかを Unity に伝える情報が含まれています。

シーンの外観を決定するには、マテリアル を持つシェーダーオブジェクトを使います。

アセット

シェーダーオブジェクトは 2 つの方法で作成できます。それぞれに特有のアセットタイプがあります。

どちらの方法でシェーダーオブジェクトを作成しても、その結果は内部的には同様に示されます。

シェーダーオブジェクトの内部

シェーダーオブジェクトはネスト構造になっています。サブシェーダーパス と呼ばれる構造に情報を整理します。シェーダープログラムは シェーダーバリアント に整理されます。

シェーダーオブジェクト

シェーダーオブジェクトには以下が含まれています。

  • 名前など、それ自体の情報
  • フォールバックシェーダーオブジェクト。Unity がこのシェーダーオブジェクトを使用できない場合に、フォールバックシェーダーオブジェクトが使用されます。
  • 1 つまたは複数のサブシェーダー

また、共有シェーダーコードや、カスタムエディター を使用するかどうかなどの追加情報を定義することもできます。シェーダーオブジェクトの定義については、ShaderLab: シェーダーオブジェクトの定義 を参照してください。

SubShader

SubShader (サブシェーダー) は、シェーダーオブジェクトを、異なるハードウェア、レンダーパイプライン、ランタイム設定に対応する部分に分離することができます。

SubShader には以下が含まれています。

  • このサブシェーダーが対応できるハードウェア、レンダーパイプライン、ランタイム設定についての情報。
  • サブシェーダー タグ (サブシェーダーに関する情報を提供するキーと値のペア)。
  • 1 つまたは複数のパス

また、すべてのパスに共通するレンダー状態などの追加情報を定義することもできます。サブシェーダーで定義できるすべての内容については、ShaderLab: サブシェーダーの定義 を参照してください。

Pass

Pass (パス) には以下が含まれています。

  • Pass タグ (パスに関する情報を提供するキーと値のペア)。
  • シェーダープログラムを実行する前にレンダー状態を更新するための指示
  • 1 つまたは複数のシェーダバリアントにまとめられたシェーダープログラム

また、名前などの追加情報を定義することもできます。パスで定義できるすべての内容については、ShaderLab: パスの定義 を参照してください。

シェーダーバリアント

パスに含まれるシェーダープログラムは、シェーダーバリアントとして整理されます。シェーダーバリアントはコードを共有しますが、指定するキーワードを有効または無効にすると異なる機能を持ちます。

1 つのパスに含まれるシェーダーバリアントの数は、シェーダーコードで定義されたキーワードの数と、ターゲットプラットフォームによって異なります。各パスには少なくとも 1 つのバリアントが含まれます。

詳しくは、シェーダーバリアント を参照してください。

シェーダーの基礎
シェーダーアセット