Oculusが老舗ゲームエンジンUnreal Engineの根幹を作り替えた話

Oculus Unreal Rendererは90fpsで動作し、UnrealのデフォルトのでFoward Rendererは60fps以下で動作します。

VRのグラフィックスは普通のゲームとは事情違うため、既存のテクニックが適さないケースが多々あります。

Oculusは、なんと世界最大シェアのゲームエンジンであるUnrealEngineの描画エンジンを、VR向けに作り直してしまいました。そして、これはUnrealEngineの本流に取り込まれ、今では公式にサポートされています。

ざっくりいうと?

Oculusの主要コンテンツは古くからUnrealEngineで開発されていました。しかし、UrealEngineの最新版であるVersion4では、PlayStation3後期から主流になった最新の描画手法であるDeferred Renderingと呼ばれる描画技術のみをハイエンド向けにはサポートしており、これがVRと相性の良くない物でした。

特に解像度が命のVRでは、解像度に比例して描画負荷が上がっていく欠点が致命的に問題でした。さらに、アンチエイリアシングで解像度をごまかそうにも、VRに適したアンチエイリアシングであるサブピクセル系のアンチエイリアシング(MSAA)も使えないため、描画処理の刷新が必要とOculusは考えました。

そこでOculusは、旧世代のForward Rendererを最新のGPU向けに最適化し、Deferred Renderに迫る描画品質、かつVRと相性の良い描画エンジンを開発してしまいました。以下の文章は、それについて書かれたブログ記事の日本語訳です。


UnrealEngine4 描画エンジンのVR向け最適化

TL;DR(要約): Farlandsについて、Oculusチームは、実験的に、高速な、シングルパスForward RendererをUnreanEngine向けに書きました。それは、DreamdeckやOculus Store版のShowdownで使われています。我々は、開発者自身のアプリケーションで、より高いレベルの品質とフレームレートを達成するための助けになるサンプルとして、レンダリングのソースコードを共有しています。今日の時点で、あなたはUnrealの開発者としてそれを得ることができます。https://github.com/Oculus-VR/UnrealEngine/tree/4.11-ofr 。

没入型VRの世界を90Hz固定でレンダリングすることは、複雑かつ技術的に困難です。VRコンテンツを作成することは、多くの点で、従来の表示だけのコンテンツを作る事とは違います – それは私たちに様々な新しいインタラクションと体験をもたらしますが、これまでの常識を再考させ、新しいトリックを思いつかせることを開発者を強制します。VRタイトルの最近の波は、開発者の機会と創意工夫を披露します。

我々がやったように、我々はVRレンダリングのために伝統的な仮定のいくつかを再評価し、90Hzで忠実度の高いコンテンツを届けるのに役立つ技術を開発しました。今、私たちはいくつかの結果を共有します:UrealEngine 4.11向けの実験的なForward Renderer

我々はVRレンダリングにおける幾つかの特定の制約を念頭に置いてOculus Unreal Rendererを開発しました。それは私たちがより簡単に高い忠実度、高度な体験を作成することができ、全てのUE4の開発者と共有することに努めています。

背景

チームがFarlandsでのプロダクションを開始したので、Oculus Connect、GDC、CESなどのイベントでデモ体験を学んだことを反映させるために少し時間をかけました。 このコンテンツを作成するためにUnreal Engine 4のみを使用しました。これにより、素晴らしい編集環境と豊富な高度なレンダリング機能が提供されました。

残念ながら、Riftへのレンダリングにおいては、これらの機能のサブセットのみの利用が現実的でした。 私たちが最も頻繁に使用したものを吟味し、より高性能で良いビジュアル忠実度を提供する、すっきりとしたレンダラを設計できるかどうかを確認しながら、UE4の世界水準のエディタとエンジンを継続して使用できるようにしました。

Oculus Unreal RendererはOculusアプリケーションの使用例に焦点を当てていますが、既存のプロジェクト(ShowdownやOculus Dreamdeckを含む)に大きなコンテンツ変更作業をしなくても済むように改造されています。 このような場合、ビジュアルがより鮮明になり、追加の機能を有効にしたり、解像度を15〜30%向上させるのに十分なGPUの余力が解放されました。

Oculus Unreal Rendererは90fpsで動作し、UnrealのデフォルトのでForward Rendererは60fps以下で動作します。
高解像度での比較:Oculus Unreal Rendererは90fpsで動作し、UnrealのデフォルトのでForward Rendererは60fps以下で動作します。

Deferred VRにおけるトラブル

Unreal Engineは、高度なレンダリング機能と忠実性で知られています。 なら、VRのためにそれを変更する理由は何ですか?

それは主に我々がVRコンテンツを構築した経験と、モニタとRiftに対するレンダリングの違いに由来します。

Riftで作成したデモを調べると、ほとんどのシェーダはかなりシンプルで、主に詳細なテクスチャに依存しており、検索回数が少なく、計算量が少ないことがわかりました。 Deferred Rendererと組み合わせると、GBufferのパスはかなりのテクスチャに比重が有りました。つまり、多数のテクスチャから読み込み、GBuffersに書き込んだりしましたが、その間には余り多くのことをしていませんでした。

我々はまた、ダイナミックなライティングとシャドウをあまり使用せず、あらかじめ計算されたライティングに重きを置いていました。 実際には、レンダラーに切り替えることで、1回のパスでより限定された機能を提供し、GPUの使用効率を高め、最適化を有効にし、バンド幅のオーバーヘッドを取り除き、90Hzに届きやすくしていました。

さらに、ハードウェアアクセラレーションによる multi-sample anti-aliasing(MSAA)とUnrealのtemporal antialiasing(TAA)を比較したいと考えました。 TAAはモニタ向けのレンダリングで非常にうまく動作し、Deferred Renderingと非常によくマッチしますが、VRでは目立つアーティファクト(ごみ)が発生します。 特に、頭を動かしている時にブレや幾何学的なエイリアシングを引き起こすことがあります。 はっきりいうと、これは私たち自身のシェーダと頂点のアニメーショントリックのいくつかによって悪化していました。 しかし、それは主にVRヘッドセットの機能に起因しています。

モニターに比べ、Riftの書く画素は、観察者の視野の大部分を覆っています。典型的なモニタは、VRヘッドセットより立体角あたり10倍以上の画素を有します。Oculus SDKに提供される画像はまた、ヘッドセットの光学系の影響を補償するためにリサンプリング処理を行うの追加のレイヤを通ります。この余分なフィルタリングは、画像をやや過剰に平滑化してしまう傾向があります。

これらの要因はレンダリングの際にできるだけ画像を精細に保ちたいという我々の欲求を刺激しました。我々は、我々が好むシャープで詳細な画像を生成するMSAAを発見しました。

DeferredとForwardの比較
DeferredとForwardの比較

Forwardとより良く適合

現在の最先端のレンダリングでは、screen-space ambient occlusion(SSAO)やscreen-space reflections(SSR)などのスクリーンスペースエフェクトをしばしば活用しています。 これらは写実的かつ高い品質で視覚に影響を与えることがよく知られていますが、VRでは理想的ではないトレードオフです。 純粋に画面空間で動作させると、不適切な立体視差(両目それぞれに表示される画像の差異)がもたらされる可能性があり、それは不快なものになります。 これらのエフェクトをレンダリングするコストとともに、我々のユースケースのための機能のサポートをより快適にすることができました。

Forward Rendererーを実装するという我々の決定は、これらのすべての事項を考慮に入れました。クリティカルには、Forward RenderingでアンチエイリアシングにMSAAを利用したり、テクスチャに対する重いシェーダに計算を追加したり(そしてGBufferの書き込みを削減)、asynchronous timewarpを妨げる高価な全画面パスを取り除きます。そして、一般的に、機能の豊富なデForward Rendererよりも適度なスピードアップを実現します。Forward Rendererに切り替えることで単一視点の背景レンダリングを簡単に追加することができます。これは離れた位置に、大きく複雑なジオメトリを持つタイトルのパフォーマンスを大幅に向上させることができるものです。しかし、これらの利点には、誰にとっても妥当ではないトレードオフが伴います。私たちの目標は、世界レベルのコンテンツを90Hzで稼働させるために戦い続ける際に、VR開発者と学習内容を共有することです。

私たちの実装はOla Olssonの2012 HPG論文、Clustered Deferred and Forward Shadingに基づいています。伝統的なForward Renderingに精通している読者は、このようなレンダラを使用している場合、ダイナミックライトのCPUおよびGPUオーバーヘッドについて懸念している場合があります。幸いにも、フォワードライティングの現代的なアプローチでは、追加のドローコールは必要ありません。すべてのジオメトリとライトは、シングルパスでレンダリングされます(オプションのz-prepassを使用)。これは、コンピュートシェーダを使用して、どのライトがシーンの3D “クラスタ”に影響を与えるかを事前に計算することによって可能になります(各視点の視錐台のサブディビジョン、錐台ボクセルグリッドの生成)。このデータを使用することで、各ピクセルは、画面空間上に一貫性のあるライトのリストを安価に決定し、最新のGPUが備える効率的な分岐を活用するライティングループを処理できます。これにより、正確なカリングが提供され、追加のドローコールやレンダリングパスのオーバーヘッドなしに、少数のダイナミックライトを効率的に処理できます。

(3Dライトグリッドの可視化、ライトの一貫性とカリングを図示)
(3Dライトグリッドの可視化、ライトの一貫性とカリングを図示)

レンダラ以外では、GPUとCPUの最適化を追加できるようにUE4を修正しました。 レンダラは、正式にサポートされているSDKではなく、維持されていないサンプルとして提供されていますが、Unreal Engineの世界クラスのエンジンとエディタを使用してVRワールドをレンダリングするための追加オプションを使用することができます。