Graphics Compositor の使用
Unity Editor で Graphics Compositor (グラフィックスコンポジター) を開くには、メニューから Window > Render Pipeline > Graphics Compositor を選択します。このウィンドウから、グラフィックスコンポジターを有効化し、設定を制御できます。グラフィックスコンポジターを初めて有効化する際は、デフォルトの "pass-through" コンポジションプロファイルが自動的に使い、メイン カメラ の出力を最終フレームにフォワードします。このプロファイルにさらに レイヤー を追加してプロパティーを編集したり、ディスクから別のプロファイルを読み込むことができます。コンポジターウィンドウのプロパティ―に関する情報は、Compositor ウィンドウ を参照してください。
一般的なワークフロー
- ゲームビューで合成出力がレンダリングする間に、シーンビューでシーンの編集ができます。出力のライブプレビューを表示するには、シーンビューとゲームビューを隣り合わせに配置するか、またはエディターでゲームビューのロックを解除して、別のモニター (利用できる場合) に表示することが一番良い方法です。
- ゲームビューが Display 1 に表示するように設定されている場合は、Graphics Compositor が (Compositor ウィンドウで) Display 1 に出力するようにします。さらに、シーン中の Camera はすべて Display 2 や Display 3 など、その他のディスプレイに出力されるように設定してください。こうすることで、不要な描画操作の発生とディスプレイ出力の競合を防ぎます。
アルファベースの合成
多くの合成作業にはアルファチャンネルが必要です。グラフィックスコンポジターのあらゆる機能を適切に使うための推奨事項を参考にしてください。
- レンダリングのカラーバッファフォーマットを 16-bit の浮動小数点値 (R16G16B16A16) に設定します
- ポストプロセスのバッファフォーマットを 16-bit の浮動小数点値 (R16G16B16A16) に設定します
どちらのバッファフォーマットオプションも HDRP Asset で見つかります。コンポジターがアルファチャンネルのないバッファフォーマットを検知した場合は、警告が表示されます。詳細は、Alpha Output を参照してください。
レイヤータイプ
Graphics Compositor ツールは通常、2つのタイプのレイヤーを扱います。
- Composition Layer: Composition Layer は、コンポジターが最終画像を生成するために混合するレンダーターゲット (画像) です。Composition Graph から定義することができます。Composition Graph はレイヤー数とどのように組み合わせるかを定義しますが、各レイヤーのコンテンツは定義しません。
- SubLayer: SubLayer は Composition Layer のコンテンツの生成を担当します。Render Schedule の Graphics Compositor ウィンドウから定義できます。複数の SubLayer をスタックして、Composition Layer のコンテンツを定義します。この場合、すべての SubLayer は同じレンダーターゲットを共有します。
Composition Graph
出力画像を生成するために、Graphics Compositor は多数の Composition Layer を組み合わせる合成作業用のグラフを使います。特に、Shader Graph と Unlit Master Node をターゲットとして使います。コンポジターは出力画像を特定するために、Color ポートに接続する値を使います。Master Node ではその他のポートを接続する必要はありません。
ノート: 合成の出力がレンダーターゲットのときには、Master Node から作成する Material は両面でなければなりません。
Composition Graph を作成する際には、2つのメインタイプの展開できる入力プロパティーがあります。
- Composition Layer: Texture2D プロパティはどれも、グラフが最終フレームを生成するために合成するレイヤーに該当する、合成レイヤーとして作動します。これらのプロパティーはグラフィックスコンポジターウィンドウの Render Schedule セクションで、合成レイヤーとして自動表示されます。Shader Graph の Mode オプションは、レンダースケジュールリストでレイヤーの可視性をオフにした際にシェーダーが使うデフォルト値と一致します。
ノート: この値はデフォルトで白に設定されますが、多くの合成操作と作業には、黒に設定した方が良いでしょう。 - Composition Parameters: これは Texture2D 以外の展開されたプロパティーのいずれかを参照します。合成パラメーターは合成の様々な側面を制御することができます。合成パラメーターの例として、全体的な明度を制御する Float 入力や Texture2D を色付けするカラー入力が挙げられます。これらのプロパティーはグラフィックスコンポジターウィンドウの Composition Parameter セクションで、自動表示されます。
次のグラフは、上で解説したプロパティータイプの例です。Logo プロパティーは合成レイヤーの例で、Opacity プロパティーは合成の一面を制御する入力プロパティーの例です。
Unity は Graphics Compositor プロパティーを Composition Graph と同じ名前で .asset ファイルに保存します。Graphics Compositor が Composition Graph を読み込む際には、もしあれば該当する Asset ファイルからもプロパティーを読み込むか、そうでなければデフォルト設定で新しい Asset を作成します。
Composition Layer の追加および消去
新しい Composition Layer を追加するには、Composition Graph で新たな Texture2D 入力プロパティーを作成します。便宜上、Graph Inspector の Node Settings にある Reference フィールドで、端的で直接的な名前 (BackGround Layer など) を付ける必要があります。 次回 Composition Graph を保存するときは、新しいレイヤーは Graphics Compositor ウィンドウの Render Schedule セクションで、Reference として使った名前と一緒に自動表示されます。そこから、レイヤープロパティー を制御し、レイヤーをコンテンツで埋める 方法を特定することができます。
同様に、Composition Layer を消去するには、 Composition Graph から該当する Texture 2D プロパティーを除去します。
Composition Layer にコンテンツを追加する
各 Composition Layer は、1つ以上の SubLayer からコンテンツを獲得できます。SubLayer には 3 つのタイプがあります。
- Camera SubLayer: コンテンツのソースは Unity Camera です。SubLayerのプロパティ―から、使う Camera を選べます。
- Video Sublayer: コンテンツのソースは Unity Video Player です。SubLayer のプロパティ―から、使う Video Player を選べます。
- Image Sublayer: コンテンツのソースは静止画像です。Sublayer のプロパティ―から、使う画像を選べます。
Sublayer を Composition Layer に追加するには、Composition Layer を選択してから Add ドロップダウンをクリックし、ドロップダウンから SubLayer のタイプを選択します。
SubLayer を除去するには、SubLayer を選択してから Delete ボタンをクリックします。
ノート: この方法で削除できるのは SubLayer のみで、Composition Layer は削除できません。Composition Layer を削除するには、Composition Graph から該当する Texture2D プロパティーを削除してください。
ポストプロセスと SubLayer
Composition Layer 内の SubLayer にはそれぞれ、一意のポストプロセスエフェクトがあります。このタイプのレイヤーごとのポストプロセスの設定には、以下を実行する必要があります。
- 一意のポストプロセスエフェクトが必要な SubLayer すべてに対して、一意の Volume をシーンに追加します。
- Unity エディターで、それぞれの Volume に一意のレイヤーマスクを作成および設定します。
- 各 SubLayer のプロパティ―で、適切なボリュームマスクをオーバーライドおよび設定します。
コンポジターが SubLayer にポストプロセスを実行する際、ポストプロセスはアルファ値がゼロ以上のピクセルのみに影響します。ポストプロセスがこの SubLayer が描画するピクセルだけに影響を与えるようにするために、SubLayer Properties で Clear Alpha オプションを選択します。Clear Alpha オプションを選択しない場合、ポストプロセスは以前描画された SubLayer にも影響を与えます。
複数の SubLayer でリソース負荷が大きいポストプロセスエフェクト (Depth of Field や Bloom など) を有効にすると、ランタイムのパフォーマンスに悪影響を及ぼしますので、ご留意ください。ですから、できる限りまとまったレイヤーにポストプロセスを実行することが最善策です。SubLayer Properties で Clear Alpha オプションを使ってください。
アルファベースの合成とブルーム
ポストプロセスはアルファ値がゼロ以上のピクセルのみに影響するというのは、一般的なルールです。このルールの例外である Bloom エフェクトでは、生成するグローがアルファ値がゼロのピクセルにも広がります。ただし、アルファ値がゼロ以上のソースピクセルのみが、ブルームエフェクトに貢献します (付与はアルファ値に比例します)。
カメラスタッキング
1つ以上の SubLayer を使って Composition Layer のコンテンツを特定する際に、これで SubLayer を同じレンダーターゲットの上に "スタック" します。レンダーターゲットのサイズおよびフォーマットを特定するには、親の Composition Layer のプロパティ―を使います。SubLayer は親の Composition Layer からサイズとフォーマットを受け継ぎ、特定の SubLayer に個別にプロパティーを変更することはできません。つまり、スタックされた Camera と SubLayer はすべて、同じサイズとフォーマットを持ちます。
スタッキングの順序を変更するには、Graphics Compositor ウィンドウの Render Schedule セクションで SubLayer を再配置します。合成は深度を意識し、つまり表面が不透明なレイヤーにSubLayer の順序を変更しても、結果画像に差はありません。これは SubLayer で Clear Depth のオプションを選択しない限り、変わりません (そうすると SubLayer 間の深度が保持されます)。
深度を描画しない要素 (UI 要素など) に、適切なスクリーンスペースリフレクションとレイヤー間の透明度を確保するために、SubLayer に正しい順序を選ぶことが重要です。例えば、3D ワールドの上にレンダリングしなければならない半透明の UI 要素を持つレイヤーは、Composition Layer のスタックされた SubLayer の一番最後に表示されなければなりません。
SubLayer Properties セクションは、スタッキング操作のタイプを制御します。
Render Schedule
Render Schedule は、Composition Layer と SubLayer の、順序変更が可能なリストです。SubLayer は該当する親の Composition Layer の下に表示され、階層関係が見やすくなっています。1つの親の Composition Layer の下に複数の SubLayer が表示されるときは、カメラスタック を形成します。Unity はまず上のレイヤーをレンダリングします。リストの順序を変更するには、Composition Layer と SubLayer の両方をクリックして移動させます。こうしてカメラスタックでレンダリング順序を変更したり、SubLayer を1つの親の Composition Layer から別の親レイヤーへ移動させることができます。
Composition Parameters
このセクションでは、入力 Composition Layer ではない、すべての展開されたプロパティーを表示します (例えば、最終合成の明度を制御する Float または Texture2D を色付けする Color など)。このセクションでは、Composition Graph 外で、ウィンドウから各プロパティー値の編集が可能です。Composition Graph 内で値をハードコーディングするのではなく、プロパティーをグラフからGraphics Compositor ウィンドウに展開する方が望ましいでしょう。こうすることで、値の編集のために Composition Graph を開く必要がなくなるため、プロジェクト間で合成プロファイルを共有するのに役立ちます。
スクリーンスペース UI の合成
Graphics Compositor を使って、スクリーンスペースキャンバス要素 (UI) を合成できます。Canvas が Screen Space - Camera レンダーモードを使う際には、Render Camera (Canvas Inspector 内) を UI を描画する SubLayer カメラに設定する必要があります。ただしこの場合、UI を描画するカメラ SubLayer は以下の条件に当てはまる必要があります。
- 一意のカメラが割り当てられていなければなりません。このカメラはその他の SubLayer で使ってはいけません。
- カメラのどのステートもオーバーライドしてはいけません (アンチエイリアシング、カリングマスク、ボリュームマスクなど)。これらのプロパティーは、SubLayer が使うソースカメラで変更できます。
さらに、Graphics Compositor の Output Camera を Render Camera として使って、コンポジターの出力の上に Canvas 要素を描画することはできません。同じエフェクトを実現するためには、Render Schedule で新しい SubLayer を追加してこのレイヤーのカメラをUIの Render Camera として使い、その後できたレイヤーと利用できる合成操作 (スタッキングまたはグラフベースの合成) とを合成します。
パフォーマンスの考慮点
Graphics Compositor は、CPUおよびGPUの負荷が高めであるため、ビデオゲームのようなパフォーマンス重視のアプリケーションには不向きです。
以下は、Graphics Compositor を使ったアプリケーションのパフォーマンス向上に役立つヒントです。
Render Schedule で SubLayer の数を減らします。各 SubLayer は、内部で一意のカメラを使っています。これは同じカメラが UI で複数の SubLayer に割り当てられていても、同じです。
簡単なオブジェクトをレンダリングする SubLayer には、ソースカメラを選択し、インスペクターで "Custom Frame Settings" を選択します。そこからできるだけ多くの HDRP 機能を無効にしてください。例えば、SubLayer に Screen Space Reflections (SSR) が必要ないとわかっている場合は、SSR のサポートを無効にできます。
ビジュアル的に重要な要素を別のレイヤーでフル解像度で維持しながら、特定の Composition Layer の解像度を低くすることができます (これはこのレイヤーにスタックされたすべての SubLayer に影響を与えます)。