Unity の HD レンダーパイプライン(HDRP)が、公式にバーチャルリアリティー対応となりました。Unity 2019.3 とパッケージバージョン 7.2.0 で、HDRP は検証済みとなり、VR での使用が可能になっています。
本記事では、VR プロジェクトにおける HDRP の使用についての技術的な詳細をお届けします。HDRP でどんなことが可能かを詳しくお知りになりたい方は、こちらのブログ記事をご覧ください。
HDRP の VR 対応は、以下の形で行われています。
HDRP を VR プロジェクトに使用すれば、このレンダーパイプラインの全機能をフルに活用することができ、ご自身の想像力の及ぶ限りに、自由に体験を創り出すことができます。HDRP は、その最新鋭レンダリング技術によって、非常に美しいフォトリアリスティックなビジュアルを、従来のバーチャルリアリティー環境にはほとんど見られなかった品質で提供することができます。
以下に、VR プロジェクトで使用できる機能をごく簡単にご紹介します。
現在、VR 向け HDRP は以下のプラットフォームおよびデバイスでご利用になれます。
[OpenVR]Valve は現在、バージョン 2019.3 以降の Unity 向けに OpenVR Unity XR Plugin の開発を進めており、これは近い将来に公開が予定されています。
ステレオレンダリングの各種方法
ネイティブの VR 実装は、全ての処理を 2 回(両方の眼に 1 回ずつ)実行します。私たちはこのソリューションをマルチパスレンダリングと呼んでいます。HDRP はマルチパスレンダリングに対応していますが、この方法を用いるとアプリケーションがレンダリングに消費する CPU 能力が 2 倍になり、したがってドローコールの数が 2 倍になるので推奨されません。これだけでなく、シャドウが 2 回レンダーされるので GPU 予算のかなりの割合が消費される可能性もあります。
ただし、上記を踏まえた上でも、以下の場合にはマルチパスの使用が適切になります。
より速いソリューションは、シングルパス(インスタンスト)レンダリングの使用です。このモードでは、各ドローコールが両眼に同時にレンダーされます。これは、レンダーターゲットとインスタンス化されたドローコールにテクスチャ配列を使用することによって行われます。さらに、カリングとシャドウの処理の実行が、フレームごとに 1 回のみになります。
HDRP は、全ての機能が VR に対応し、シングルパスレンダリング向けに最適化された形で設計されています。
デザインに関して私達が行った重要な決断は、テクスチャ配列を(VR 向け制作ではない場合も含め)全てのレンダーターゲットに使用することでした。この方法とシェーダーマクロの組み合わせが、自動的に VR に対応する※シェーダーの作成を可能にしました。(※ライトリストの生成、間接光とタイルのディファ―ドシェーディング、ボリューメトリックライティング、カメラに相対的なレンダリングなどの、特殊なケースを除きます。)
HDRP は 2 倍幅テクスチャのシングルパスレンダリングには対応していませんのでご注意ください。この理由は、複雑性が高くなること、また全画面の全てのパスやエフェクトにオーバーヘッドが発生するためです。
HDRP で VR のご使用を開始されるには、Unity ドキュメンテーションのVR Overviewのセクションをご参照ください。HDRP の VR 向けセットアップ用に HDRP Wizard もご提供しています。このウィザードは設定を検証し、(ウィザードによって)適切でないと判定された設定の修正をサポートします。
新しい XR プラグインフレームワークを使用してプロジェクトの VR 向け設定を手動で行われる場合はドキュメンテーションをご参照ください。シングルパスレンダリングを設定するには、プロジェクト設定を Single-Pass Stereo Rendering モードに設定し、かつ HDRP アセット設定も Single Pass に設定する必要があります。これら 2 つの設定のどちらかでシングルパスが無効になっている場合、HDRP はデフォルトでマルチパスに設定されます。
アンチエイリアシング
VR で素晴らしいユーザー体験を作成し、バーチャル環境の没入感を損なわないようにするためには、エイリアシングの削減が非常に重要です。HDRP には、アンチエイリアシングのソリューションがいくつか提供されています。
カメラの各種アンチエイリアシングモードに関しては、Unity のドキュメンテーションにて詳細な説明をお読みいただけます。以下を含む各種オプションが提供されています。
パフォーマンス
VR のレンダリングは、両眼に表示するためにリフレッシュレートと解像度が高くなるので、極めて高負荷です。HDRP アセット設定内で、不要な機能は全て無効にするようにしてください。ボリューメトリックなどの機能は、最低限必要な 90 FPS を満たすパフォーマンスを備えていないため、対応されてはいますが VR アプリケーションには適しません。パフォーマンスのモニタリングとプロファイリングを頻繁に行うことが、プロジェクトのボトルネックの特定に役立ちます。
VR のボリューメトリックエフェクト(z スライス)の精度はデフォルトで半分になりますのでご注意ください。これは、GPU パフォーマンスをより許容可能なレベルに保つためです。VR プロジェクトでは、ボリューメトリックライティングに加えて HDRP Area Light のサポートを無効にすることが推奨されます。Area Light の無効化は、他の機能とは異なり、ShaderConfig ファイルから行う必要があります。
HDRP では 2 つのレンダリング方法(Lit Shader Mode の Forward と Deferred)が利用可能です。これはパフォーマンスにも影響します。これら 2 つのモードの違いに関してはドキュメンテーションをご参照ください。VR 用の適切なモードの選択はプロジェクトによって異なります。フォワードレンダリングでは MSAA を有効にして消費メモリを削減することができます。ディファ―ドレンダリングは、ライトの数が多いプロジェクトにおいてより効率的に機能しますが、消費メモリもより多くなります。
GPU パフォーマンスに影響するもう一つの要因は、レンダリングバッファの解像度です。この解像度は、ご使用のヘッドセットに応じて、XR ディスプレイプラグインによって初期設定されます。その後はアプリケーション内で解像度を調整するか、動的解像度機能を使用して現在のシーンの文脈に応じて解像度を調整することができます。例えば、現在の GPU フレーム時間に解像度を適応させることも可能です。
Unite 2019 Copenhagen で行われた HDRP VR に関する講演では、この他にも各種のヒントをご紹介しています。
HDRP を VR に対応させるにあたり、レンダーターゲットのビューインスタンシングとテクスチャ配列の使用をサポートする一式のシェーダーマクロを追加しました。例えば、以下のコードで、シェーダー内でテクスチャーを宣言できます。
TEXTURE2D_X(MyTexture);
テクスチャ配列に対応しているプラットフォームでは、このマクロが TEXTURE2D_ARRAY に展開します。プラットフォームがテクスチャ配列に対応していない場合、または ShaderConfig.cs 内の設定が無効になっている場合は、このマクロは通常の TEXTURE2D に展開します。テクスチャサンプリングには、これに類似した機能が使用可能となっています。
シェーダー側では、適切なビューの定数(ビュー行列、射影行列など)がこの配列内に格納され、プリミティブのインスタンス ID から派生する眼のインデックスに基づいてインデックス付けされます。コンピュートシェーダーの場合は、各眼の特定に z 方向のディスパッチが使用されます。マクロ UNITY_XR_ASSIGN_VIEW_INDEX は通常、適切な眼のインデックスのアサインに使用されます。
HDRP VR の今後のバージョンは、以下に重点を置いて開発されます。
HDRP VR の使用は、今すぐに開始していただけます。Unity では今後も引き続き、本機能の改良に取り組んでまいります。ぜひ HDRP フォーラムへフィードバックをご投稿ください。