HD レンダーパイプラインでフォトリアリスティックな没入型 VR 体験を作成する

Unity の HD レンダーパイプライン(HDRP)が、公式にバーチャルリアリティー対応となりました。Unity 2019.3.6f1 以降、パッケージバージョン 7.3.1 で、HDRP は検証済みとなり、VR での使用が可能になっています。
本記事では、VR プロジェクトにおける HDRP の使用についての技術的な詳細をお届けします。HDRP でどんなことが可能かを詳しくお知りになりたい方は、こちらの ブログ記事をご覧ください。
HDRP の VR 対応は、以下の形で行われています。
HDRP の全ての機能が VR に対応しています。
HDRP は新しい Unity XR プラグインフレームワーク に完全対応しています。
VR 用に推奨されるレンダリングソリューションはシングルパス(インスタンシング)で、これがデフォルトとなっています。
HDRP を VR プロジェクトに使用すれば、このレンダーパイプラインの全機能をフルに活用することができ、ご自身の想像力の及ぶ限りに、自由に体験を創り出すことができます。HDRP は、その最新鋭レンダリング技術によって、非常に美しいフォトリアリスティックなビジュアルを、従来のバーチャルリアリティー環境にはほとんど見られなかった品質で提供することができます。
以下に、VR プロジェクトで使用できる機能をごく簡単にご紹介します。
- ディファードレンダリングとフォワードレンダリング
- 全てのタイプのライト、シャドウ、デカール、ボリューメトリック
- スクリーンスペースエフェクト
- アンビエントオクルージョン(AO)
- スクリーンスペースリフレクション (SSR)
- サブサーフェススキャッタリング(SSS)
- 歪み(Distortion)と屈折(Refraction)
- ポストプロセッシング
- カラーグレーディング、アンチエイリアシング、被写界深度など
- Visual Effect Graph の全てのビジュアルエフェクト
現在、VR 向け HDRP は以下のプラットフォームおよびデバイスでご利用になれます。
- Oculus Rift および Rift S(Oculus XR プラグイン、Windows 10、DirectX 11)
- Windows Mixed Reality(Windows XR プラグイン、Windows 10、DirectX 11)
- PlayStationVR
OpenVR:Valve は現在、Unity 2019.3 以降向けの OpenVR Unity XR プラグインを開発中で、これは近い将来に公開される予定です。
ステレオレンダリングの各種方法
ネイティブの VR 実装は、全ての処理を 2 回(両方の眼に 1 回ずつ)実行します。私たちはこのソリューションを マルチパスレンダリング と呼んでいます。HDRP はマルチパスレンダリングに対応していますが、この方法を用いるとアプリケーションがレンダリングに消費する CPU 能力が 2 倍になり、したがってドローコールの数が 2 倍になるので推奨されません。これだけでなく、シャドウが 2 回レンダーされるので GPU 予算のかなりの割合が消費される可能性もあります。
ただし、上記を踏まえた上でも、以下の場合にはマルチパスの使用が適切になります。
- システムの GPU メモリが少ない場合。マルチパスのほうが、ターゲットのレンダリングに使用されるメモリがシングルパスより少なくなります。
- 何らかの理由で、それぞれの眼に、著しく異なる視点をレンダーする必要がある場合。
より速いソリューションは、シングルパス(インスタンスト)レンダリングの使用です。このモードでは、各ドローコールが両眼に同時にレンダーされます。これは、レンダーターゲットとインスタンス化されたドローコールにテクスチャ配列を使用することによって行われます。さらに、カリングとシャドウの処理の実行が、フレームごとに 1 回のみになります。
HDRP は、全ての機能が VR に対応し、シングルパスレンダリング向けに最適化された形で設計されています。
デザインに関して私達が行った重要な決断は、テクスチャ配列を(VR 向け制作ではない場合も含め)全てのレンダーターゲットに使用することでした。この方法とシェーダーマクロの組み合わせが、自動的に VR に対応するシェーダーの作成を可能にしました。特殊なケース(例:ライトリストの生成、間接光とタイルのディファードシェーディング、ボリューメトリックライティング、カメラに相対的なレンダリングなど)を除きます。
HDRP は 2 倍幅テクスチャのシングルパスレンダリングには対応していませんのでご注意ください。この理由は、複雑性が高くなること、また全画面の全てのパスやエフェクトにオーバーヘッドが発生するためです。
HDRP で VR のご使用を開始されるには、Unity ドキュメンテーションの VR Overview のセクションをご参照ください。HDRP の VR 向けセットアップ用に HDRP ウィザード<2> もご提供しています。このウィザードは設定を検証し、(ウィザードによって)適切でないと判定された設定の修正をサポートします。

新しい XR プラグインフレームワークを使用してプロジェクトの VR 向け設定を手動で行われる場合は ドキュメンテーション をご参照ください。シングルパスレンダリングを設定するには、両方 のプロジェクト設定をシングルパスステレオレンダリングモードに設定し、かつ HDRP アセット設定もシングルパスに設定する必要があります。これら 2 つの設定のどちらかでシングルパスが無効になっている場合、HDRP はデフォルトでマルチパスに設定されます。

アンチエイリアシング
VR で素晴らしいユーザー体験を作成し、バーチャル環境の没入感を損なわないようにするためには、エイリアシングの削減が非常に重要です。HDRP には、アンチエイリアシングのソリューションがいくつか提供されています。
カメラの各種アンチエイリアシングモードに関しては、Unity の ドキュメンテーション にて詳細な説明をお読みいただけます。以下を含む各種オプションが提供されています。
- Multisampling Anti-Aliasing (MSAA) ― フォワードレンダリングに対応しています。サンプル数(2x、4x、8x)を選択して、品質とパフォーマンスのバランスを取ることができます。このモードでは非常に高い品質を実現できますが、負荷が高くなります。
- Temporal Anti-Aliasing (TAA) ― 基本的に、大多数のアプリケーションにはこれが最適のソリューションです。エイリアシングの削減に非常に効果的ですが、いくつかの詳細がぼやける可能性があります。ブラーは搭載されているシャープ化フィルターの制御によって相殺することができます。
- Fast Approximate Anti-Aliasing (FXAA)、Subpixel Morphological Anti-Aliasing (SMAA) ― 上記よりいくらか負荷の低いソリューションです。
- また、MSAA と TAA、FXAA または SMAA を組み合わせることも可能です。この方法はビジュアル品質を向上させますが、累積的に負荷が掛かります。
- Geometric Specular Anti-Aliasing では、マテリアルごとに追加的なシェーディングのアンチエイリアシングも使用可能です。これはマテリアル上で直接調整できるようになっています。スムースで密度の高いサーフェスに適しています。
パフォーマンス
VR のレンダリングは、両眼に表示するためにリフレッシュレートと解像度が高くなるので、極めて高負荷です。HDRP アセット設定内で、不要な機能は全て無効にするようにしてください。ボリューメトリックなどの機能は、最低限必要な 90 FPS を満たすパフォーマンスを備えていないため、対応されてはいますが VR アプリケーションには適しません。パフォーマンスのモニタリングとプロファイリングを頻繁に行うことが、プロジェクトのボトルネックの特定に役立ちます。
VR のボリューメトリックエフェクト(z スライス)の精度はデフォルトで半分になりますのでご注意ください。これは、GPU パフォーマンスをより許容可能なレベルに保つためです。ボリューメトリックライティングに加えて、VR プロジェクトでは HDRP Area Light のサポートを無効にすることが推奨されます。Area Light の無効化は、他の機能とは異なり、シェーダー設定ファイル から行う必要があります。
HDRP では、パフォーマンスにも影響を与える 2 つのレンダリング方法が利用可能です。Lit シェーダーモードのフォワードとディファード。これら 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 の今後のバージョンは、以下に重点を置いて開発されます。
- Variable Rate Shading などの新しいハードウェアオプションによる、パフォーマンスの改善
- プラットフォーム対応の改善(Vulkan、DX12)
- デバイス対応の改善
- シングルパスの拡張(3 つ以上のビューへの対応)
HDRP VR の使用は、今すぐに開始していただけます。Unity では今後も引き続き、本機能の改良に取り組んでまいります。ぜひ HDRP フォーラム へフィードバックをご投稿ください。
