HDRP の設定に詳しくなってパフォーマンスを上げよう

HD レンダーパイプライン(HDRP)の設定を活用してパフォーマンスを最大化し、パワフルなグラフィックスを一度に実現する方法をご紹介します。
Unity 2020 LTS 以降の HDRP バージョン 10 のリリースにより、HDRP パッケージは引き続き、ユーザーフレンドリーなインターフェース、柔軟な機能、安定性、全体的なパフォーマンスを優先してきました。しかし、HDRP を最適化した形で使うには、主要な設定項目をすべて理解し、それらがどのように機能し、何をするのかを理解することが重要です。そのため、CPU/GPU プロファイラーのキャプチャ、 レンダーパイプラインのデバッグビュー、HDRP のシェーダーフレームワークの観点から、HDRP がどのように動作するかを調べています。
このブログでは、グラフィックスのデバッグからプロファイリングや最適化まで、Custom Pass APIやパッケージの別のローカル部分を使用してプロジェクト用に HDRP をカスタマイズするのに役立つヒントを紹介します。
フレームの解析を始める前に、まずは HDRP の機能を知ることが大切です。Unite Now のプレゼンテーション 「HDRP を使用したゲームの高忠実度グラフィックスの実現」、Unity の High Definition Render Pipeline を使用したレイトレーシングに関する ウェビナー、および ボリューメトリッククラウド、レンズフレア、ライトアンカーに関する 講演を視聴することをお勧めします。これらはすべて HDRP の優れたガイドです。
ビルトインレンダーパイプラインから HDRP への移行は、調整に時間がかかることが多いようです。これは以下のような理由によります。
- HDRP には統一された物理ベースのレンダリング フレームワークがあり、その属性には現実世界の単位が使用されます。露出値は カメラの光感度に使用され、 カンデラは 光の強度に使用されます。Unite Nowの講演で は、シーンの照明を当てる際に一貫した結果を得るために物理ベースで考える方法を説明します。
- HDRP プロジェクトでは多数のパラメーターを制御でき、そしてこれらのパラメーターがいろいろな場所に存在しています。これは、HDRP がより多くの機能を搭載しているだけでなく、アーティストとエンジニアの両方が作業を微調整し、最適化するためのより深いカスタマイズ機能を備えていることが理由の 1 つです。
この HDRP の機能を知るために、まずはグローバル設定を見てみましょう。
グローバル設定
組み込みレンダリング パイプラインの場合、 グラフィックス 設定はプロジェクトごとのグラフィックス設定のほとんどをカバーします。また、Windows、Linux、Mac、Xbox などの特定のターゲット プラットフォームのコンテキストでの一般的なグラフィック設定が含まれる プレーヤー 設定もあります。

HDRP プロジェクトでも Graphics 設定と Player 設定は使われますが、レンダーパイプラインの詳細なデフォルト設定にアクセスするための 3 つの設定が追加されています。
- たとえば、グラフィック設定では、 スクリプタブル レンダー パイプライン (SRP) 設定はデフォルトの HD レンダー パイプライン アセットを参照します。この HD レンダー パイプライン アセットには、各 品質レベルで上書きできる設定が含まれています。
- HDRP デフォルト設定 タブでは以下を設定します。
- デフォルトの フレーム 設定。各カメラ (平面反射または反射プローブに使用されるカメラを含む) に対してオーバーライドできるデフォルトのプロパティが含まれます。ここではカメラがデフォルトで透明なオブジェクトのレンダリングを行うか決めることができます。
- デフォルトの ボリューム コンポーネント。シーン内のカメラの位置ごとにオーバーライドできるプロパティが含まれています。たとえば、デフォルトのポストプロセス効果の強度を定義し、それを上書きして、シーンに特定の ボリューム を使用して「屋外では強く、屋内では弱く」することができます。
- デフォルトの拡散プロファイル アセット プロパティ。HDRP のデフォルト設定タブのボリューム コンポーネント セクションにある 拡散プロファイル オーバーライド コンポーネントによってオーバーライドできます。これは、「シーン内のカメラ位置」で上書きすることができます。現在、Diffusion Profile システムには「冗長な上書きレイヤー」も存在しますが、HDRP については常に UX の向上を目指しており、この問題を解決するための作業にもすでに着手しています。
- その他のプロパティは、「純粋なグローバル設定」であり、上書きすることはできません。
- 最後に、構成を必要としない可能性が高い低レベルの設定が HDRP Config パッケージで指定されています。これらの設定は、「純粋なグローバル設定」でもあります。これらを変更するには、C# アセンブリと HDRP シェーダーフレームワークを再コンパイルする必要があります。これがこれらの設定項目が異なる場所に配置されている理由です。
品質レベル
組み込みのレンダリング パイプラインを使用すると、[品質設定] タブでさまざまな品質レベルを定義できます。品質レベルごとに、異方性テクスチャの使用など、一部のグラフィックス設定を指定することで、ローエンドのプラットフォームでのハードウェアリソースの使用を抑えることができます。
特に HDRP プロジェクトでは、品質レベルごとにオーバーライド HD レンダー パイプライン アセットを 選択できます。HD レンダー パイプライン アセットには、画面上の 指向性ライト、 点在ライト、 エリア ライトの最大数、 カラー グレーディング LUT サイズ、 ライト クッキー アトラス サイズなどのいくつかのパラメータが格納されるため、組み込みのレンダー パイプラインに比べて構成の柔軟性が高まります。
ビルトインレンダーパイプラインプロジェクトの Quality Settings タブにある一部のプロパティは、ビルトインレンダーパイプラインにのみ適用されます。HDRP プロジェクトでは、これらの設定が元の場所から消え、別の場所で「置き換えられた設定」として現れることがあります。
たとえば、組み込みのレンダリング パイプライン プロジェクトでは、[品質設定] タブで シャドウ解像度 プロパティを制御します。ただし、HDRP プロジェクトでは、HD レンダー パイプライン アセットの [ライティング] > [シャドウ] セクションでシャドウ マップの解像度を制御します。


カメラとフレームの設定
HDRP でシーンをレンダリングするには、組み込みのレンダリングパイプラインと同様に カメラ を追加する必要があります。HDRP は、追加の HD 追加カメラ データ コンポーネント (同じゲーム オブジェクトにアタッチされている) も使用して、カメラごとの追加パラメーターを保存します。
HDRP には、カメラごとにカスタマイズできるパラメーターが多数あります。物理カメラの 設定はいくつかあり、カメラの カスタム フレーム設定 プロパティにチェックを入れると、 フレーム設定 システムを通じてカメラがフレームを描画する方法を決定できます。
Frame Settings システムは、カメラのプロパティを上書きするデータのスタックです。HDRP のデフォルト設定タブでフレーム設定のデフォルト値を指定できます。さらに、各カメラはデフォルトのフレーム設定 を上書き できます。
レンダー パイプライン デバッグ ウィンドウ の カメラ パネルは 、フレーム設定のオーバーライド スタックを視覚化するのに役立ちます。
カメラパネルの使用
下に示した例は、Render Pipeline Debug ウィンドウの Camera パネルの動作を示しています。
シーン内にメインカメラと呼ばれるカメラがあります。Main Camera は静的なオブジェクトのみを描画します。HDRP Default Settings タブでは、モーションベクターの描画を有効化できますが、Main Camera で Frame 設定を上書きする場合はこの機能は無効にされ、全体のパフォーマンスが向上します。
モーション ベクトル オーバーライド スタックには、DefaultFrame 設定の左側に OverriddenFrame 設定の状態が表示されます。図 4 で「A」を付けて強調されている部分をご覧ください。

さらに、Render Pipeline Debug ウィンドウには、OverriddenFrame 設定の左側に SanitizedFrame 設定の状態が表示されます。サニタイズすることで、Overridden Frame 設定を一貫した状態に保つことができます。同じ例を見ると、不透明オブジェクトの動きと透明オブジェクトの動きは、メインカメラのフレーム設定のオーバーライドで明示的に無効化されていません。しかし、Motion Vector が無効になっているため、図 4 で「B」を付けて強調した部分で示されているように、これらの依存する機能もサニタイズシステムによってオフにされます。
Volume システム
Unite Nowの講演で説明したように、HDRP は ボリューム システムをサポートしています。組み込みレンダリングパイプラインの ポストプロセススタック と同様に、HDRP ボリュームシステムはポストプロセスを制御します。しかし、さらに、 空のレンダリング方法、 間接光の強さ、 影の設定など、さまざまな機能を決定します。
簡単に言えば、HDRP の Volume システムは、カメラがシーン内を移動する際にレンダリング設定を変更するために使用できる抽象的なフレームワークです。Volume プロパティごとに、ハードコードされた Default Value があります。これらの値を確認するには、レンダー パイプライン デバッグ ウィンドウの ボリューム パネル を使用します。図 5 の右端の列では、Lens Distortion の Default Intensity の値が 0 になっています。

これらのハードコードされたデフォルトのプロパティは 、HDRP のデフォルト設定タブのボリューム コンポーネント セクションのプロパティ オーバーライドによって上書きできます。なお、これらのプロパティの上書きは、シーン内の Volume でも同じように行うことができます。
逆に Camera は、シーン内の Volume から取ったプロパティ値をブレンドしたものを取り込みます。何もない場合は、HDRP Default Settings タブからプロパティ値を拾います。そうでなければ、ハードコードされたデフォルトのプロパティ値を拾います。
図 5 に示すように、Render Pipeline Debug ウィンドウの Volume パネルは、現在の Volume プロパティの上書きスタックを視覚化するのに便利です。現在使用されている Volume プロパティが表示されるので、デバッグ時には特に効果的です。
メッシュとサーフェス
組み込みのレンダリング パイプラインと同様に、レンダリングされるジオメトリは通常、シーン内の メッシュ レンダラー または スキン メッシュ レンダラー によって指定されます。HDRP 固有のデータは主に マテリアルに保存され、適切なレンダラーまたは シェーダーグラフを使用できるようになります。
照明
組み込みレンダリングパイプラインと同様に、HDRP プロジェクトには、ライトごとに HDRP 固有のデータ ストレージを備えた ライト があります。HD 追加ライト データ コンポーネントは、通常のライト コンポーネントと一緒に接続されます。
ライティングの設定は、Light コンポーネントの付いたゲームオブジェクト以外の場所で行われることが多いことを考慮してください。ここではその例を 2、3 件ご紹介します。
- 間接照明は、 ライト プローブ グループ、 反射プローブ (HD 追加反射データ が添付されている)、 平面反射プローブ、および 照明設定によって決定されます。間接照明コントローラーボリューム コンポーネントで調整することもできます。
- ボリューム システムは 空の照明を決定します。
- また、Volume システムは、スクリーン空間に関連するエフェクトを制御します。これらの効果は、照明や影のソースのように機能します。スクリーン スペース反射、 スクリーン スペース屈折、 スクリーン スペース グローバル イルミネーション、 スクリーン スペース アンビエント オクルージョン、および コンタクト シャドウ。
- サブサーフェス スキャタリングは 、「表面間の照明」もシミュレートします。ほとんどの表面下散乱プロパティは 拡散プロファイルによって指定され、拡散プロファイルは マテリアルによって決定されます。一方、ボリューム システムを活用して 拡散プロファイル オーバーライドを選択することもできます。

さて、ここまで HDRP の UX についてご紹介してきましたが、あまり馴染みのないグラフィックプロパティの中から皆さんの次の HDRP プロジェクトで役立つものに注目してみましょう。図 7 は、一般的な設定を上部に、上書きする設定を下部に配置した場合のアプローチを示しています。ご覧になるとわかるように、上から下に向かうにつれてスコープは拡大します。

HDRP の Graphics 設定は、以下に適応する必要があります。
- 番組が流されるプラットフォームなど、番組の品質レベル
- 現在有効なカメラ
- シーン内のカメラの位置
- レンダリングされたジオメトリのマテリアル
- レンダリングされたジオメトリに影響するライト
なお、HDRP の設定は、特に設定の次元に気を配る必要があります。
設定の次元間での衝突
以下の設定の次元には、しばしば矛盾が生じます。
- 品質レベルの設定と現在の有効なカメラの設定が、同じグラフィックパラメーターに影響を与えることがあります。たとえば、ローエンド デバイスの Subsurface Scattering サンプリング数を減らしたい場合は、ピクチャー イン ピクチャー効果のためにテクスチャをレンダリングするカメラの Subsurface Scattering サンプリング数も減らす必要があります。
- 品質レベルの設定とシーン内のカメラ位置の設定が、同じグラフィックパラメーターに影響を与えることがあります。GPU の能力が限られているプラットフォームでポストプロセッシングエフェクトの品質を抑えたい場合は、一部のシーンの領域で複雑なライティングを行うために、すでにかなりの GPU 時間を消費しているという事実を認識しておく必要があります。そのため、これらの場所ではポストプロセッシングエフェクトの品質を下げ、パフォーマンス予算を回復するように努める必要があります。
- 品質レベルの設定とシーン内のライトの設定が、同じグラフィックパラメーターに影響を与えることがあります。そのため、RAM が限られている場合にシャドウマップの解像度を下げたい場合は、解像度の低いシャドウマップを必要とする、小さなシャドウを落とすスポットライトがシーン内に多数存在する可能性があることを念頭に置く必要があります。
これらの競合に対処するために、HD レンダー パイプライン アセットは階層化設定をサポートしています。プロパティに対して 1 つの値のみを示すのではなく、複数の値を複数の階層 (低、中、高、場合によっては超階層) に割り当てることができます。



ピクチャーインピクチャー効果をレンダリングするカメラでは、後処理効果を制御するボリュームとシャドウマップを要求するスポットライトの両方に階層を指定できます。



HDRP は、有効な HD Render Pipeline アセットの適切な階層から、そのプロパティを検索することができます。使われるのはこのプロパティです。
もちろん、カメラやボリューム、ライトなどは、階層別の設定システムを無視して、望ましい振る舞いを直接決めることも可能です。
3 つの設定の次元が重なる
設定の次元が重なっている別の例を見てみましょう。
複雑な頂点アニメーションを持つシェーダーグラフを使うメッシュレンダラーがシーン内にあるとします。ローエンドのデバイスで頂点アニメーションを実行するのは負荷が高すぎるかもしれません。また、ピクチャーインピクチャー効果に関しては、レンダーテクスチャのために考慮すべき余分なカメラレンダリングがありますので、どんな頂点アニメーションでもレンダリングするための余分なカメラは必要ありません。
この場合、以下の 3 つの設定の次元が重なることになります。
- シーン内のジオメトリのマテリアル
- プログラムの品質レベル
- シーン内のカメラ
このようなケースに対処するために、シェーダーグラフでは特別な マテリアル品質 キーワードを使用できます。

マテリアルごとにユーザーによって制御される通常のシェーダーグラフ キーワードとは異なり、これは 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 にデフォルトでアクティブになっている機能がいくつかあるためにこのようなことが起こることがわかります。
- SSAO、サブサーフェススキャタリング、動的露出、モーションブラー、ブルームなど、多くのビジュアルエフェクトが追加で有効になっています。
- 複数の Color Pyramid パスと Upsample Low-res Transparent パスが動作し、複雑な透明なオブジェクトのレンダリングをサポートしようとしています。

ここでわかるように、HDRP アセットを制御し、カメラの フレーム設定をオーバーライドし、 ボリュームオーバーライドを追加して、絶対に最小限の機能のみを有効にすることができます。別の言い方をすると、以下のようになります。
- HDRP アセットでは、Decals、Low-res Transparency、Transparent Backface、Depth Prepass、Depth Postpass、SSAO、SSR、Contact Shadows、Volumetrics、Subsurface Scattering、および Distortions をすべて無効にします。
- カメラの Frame 設定では、Refraction、Post-Process、After Post-Process、Transmission、Reflection Probe、Planar Reflection Probe、および Big Tile Prepass をすべて無効にします。
- Volume では、Exposure モードを Fixed Exposure に上書きします。
修正後の結果は、平均フレーム時間がわずか 2.45ms となり、同じシーンをビルトインレンダーパイプラインでレンダリングした場合に比べて大幅に改善されました。
実際のゲームでは、メインカメラでこれほど多くの機能をオフにする必要はありませんが、カメラを追加した場合は、この処理が必要になることがあります。
さらに安価なカメラに興味がある場合は、2021.2 の HDRP UI カメラスタッキングパッケージを使用する と、標準カメラのほんの一部のコストで複数のカメラレンダリング UI をスタックできます。
この例は、HDRP のパフォーマンス特性を制御できる範囲を示すだけでなく、HDRP プロジェクトの設定を調整することの重要性を示しています。

それは光から始まります。高解像度レンダリングパイプラインの決定版ガイド
Unity 2020 LTS の HDRP には、刺激的なハイエンドのライティングをゲームにもたらすための改良されたツールが搭載されています。今回新しく作られた詳細まで踏み込んだガイドを入手していただき、HDRP における物理ベースのライティングの力を活用する方法を学んでください。