レンダーグラフの基礎
このドキュメントでは、レンダーグラフの主要原理と、Unity によるレンダーグラフの実行方法の概要について説明します。
主要原理
RenderGraph API を使用してレンダーパスを作成する前に、次の基本原理を理解しておく必要があります。
- リソースを直接操作するのではなく、レンダーグラフシステム固有のハンドルを使用します。すべての RenderGraph API では、これらのハンドルを使用してリソースを操作します。レンダーグラフが管理するリソースタイプには、RTHandle、ComputeBuffer、RendererList があります。
- 実際のリソース参照には、レンダーパスの実行コード内のみからアクセスできます。
- フレームワークの要件により、レンダーパスの明示的な宣言が必要です。各レンダーパスで、読み取り元や書き込み先のリソースを明確に記述する必要があります。
- レンダーグラフの各実行間で永続化が行われることはありません。つまり、あるレンダーグラフの実行内で作成したリソースを次の実行に引き継ぐことはできません。
- 永続化する必要のあるリソース (例えば、あるフレームから別のフレームに引き継ぐ必要のあるリソース) は、通常のリソースと同様にレンダーグラフの外部に作成し、インポートすることができます。このようなリソースは、依存関係の追跡の面では他のレンダーグラフリソースと同じように動作しますが、その生存期間がグラフによって管理されることはありません。
- ほとんどの場合、レンダーグラフはテクスチャリソースに
RTHandle
を使用します。これは、シェーダーコードの記述方法や設定方法に大きく影響します。
リソース管理
レンダーグラフシステムは、フレーム全体の高レベルの表現を使用して各リソースの生存期間を計算します。これはつまり、リソースを作成するために RenderGraph API を呼び出しても、レンダーグラフシステムがその時点でリソースを作成するわけではないことを意味します。代わりにこの API は、リソースを表すハンドルを返します。開発者は、このハンドルをその後のすべての RenderGraph API で使用します。レンダーグラフでリソースが作成されるのは、そのリソースを書き込む必要のある最初のパスが開始される直前です。この場合の "作成" とは、レンダーグラフシステムによるリソースの割り当てを意味するとは限りません。正確には、リソースを表現するために必要なメモリを用意して、そのリソースをレンダーパスで使用できるようにすることを意味します。同様に、リソースを読み取る必要のある最後のパスが完了すると、そのリソースメモリが解放されます。このようにレンダーグラフシステムでは、パスで宣言されているリソースに基づいて、最も効率的な方法でメモリを再利用することができます。特定のリソースを必要とするパスが実行されない場合は、そのリソース用のメモリは割り当てられません。
レンダーグラフの実行の概要
レンダーグラフの実行は 3 ステップの処理で、レンダーグラフシステムによって 0 からすべてのフレームに対して実行されます。この理由は、グラフがフレームからフレームへと動的に (例えば、ユーザーのアクションに応じて) 変化する可能性があるためです。
設定
最初のステップでは、すべてのレンダーパスを設定します。ここで、実行するすべてのレンダーパスと、各レンダーパスで使用するリソースを宣言します。
コンパイル
2 番目のステップでは、グラフをコンパイルします。このステップで、レンダーグラフシステムは、出力が他のどのレンダーパスでも使用されないレンダーパスを削除します。この仕組みにより、グラフの設定時に特定のロジックを組み込む必要がなくなるため、設定の手間が軽減されます。この良い例がデバッグレンダーパスです。レンダーパスを宣言してバックバッファに渡さないデバッグ出力を生成するすると、そのレンダーパスはレンダーグラフシステムによって自動的に削除されます。
このステップでは、リソースの生存期間も計算されます。これにより、レンダーグラフシステムで効率的にリソースの作成と解放を行うことや、非同期計算パイプラインでパスを実行する場合に適切な同期ポイントを計算することが可能になります。
実行
最後にグラフを実行します。レンダーグラフシステムは、削除されなかったすべてのレンダーパスを宣言順に実行します。レンダーグラフシステムは、各レンダーパスの前に適切なリソースを作成します。それらのリソースが後のレンダーパスで使用されない場合は、レンダーパスの後に解放します。