Unity を検索

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

2021年10月22日 カテゴリ: テクノロジー | 13 分 で読めます
Graphic of city streets created by HDRP
Graphic of city streets created by HDRP
シェア

HD レンダーパイプライン(HDRP)の設定を活用してパフォーマンスを最大化しつつ、パワフルなグラフィックスを実現する方法をご紹介します。

Unity 2020 LTS 以降に対応した HDRP バージョン 10 をリリースするにあたって、HDRP パッケージは、ユーザーフレンドリーなインターフェース、柔軟性のある機能、安定性、および包括的なパフォーマンスといった要素の充実を優先してきました。しかし、HDRP を最適化した形で使うには、主要な設定項目をすべて理解し、それらがどのように機能し、何をするのかを理解することが重要です。そこで今回は、CPU/GPU プロファイラーのキャプチャー、Render Pipeline Debug ビュー、HDRP のシェーダーフレームワークの観点から、HDRP の動作を見ていきます。

グラフィックスのデバッグからプロファイリングや最適化まで、このブログでは、Custom Pass API や、その他パッケージの一部分を使って、皆さんのプロジェクトに合わせて HDRP をカスタマイズするためのヒントをお伝えします。

HDRP UX の構造

フレームの解析を始める前に、まずは 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は、統一された、 物理ベース のレンダリングフレームワークを持っています。つまり、その属性は実世界の単位を使っています。カメラの光感度には露出値が、光の強さを表すにはカンデラが使われます。Unity による Unite Now 講演では、シーンのライティングを行って一貫した結果を得るために、物理ベースでどのように考えればいいかを解説しています。
  • HDRP プロジェクトでは多数のパラメーターを制御でき、そしてこれらのパラメーターがいろいろな場所に存在しています。これは、HDRP がより多くの機能を搭載しているだけでなく、アーティストとエンジニアの両方が作業を微調整し、最適化するためのより深いカスタマイズ機能を備えていることが理由の 1 つです。

この HDRP の機能を知るために、まずはグローバル設定を見てみましょう。

グローバル設定

ビルトインレンダーパイプラインでは、Graphics 設定で、プロジェクトごとのグラフィック設定のほとんどがカバーされます。また、Player 設定もあります。これは、Windows、Linux、Mac、Xbox など、特定のターゲットプラットフォームのコンテキストでの一般的なグラフィック設定を含んでいます。

Image of where the graphics setting can be found in HDRP projects
図 1:HDRP プロジェクトの Global Graphics 設定の場所を確認する。

HDRP プロジェクトでも Graphics 設定と Player 設定は使われますが、レンダーパイプラインの詳細なデフォルト設定にアクセスするための 3 つの設定が追加されています。

  • たとえば、Graphics 設定では、スクリプタブルレンダーパイプライン(SRP)の設定は、デフォルトの HD Render Pipeline アセットを参照しています。この HD Render Pipeline アセットには、品質レベルごとに上書きできる設定が含まれています。
  • HDRP Default Settings タブでは以下の設定が行えます。
    • デフォルトの Frame 設定。各カメラ(平面反射またはリフレクションプローブに使用されるカメラを含む)ごとに上書きできるデフォルトのプロパティがあります。ここでは、カメラが透明なオブジェクトをデフォルトでレンダリングするかどうかを決めることができます。
    • デフォルトの Volume コンポーネント。「シーン内のカメラ位置」ごとに上書き可能なプロパティが含まれています。たとえば、デフォルトのポストプロセッシングエフェクトの強さを定義し、それを上書きすることで、シーンに応じた特定のボリューム を使用して「屋外では強く、屋内では弱い」状態にすることができます。
    • Default Diffusion Profile Assets プロパティ。HDRP Default Settings タブの Volume components セクションにある Diffusion Profile Override コンポーネントによって上書きすることができます。これは、「シーン内のカメラ位置」で上書きすることができます。現在、Diffusion Profile システムには「冗長な上書きレイヤー」も存在しますが、HDRP については常に UX の向上を目指しており、この問題を解決するための作業にもすでに着手しています。
    • その他のプロパティは、「純粋なグローバル設定」であり、上書きすることはできません。
  • 最後に、設定が必要になる可能性が低い低レベルの設定については、HDRP Config パッケージで指定されています。これらの設定は、「純粋なグローバル設定」でもあります。これらを変更するには、C# アセンブリと HDRP シェーダーフレームワークを再コンパイルする必要があります。だからこそ、別の場所に置かれているのです。

品質レベル

ビルトインレンダーパイプラインでは、 Quality Settings タブで、複数の品質レベルを定義することができます。品質レベルごとに、異方性テクスチャの使用など、一部のグラフィックス設定を指定することで、ローエンドのプラットフォームでのハードウェアリソースの使用を抑えることができます。

HDRP プロジェクトでは特に、上書きを行う HD Render Pipeline アセットを品質レベルごとに選択することができます。 HD Render Pipeline アセットには、画面上のにディレクショナルライトパンクチュアルライトエリアライトの数、カラーグレーディング LUT のサイズライトクッキーのアトラスのサイズなど、いくつかのパラメーターが保存されているため、ビルトインレンダーパイプラインと比較して、より多くの設定を行うことができます。

ビルトインレンダーパイプラインプロジェクトの Quality Settings タブにある一部のプロパティは、ビルトインレンダーパイプラインにのみ適用されます。HDRP プロジェクトでは、これらの設定が元の場所から消え、別の場所で「置き換えられた設定」として現れることがあります。

たとえば、ビルトインレンダーパイプラインプロジェクトでは、Quality Settings タブで Shadow Resolution プロパティを制御できます。しかし、HDRP プロジェクトでは、HD Render Pipeline アセットの Lighting > Shadows セクションで、シャドウマップの解像度を制御します。

Screenshot of properties in the quality settings within a built-in render pipeline project vs a HDRP project
図 2:HDRP プロジェクトでは、Quality 設定のプロパティが少ない。
Many properties in the quality settings are moved to the HD Render Pipeline Asset
図 3:これは、多くのプロパティが HD Render Pipeline アセットに移動しているため。

カメラとフレームの設定

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 の上書きスタックの視覚化に役立ちます。

Camera パネルの使い方

下に示した例は、Render Pipeline Debug ウィンドウの Camera パネルの動作を示しています。

シーン中に Main Camera というカメラがあります。Main Camera は静的なオブジェクトのみを描画します。HDRP Default Settings タブでは、モーションベクターの描画を有効化できますが、Main Camera で Frame 設定を上書きする場合はこの機能は無効にされ、全体のパフォーマンスが向上します。

Motion Vectors の上書きスタックでは、 Default Frameの設定の左側に Overridden Frame の設定 の状態が表示されます。図 4 で「A」を付けて強調されている部分をご覧ください。

Frame Settings override stack displayed by the Render Pipeline Debug window
図 4:Render Pipeline Debug ウィンドウで表示される Frame Settings 上書きスタック

さらに、 Render Pipeline Debug ウィンドウでは、Overridden Frame 設定の左側に Sanitized Frame 設定の状態が表示されています。 サニタイズすることで、Overridden Frame 設定を一貫した状態に保つことができます。同じ例を見てみると、Opaque Object Motion と Transparent Object Motion は、 Main Camera の Frame Settings の上書き設定で明示的に無効化されていません。しかし、Motion Vector が無効になっているため、図 4 で「B」を付けて強調した部分で示されているように、これらの依存する機能もサニタイズシステムによってオフにされます。

Volume システム

Unite Now の 講演で述べたように、HDRP はVolume システムをサポートしています。ビルトインレンダーパイプラインのポストプロセッシングスタックと同様に、HDRP の Volume システムはポストプロセッシングを制御します。さらに、空のレンダリング方法間接光の強さいくつかの影の設定なども決定します。

簡単に言えば、HDRP の Volume システムは、カメラがシーン内を移動する際にレンダリング設定を変更するために使用できる抽象的なフレームワークです。Volume プロパティごとに、ハードコードされた Default Value があります。これらの値を確認するには、Render Pipeline Debug ウィンドウの Volume パネルを使います。図 5 の右端の列では、Lens Distortion の Default Intensity の値が 0 になっています。

Volume override stack displayed by the Render Pipeline Debug window
図 5:Render Pipeline Debug ウィンドウで表示される Volume 上書きスタック

これらのハードコードされたデフォルトのプロパティは、 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 件ご紹介します。

Indirect Lighting Controller Volume component
図 6:Indirect Lighting Controller Volume コンポーネント

プロパティを探す

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

one possible routine to search for graphics properties in your HDRP project
図 7:HDRP プロジェクトでグラフィックスのプロパティを検索するためのルーチンの一例。

グラフィックス設定の範囲

HDRP の Graphics 設定は、以下に適応する必要があります。

  • 番組が流されるプラットフォームなど、番組の品質レベル
  • 現在有効なカメラ
  • シーン内でのカメラの位置
  • レンダリングされたジオメトリのマテリアル
  • レンダリングされたジオメトリに影響を与えるライト

なお、HDRP の設定は、特に設定の範囲に気を配る必要があります。

設定の範囲の衝突

しばしば以下のような設定の範囲の衝突が生じます。

  • 品質レベルの設定と現在の有効なカメラの設定が、同じグラフィックパラメーターに影響を与えることがあります。例えば、ローエンドデバイスでサブサーフェススキャタリングのサンプリング数を減らそうとした時に、ピクチャーインピクチャー効果のためにレンダーテクスチャ にレンダリングするカメラでも、サブサーフェススキャタリングのサンプリング数を減らしたい場合があります。
  • 品質レベルの設定とシーン内のカメラ位置の設定が、同じグラフィックパラメーターに影響を与えることがあります。そのため、GPUパワーが限られたプラットフォームで後処理効果の質を落としたい場合、一部のシーンでは複雑なライティングにすでにかなりのGPU時間を使っているという事実を認識しておく必要があります。そのため、これらの場所ではポストプロセッシングエフェクトの品質を下げ、パフォーマンス予算を回復するように努める必要があります。
  • 品質レベルの設定とシーン内のライトの設定が、同じグラフィックパラメーターに影響を与えることがあります。そのため、RAM が限られている場合にシャドウマップの解像度を下げたい場合は、解像度の低いシャドウマップを必要とする、小さな影を落とすスポットライトがシーン内に多数存在する可能性があることを念頭に置く必要があります。

これらの衝突を解決するために、HD Render Pipeline アセットは、階層化された 設定をサポートしています。1 つのプロパティに対して 1 つの値を示すのではなく、複数の値を「Low」「Medium」「High」、場合によっては「Ultra」のような複数の階層に割り当てることができます。

value specified for each tier
value specified for each tier
value specified for each tier
図 8:各階層ごとに指定された値がある。

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

Specify tiers rather than values.
Specify tiers rather than values.
Specify tiers rather than values.
図 9:値ではなく階層を指定する。

HDRP は、有効な HD Render Pipeline アセットの適切な階層から、そのプロパティを検索することができます。使われるのはこのプロパティです。

もちろん、カメラやボリューム、ライトなどは、階層別の設定システムを無視して、望ましい振る舞いを直接決めることも可能です。

3 つの設定の範囲が重なる例

設定の範囲が重なっている別の例を見てみましょう。 

複雑な頂点アニメーションを持つシェーダーグラフを使うメッシュレンダラーがシーン内にあるとします。ローエンドのデバイスで頂点アニメーションを行うにはコストがかかりすぎるかもしれません。また、ピクチャーインピクチャー効果に関しては、レンダーテクスチャのために考慮すべき余分なカメラレンダリングがありますので、どんな頂点アニメーションでもレンダリングするための余分なカメラは必要ありません。

この場合、以下の 3 つの設定の範囲が重なることになります。

  • シーン内のジオメトリのマテリアル
  • プログラムの品質レベル
  • シーン内のカメラ

このようなケースに対応するために、シェーダーグラフには特別な Material Quality キーワードが用意されています。

The Material Quality keyword in Shader Graph
図 10:シェーダーグラフの Material Quality キーワード

マテリアルごとにユーザーが制御する通常のシェーダーグラフのキーワードとは異なり、これは HDRP が内部的に設定するグローバルキーワード です。HD Render Pipeline アセットでは、Default Material Quality Level だけでなく、Available Material Quality Levels でも制御できます。

The Available Material Quality Levels and Default Material Quality Level
図 11:Available Material Quality Levels と Default Material Quality Level

各カメラについて、デフォルトの Frame 設定を上書きし、Material Quality Level を指定して、有効な HD Render Pipeline アセットを上書きすることができます。

Specifying Material Quality Level from a camera’s Frame Settings override
図 12:カメラの Frame Settings を上書きして Material Quality Level を指定する

HDRP では、アーティストによる設定をシステム的に処理しています。結局のところ、アーティストにとって優れた UX を維持することが、高品質なコンテンツを生み出す鍵となるのです。

HDRP 設定の最適化

簡単な設定で HDRP プロジェクトを開始すると、パフォーマンスのために意外なほどコストをかけてしまうことがあります。これは、HDRP が 使用する機能の多くをデフォルトで決定するためです。ベストプラクティスは、HDRP 設定をコントロールすることで、使用する予定の分だけコストをかけるようにすることです。

レンダリングの最小限の負荷を表現するために、シーンを作成してみましょう。デフォルトのマテリアルを使用する 225 個のキューブを配置し、スポットライト、ポイントライト、ディレクショナルライト、アンビエントライトで照らします。

Scene of 225 cubes example
図 13:簡単なシーンの設定

この簡単な設定の性能はどのようなものでしょうか。IL2CPP スクリプトバックエンドで、VSync をオフにして、解像度 2880x1620 のスタンドアロンプレーヤーをビルドしてみましょう。Intel i9-10980HK GPU と NVIDIA RTX2080 GPU を搭載した Windows マシンでプレイヤーを実行したところ、プロファイラーで計測された平均フレーム時間は 4.6ms となりました。

プロファイラーの Timeline ビューを見ると、DXGI.WaitOnSwapChain マーカーにかなりの時間が費やされており、GPU バウンドであることがわかります。

Both the Built-in Render Pipeline and HDRP tests are GPU bound.
図 14:ビルトインレンダーパイプラインと HDRP のテストでは、いずれも GPU バウンドになる。

Nsight Graphics を使用して GPU のキャプチャーを取ると、HDRP がデフォルトでいくつかの機能を有効にしているためにこの現象が起こることがわかります。

  • SSAO、サブサーフェススキャタリング、動的露出、モーションブラー、ブルームなど、多くのビジュアルエフェクトが追加で有効になっています。
  • 複数の Color Pyramid パスと Upsample Low-res Transparent パスが動作し、複雑な透明なオブジェクトのレンダリングをサポートしようとしています。
HDRP has many effects and passes turned on by default.
図 15:HDRP には様々なエフェクトがあり、デフォルトではパスがオンになっている。

こちらで確認できるように、HDRP アセットを制御したり、カメラの Frame 設定を上書きしたり、Volume の上書き設定を追加したりして、最低限の機能のみを有効にすることができます。別の言い方をすると、以下のようになります。

  • 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 となり、同じシーンをビルトインレンダーパイプラインでレンダリングした場合に比べて大幅に改善されました。

実際のゲームでは、メインカメラでこれほど多くの機能をオフにする必要はありませんが、カメラを追加した場合は、この処理が必要になることがあります。

さらにカメラのコストを下げたい方は、Unity 2021.2 の HDRP UI Camera Stacking パッケージを利用すると、標準的なカメラに比べてわずかなコストで複数のカメラのレンダリング UI をスタックすることができるので、こちらもお試しください。

この例は、HDRP のパフォーマンス特性を制御できる範囲を示すだけでなく、HDRP プロジェクトの設定を調整することの重要性を示しています。

これからの展開

Unity branded raytraced ball image

Unity が近日中に公開する HDRP のガイド

HDRP を最大限に活用するためのライティングの技術的な詳細について解説した決定版の HDRP ガイドを今年中に公開する予定です。ご期待ください。

2021年10月22日 カテゴリ: テクノロジー | 13 分 で読めます
関連する投稿