HD レンダーパイプライン(HDRP)の設定を活用してパフォーマンスを最大化しつつ、パワフルなグラフィックスを実現する方法をご紹介します。
Unity 2020 LTS 以降に対応した HDRP バージョン 10 をリリースするにあたって、HDRP パッケージは、ユーザーフレンドリーなインターフェース、柔軟性のある機能、安定性、および包括的なパフォーマンスといった要素の充実を優先してきました。しかし、HDRP を最適化した形で使うには、主要な設定項目をすべて理解し、それらがどのように機能し、何をするのかを理解することが重要です。そこで今回は、CPU/GPU プロファイラーのキャプチャー、Render Pipeline Debug ビュー、HDRP のシェーダーフレームワークの観点から、HDRP の動作を見ていきます。
グラフィックスのデバッグからプロファイリングや最適化まで、このブログでは、Custom Pass API や、その他パッケージの一部分を使って、皆さんのプロジェクトに合わせて HDRP をカスタマイズするためのヒントをお伝えします。
フレームの解析を始める前に、まずは HDRP の機能を知ることが大切です。Unite Now 講演「Achieving high-fidelity graphics for games with HDRP」、「Ray tracing with Unity's High Definition Render Pipeline」ウェビナー、および「Volumetric Clouds, Lens Flare, and Light Anchor」をご覧になることをお勧めします。これらはすべて HDRP の素晴らしい手引きとなっています。
ビルトインレンダーパイプラインから HDRP への移行は、調整に時間がかかることが多いようです。これは以下のような理由によります。
この HDRP の機能を知るために、まずはグローバル設定を見てみましょう。
ビルトインレンダーパイプラインでは、Graphics 設定で、プロジェクトごとのグラフィック設定のほとんどがカバーされます。また、Player 設定もあります。これは、Windows、Linux、Mac、Xbox など、特定のターゲットプラットフォームのコンテキストでの一般的なグラフィック設定を含んでいます。
HDRP プロジェクトでも Graphics 設定と Player 設定は使われますが、レンダーパイプラインの詳細なデフォルト設定にアクセスするための 3 つの設定が追加されています。
ビルトインレンダーパイプラインでは、 Quality Settings タブで、複数の品質レベルを定義することができます。品質レベルごとに、異方性テクスチャの使用など、一部のグラフィックス設定を指定することで、ローエンドのプラットフォームでのハードウェアリソースの使用を抑えることができます。
HDRP プロジェクトでは特に、上書きを行う HD Render Pipeline アセットを品質レベルごとに選択することができます。 HD Render Pipeline アセットには、画面上のにディレクショナルライト、パンクチュアルライト、エリアライトの数、カラーグレーディング LUT のサイズ、ライトクッキーのアトラスのサイズなど、いくつかのパラメーターが保存されているため、ビルトインレンダーパイプラインと比較して、より多くの設定を行うことができます。
ビルトインレンダーパイプラインプロジェクトの Quality Settings タブにある一部のプロパティは、ビルトインレンダーパイプラインにのみ適用されます。HDRP プロジェクトでは、これらの設定が元の場所から消え、別の場所で「置き換えられた設定」として現れることがあります。
たとえば、ビルトインレンダーパイプラインプロジェクトでは、Quality Settings タブで Shadow Resolution プロパティを制御できます。しかし、HDRP プロジェクトでは、HD Render Pipeline アセットの Lighting > Shadows セクションで、シャドウマップの解像度を制御します。
HDRP でシーンをレンダリングするには、ビルトインレンダーパイプラインと同じように、カメラを追加する必要があります。HDRP では、追加の HD Additional Camera Data コンポーネント(同じゲームオブジェクトにアタッチされている)を使って、カメラごとの追加パラメーターを保存することもできます。
HDRP には、カメラごとにカスタマイズできるパラメーターが多数あります。Physical Camera の設定が複数存在し、またカメラの Custom Frame Settings プロパティにチェックを入れると、Frame Settings システムを通じて、カメラがフレームをどのように描画するかを決めることができます。
Frame Settings システムは、カメラのプロパティを上書きするデータのスタックです。Frame Settings のデフォルト値は、HDRP Default Settings タブで指定できます。加えて、各カメラはデフォルトの Frame 設定を上書きすることができます。
Render Pipeline Debug ウィンドウの Camera パネル は、Frame Settings の上書きスタックの視覚化に役立ちます。
下に示した例は、Render Pipeline Debug ウィンドウの Camera パネルの動作を示しています。
シーン中に Main Camera というカメラがあります。Main Camera は静的なオブジェクトのみを描画します。HDRP Default Settings タブでは、モーションベクターの描画を有効化できますが、Main Camera で Frame 設定を上書きする場合はこの機能は無効にされ、全体のパフォーマンスが向上します。
Motion Vectors の上書きスタックでは、 Default Frameの設定の左側に Overridden Frame の設定 の状態が表示されます。図 4 で「A」を付けて強調されている部分をご覧ください。
さらに、 Render Pipeline Debug ウィンドウでは、Overridden Frame 設定の左側に Sanitized Frame 設定の状態が表示されています。 サニタイズすることで、Overridden Frame 設定を一貫した状態に保つことができます。同じ例を見てみると、Opaque Object Motion と Transparent Object Motion は、 Main Camera の Frame Settings の上書き設定で明示的に無効化されていません。しかし、Motion Vector が無効になっているため、図 4 で「B」を付けて強調した部分で示されているように、これらの依存する機能もサニタイズシステムによってオフにされます。
Unite Now の 講演で述べたように、HDRP はVolume システムをサポートしています。ビルトインレンダーパイプラインのポストプロセッシングスタックと同様に、HDRP の Volume システムはポストプロセッシングを制御します。さらに、空のレンダリング方法、間接光の強さ、いくつかの影の設定なども決定します。
簡単に言えば、HDRP の Volume システムは、カメラがシーン内を移動する際にレンダリング設定を変更するために使用できる抽象的なフレームワークです。Volume プロパティごとに、ハードコードされた Default Value があります。これらの値を確認するには、Render Pipeline Debug ウィンドウの Volume パネルを使います。図 5 の右端の列では、Lens Distortion の Default Intensity の値が 0 になっています。
これらのハードコードされたデフォルトのプロパティは、 HDRP Default Settings タブのVolume Components セクションのプロパティを上書きすれば書き換えることができます。なお、これらのプロパティの上書きは、シーン内の Volume でも同じように行うことができます。
逆に Camera は、シーン内の Volume から取ったプロパティ値をブレンドしたものを取り込みます。何もない場合は、HDRP Default Settings タブからプロパティ値を拾います。それ以外の場合は、ハードコードされたデフォルトのプロパティ値を拾います。
図 5 に示すように、Render Pipeline Debug ウィンドウの Volume パネルは、現在の Volume プロパティの上書きスタックを視覚化するのに便利です。現在使用されている Volume プロパティが表示されるので、デバッグ時には特に効果的です。
ビルトインレンダーパイプラインと同じように、レンダリングされるジオメトリは通常、メッシュレンダラーまたはスキンメッシュレンダラーによってシーン内で指定されます。HDRP 固有のデータは、主にマテリアル に保存され、適切なレンダラーやシェーダーグラフを使用できるようになっています。
ビルトインレンダーパイプラインと同様に、HDRP プロジェクトにはそれぞれ HDRP 専用のデータストレージを備えたライトがあります。HD Additional Light Data コンポーネントが通常の Light コンポーネントと一緒にアタッチされています。
ライティングの設定は、Light コンポーネントの付いたゲームオブジェクト以外の場所で行われることが多いことを考慮してください。ここではその例を 2、3 件ご紹介します。
さて、ここまで HDRP の UX についてご紹介してきましたが、あまり馴染みのないグラフィックプロパティの中から皆さんの次の HDRP プロジェクトで役立つものに注目してみましょう。図 7 は、一般的な設定を上部に、上書きする設定を下部に配置した場合のアプローチを示しています。ご覧の通り、上から下に行くほど範囲が広がります。
HDRP の Graphics 設定は、以下に適応する必要があります。
なお、HDRP の設定は、特に設定の範囲に気を配る必要があります。
しばしば以下のような設定の範囲の衝突が生じます。
これらの衝突を解決するために、HD Render Pipeline アセットは、階層化された 設定をサポートしています。1 つのプロパティに対して 1 つの値を示すのではなく、複数の値を「Low」「Medium」「High」、場合によっては「Ultra」のような複数の階層に割り当てることができます。
ピクチャーインピクチャー効果をレンダリングするカメラでは、後処理効果を制御するボリュームとシャドウマップを要求するスポットライトの両方に階層を指定できます。
HDRP は、有効な HD Render Pipeline アセットの適切な階層から、そのプロパティを検索することができます。使われるのはこのプロパティです。
もちろん、カメラやボリューム、ライトなどは、階層別の設定システムを無視して、望ましい振る舞いを直接決めることも可能です。
設定の範囲が重なっている別の例を見てみましょう。
複雑な頂点アニメーションを持つシェーダーグラフを使うメッシュレンダラーがシーン内にあるとします。ローエンドのデバイスで頂点アニメーションを行うにはコストがかかりすぎるかもしれません。また、ピクチャーインピクチャー効果に関しては、レンダーテクスチャのために考慮すべき余分なカメラレンダリングがありますので、どんな頂点アニメーションでもレンダリングするための余分なカメラは必要ありません。
この場合、以下の 3 つの設定の範囲が重なることになります。
このようなケースに対応するために、シェーダーグラフには特別な Material Quality キーワードが用意されています。
マテリアルごとにユーザーが制御する通常のシェーダーグラフのキーワードとは異なり、これは HDRP が内部的に設定するグローバルキーワード です。HD Render Pipeline アセットでは、Default Material Quality Level だけでなく、Available Material Quality Levels でも制御できます。
各カメラについて、デフォルトの Frame 設定を上書きし、Material Quality Level を指定して、有効な HD Render Pipeline アセットを上書きすることができます。
HDRP では、アーティストによる設定をシステム的に処理しています。結局のところ、アーティストにとって優れた UX を維持することが、高品質なコンテンツを生み出す鍵となるのです。
簡単な設定で HDRP プロジェクトを開始すると、パフォーマンスのために意外なほどコストをかけてしまうことがあります。これは、HDRP が 使用する機能の多くをデフォルトで決定するためです。ベストプラクティスは、HDRP 設定をコントロールすることで、使用する予定の分だけコストをかけるようにすることです。
レンダリングの最小限の負荷を表現するために、シーンを作成してみましょう。デフォルトのマテリアルを使用する 225 個のキューブを配置し、スポットライト、ポイントライト、ディレクショナルライト、アンビエントライトで照らします。
Nsight Graphics を使用して GPU のキャプチャーを取ると、HDRP がデフォルトでいくつかの機能を有効にしているためにこの現象が起こることがわかります。
こちらで確認できるように、HDRP アセットを制御したり、カメラの Frame 設定を上書きしたり、Volume の上書き設定を追加したりして、最低限の機能のみを有効にすることができます。別の言い方をすると、以下のようになります。
修正後の結果は、平均フレーム時間がわずか 2.45ms となり、同じシーンをビルトインレンダーパイプラインでレンダリングした場合に比べて大幅に改善されました。
実際のゲームでは、メインカメラでこれほど多くの機能をオフにする必要はありませんが、カメラを追加した場合は、この処理が必要になることがあります。
さらにカメラのコストを下げたい方は、Unity 2021.2 の HDRP UI Camera Stacking パッケージを利用すると、標準的なカメラに比べてわずかなコストで複数のカメラのレンダリング UI をスタックすることができるので、こちらもお試しください。
この例は、HDRP のパフォーマンス特性を制御できる範囲を示すだけでなく、HDRP プロジェクトの設定を調整することの重要性を示しています。
HDRP を最大限に活用するためのライティングの技術的な詳細について解説した決定版の HDRP ガイドを今年中に公開する予定です。ご期待ください。