CORETECH ENGINEER BLOG

株式会社サイバーエージェント SGEコア技術本部 技術ブログ

Unity6からRenderGraphを使いこなそう ー 基本機能編

はじめに

こんにちは、サイバーエージェントゲームエンターテイメント事業部、SGEコア技術本部(コアテク)のグラフィックスチームに所属している張 煜冰(チャン ユービン)です。

RenderGraphは、レンダリングパイプラインをより柔軟かつ効率的に管理するための新しいフレームワークです。さまざまな最適化を行い、ランタイム描画性能を向上させます。 HDRPにすでに導入されており、Unity6(URP17)からはいよいよURPにも正式導入されます。

RenderGraphは将来URPの重要な一部になることを念じて、私がコアテクグラフィックスチームでUnity2023.3からRenderGraphのことを追って研究し続けました。

ここからは私が今まで得た知見と公式が発信した情報を合わせて、RenderGraphの基本概念から応用方法まで数回分ける紹介していきます。

本記事はその第一回として、RenderGraphの基本概念と便利機能についての紹介になります。

記事で執筆時点での環境

  • Unity6 (6000.0.4f1)

  • Universal RP 17.0.3

RenderGraphの特徴とメリット

従来のURPのレンダリングアーキテクチャに比べて、RenderGraphは以下のようなメリットがあります。

  • レンダーパス依存関係の明確化

    • 各レンダーパスの入力(テクスチャやバッファなど)、出力(レンダーターゲットやバッファなど)は明示的に宣言することを要求されます。
    • これにより、各レンダーパス間のリソース依存関係が明示されるため、パスの順序やリソースの管理が効率化されます。
  • 自動同期ポイント生成

    • 非同期コンピュートキューと通常のグラフィックキュー間の同期ポイントを自動生成することで、GPU処理時間を短縮します。
    • これにより、開発者は手動での同期ポイント設定の手間を省けます。
  • メモリ使用効率の最適化

    • フレームごとに実際に使用されるリソースのみを割り当て、使用しなくなったリソースを自動解放することで、メモリフットプリントを削減します。
    • これにより、GPUメモリの使用効率が向上します。
  • パフォーマンスの最適化

    • 自動的に各レンダーパスをNativeRenderPass(低レベルのGraphicAPIを直接アクセスする形)にコンパイルし、マージ可能なパス(入力、出力が一致)をマージし、不要なパス(描画結果に影響しない)を除外します。
    • これにより、無駄な、重複な処理を省けることで、オーバーヘッドを削減し、パフォーマンスを向上します。
  • メンテナンス性の向上

    • リソース管理が内部化されているため、開発者はリソース確保、解放など複雑なコードを手で書く必要もなくなり、レンダーパイプラインの保守が容易になります。
  • デバッグとプロファイリングの向上

    • Render Graph Viewerを使用することで、レンダリングパイプラインのデバッグやパフォーマンスプロファイリングがより容易になります。各パスの実行タイミングやリソース使用状況を詳細に追跡できます。

Render Graph Viewerについて

RenderGraphViewerはRenderGraphと伴い実装された新しい可視化ツールであり、使用するとエディター内でエンジンのレンダーパス作成とフレームリソースの使用状況を直接分析できるようになりなります。

ここからその主な機能と使い方を紹介していきます。

開く方法

Window → Analysis → Render Graph Viewerから開きます

機能説明

Render Graph Viewerはこの5つのエリアに構成され、各種情報を一目でもわかるように設計されています。

  • ①:各リソースのライフタイム、および各Passでのアクセス状況
  • ②:RenderGraphで実行されるRenderPassの一覧
  • ③:描画処理に使われているすべてのテクスチャリソース一覧
  • ④:③にあるリソースの詳細情報
  • ⑤:②にあるRenderPassの詳細情報

①のアイコン説明

:該当リソースがそのPassでGlobalリソースに設定された

:該当リソースがそのPassで書き込まれた

:該当リソースがそのPassで読み込まれた

:該当リソースがそのPassで読み書き両方された

:該当リソースがそのPassで使われてないが、後続のPassに使われるためまだ破棄されていない

:該当リスースが確保される前か、破棄された後

②のアイコン説明

  • 1:選択したPassの文字と下の枠は白いハイライトになり、NativeRenderPassにマージされたパスも同時選択される
  • 2:枠上に青い線で繋がっているPassたちは、1つNativePassにマージされたことを意味する
  • 3:枠が青色になっているPassは、選択したPassと同じリソースを使っていることを意味する
  • 4:枠に浅い青色が点滅しているPassは、選択したPassとマージ可能だが、間にマージ不可のPassに挟まれたせいでマージできなかったことを意味する

③のアイコン説明

:そのリソースはRenderGraphにより確保するのではなく、RTHandleSystemにより確保後、RenderGraphにImportされている

④で各リソースの詳細情報を確認できる

⑤で各Passの詳細情報を確認できる

RenderGraphのデメリット

既存プロジェクトをUnity6で開く際に、カスタムパスが全部動作しなくなることに驚くのではないでしょうか。

  • 互換性問題:
    • 旧システムと互換性がないため、旧システムで作ったカスタムパスは一切動作しません。

RenderGraphで旧システムで作ったカスタムパスが全く使えないことは一番のデメリットだと思います。 新規プロジェクトならまだしも、開発中のプロジェクトをUnity6に移行するには結構苦労するでしょう。 幸い、RenderGraphを使わずに、旧システムのままにする選択肢もあります。

RenderGraph有効/無効の切り替え方法

Unity6から、旧システムは非推奨とされ、RenderGraphはデフォルト有効になっています。 以下のメニューから旧システムに戻すことができます。

Edit → Project Settings → Graphics → Pipeline Specific Settings → URPタブ → Render Graph → Compatibility Mode (Render Graph Disabled)

そこにチェックをつけるとRender Graphが無効になり、旧システムに戻ります。

最後に

RenderGraphは非常に優れたシステムですが、旧システムで作成したカスタムパスが一切動作しなくなるため、特に既存プロジェクトに対してその門に踏み入る第一歩が難しいでしょう。

しかし、旧システムはすでに非推奨とされ、そのうち廃棄されるとも考えられます。その時になったら、RenderGraphに移行せざるを得ません。

次回からは、Unity公式が提供してくれたRenderGraphのサンプルコードに基づいて、RenderGraphで新しいカスタムパスを実装する方法を解説していきたいと思います。

参考: