トラッキング全4回を終えたところで、VR機器のグラフィックスレンダリングの話しをしたいと思います。以降レンダリングと言った場合グラフィックスのレンダリングのことだと思ってください。
はじめに
VR機器ではトラッキングとレンダリングは密接な関係があります。
現実世界では、右を向いたら連続的に景色は左に流れ最終的に右の風景が見えます。それと同じことをVR機器で実現するために、バーチャルな世界では、右を向いたら角度に応じた風景を継続的にレンダリングしてディスプレイ表示することになります。
そしてVR酔いのリスクを最小限に留めるために、上記角度や位置の推定精度に加えて、その位置角度情報に対応する双眼画をできる限り遅延なくディスプレイ表示することが非常に重要です。
実際にはレンダリングにはある程度の演算時間が必要ですから、レイテンシーを削減することは簡単ではありませんし、そもそもゼロにすることは不可能です。それを見かけ上可能にする技術(ここではRotational Reprojection と呼ぶことにします)について説明します。
Rotational Reprojection はVR機器を成立させるための根幹の技術と言っても過言ではありませんが、それ以外にも、レンズ歪み (Lens Distortion) 補正、レンズ外領域のカリング (Outside Culling)、可変解像度 (Variable Resolution) レンダリングなど、VR機器ならではのグラフィックス系の技術がありますので、勉強して行きましょう !
尚、このあたりの技術は各社各様の呼び名があるようですが、ここではできる限り汎用的な言葉で説明して行きたいと考えています。
Lens Distortion補正
しくみ
VRヘッドセットでは、レンズ越しにディスプレイを覗きます。これによって虚像がだいたい2m前方に現れ、バーチャル空間が生成されます。
このときディスプレイ上の画像には、実はレンズによって歪みが発生しています。虫めがねで物を見た時、周辺ほど歪みが大きくまた広がって見えるのは、みなさんもご存じでしょう。ルーペの豆知識はかなり長い記事ですが、隅々まで目を通すととっても勉強になります。
もちろんレンズによって歪曲収差は樽型になったり糸巻型になったりしますし、光学系の設計によって歪曲収差を少なくすることも可能です。そのあたりはこちら(第17回 : レンズの大敵を探る…)もご参照ください。
VR機器での典型的な例を以下に示します。
中央の画像のように、格子をVRヘッドセットのレンズ越しに見ると、周辺が歪んでしまいます。これは目への刺激や酔いの原因にもなり得ます。昔のVR機器の画面はこうなっていることが多かったと思われます。広いFOVになればなるほど歪みが大きくなります。
この問題を回避するために、Lens Distortion を考慮してあらかじめ画面を逆に歪めてディスプレイ出力する、ということをVRシステム側の GPU で行っています。通常VRアプリケーションが生成する画面は右側の画像のように歪みのない画面(実際には双眼画)です。この画像に対して、VRシステム側で Lens Distortion 補正を施した画面(左側の画像)をディスプレイ出力してあげると、レンズ越しにユーザーが見る画面は右側の画像のようにVRアプリケーションが意図した画面となるわけです。
シンプルな話しですが、これを高速にしかもユーザーの動きに合わせてリアルタイムにディスプレイ出力するためには、高速なシェーダーの出現が必要だったと言えます。
実装
具体的な実装の話しをすると、元のVR画面が与えられ、2D Distortion 補正をテーブルルックアップかあるいは式補正によって行います。
高優先度なグラフィックスパイプラインに元画を突っ込んでもらえれば、低次関数の補正式によってシェーダーで画面を歪ませるのは簡単です。ただし、ディスプレイパネルやレンズの特性によって色収差が出るので、RGBそれぞれの補正式で歪ませるのが通常です。
VRの場合グラフィックスのレイテンシーは不快感に直結してしまうため、通常グラフィックスパイプラインを高優先度に設定して高速に処理しますが、その場合オーディオとの競合が発生しやすくなるので注意が必要です。
もちろん Lens Distortion 補正をVRアプリケーション側で行うことも可能ですが、例えばVRヘッドセットのコストダウンの中で、レンズの歪み特性が変わってしまうことなどはあり得る話しで、そういったプラットフォーム依存のパラメーターはシステム側で担保してあげるのが一般的です。
Outside Culling
しくみ
Lens Distortion 補正の話しをしましたが、そもそもVRヘッドセットではレンズ越しに見える範囲が限られています。逆に言うとよく見えないエリアの画面を用意しても演算時間のムダということになります。
このような画面を目にしたことがある人も多いと思いますが、VRの双眼画の例になります。周辺部が黒画になっていてレンズ越しに見える範囲内のみコンテンツ画面がディスプレイ表示されています。
つまりレンズ越しによく見えない部分がカリングされています。カリングとは描画する必要がないポリゴンを描画しないようにする手法です。 この手法によって描画するポリゴン数が減少するので、高速化の手法としてよく使用されています。
オクルージョンカリングというのは良く使われるので聞いたことがあるかも知れませんが、隠れているオブジェクトを描画しない機能です。また、ゲームカメラの視界の外のオブジェクトは描画しないとか、ポリゴンの裏側は描画しないとか、不要な描画を避けることにより演算負荷を下げる効果があり、演算時間が究極的に制限されるVR機器では重要な技術になります。
実装
繰り返しになりますが、周辺部のカリング(特に名称がないのでここでは Outside Culling と呼びます)は、VRアプリケーションが作成した画面のうち Lens Distortion 補正で参照されないエリアの描画を行わないことです。VR機器では、90Hz native 環境で11.1 msec、120Hz native 環境では 8.3 msec 周期で描画し続けなければなりませんので、少しでも描画エリアを減らすことはとても重要なことになります。(nativeというのは後述するシステムによる補間機能を利用しないことを指します)
具体的な実装方法としては、グラフィックスパイプライン上でステンシルマスク機能を使って、描画しなくてよいエリアをマスク指定する方法が一般的です。ステンシルとはピクセルごとに数値を保存しておき、それを参照して描画するかどうかを判断できるシェーダーの機能です。
ステンシルマスクを利用することによって、VRアプリケーションはレンズ範囲を気にすることなく一枚画を作ろうとすればよく、グラフィックスパイプライン後段で自動的に周辺部が描画対象から外れ、一般に10~20%のGPU負荷削減になります。
Rotational Reprojection(基礎編)
フレーム内補正
原理
冒頭に書きましたが、できる限り汎用的な言葉で説明して行きます。Rotational Reprojection は、直訳すると「回転方向の再投影」という ? な言葉になってしまう機能です。VR機器のグラフィックス系で一番重要な技術の一つです。それでは説明に入ります。
トラッキングの回で説明しましたが、VR機器上では通常拡張カルマンフィルターやパーティクルフィルターが常に動作していて、HMDの姿勢や位置を常に推定しています。そしてVRアプリケーションは、定期的にその推定値を取得して画作りをします。しかしその画がディスプレイ出力されるタイミングはもっと後(ダブルバッファを使用するティピカルな場合で 40 msec 程度、トリプルバッファを使用すると 60 msec 以上)になります。
つまりこの画をこのままディスプレイ出力してしまうと、演算遅延がそのままレイテンシーになってしまいます。下図で言えば、HMDの姿勢や位置をもらい画作りしても(白い点線のエリア)、この画像が表示されるころにはユーザーは別の場所(黄色い実線のエリア)を見ているというわけです。このレイテンシーを理論的にゼロにする技術が Rotational Reprojection です。
具体的には以下のステップで実現します。
- ユーザーは現在白い点線のエリアを見ているとする
- VRアプリケーションは、これから描画するVR画面がディスプレイ表示までにかかるであろう予測遅延時間 T を S に教える
- VRシステムは、その予測時間 T 後のHMDの位置姿勢推定値 X を A に教える
- VRアプリケーションは、その推定値をゲームカメラの位置姿勢としてVR画面(水色の点線のエリア)を生成し、グラフィックスパイプラインにキックする
- VRシステムは、その後もドライバーから定期的に上がってくるセンサー情報を加味して、予測されたディスプレイ表示時のHMDの推定位置と姿勢を修正更新して行く
- VRシステムは、そのVR画面のディスプレイ表示直前に最終的なHMDの推定位置と姿勢 (X’) を算出し、VR画面をずれ (X’-X) の分だけ追加回転して黄色い実線のエリアをディスプレイ出力する
つまり、VRアプリケーションが関与するのはVR画面をグラフィックスパイプラインにキックするところまでで、それ以降はVRシステム側ですべて処理します。
実際のディスプレイ表示タイミングは遅延時間 T から多少ずれますし、そのときのHMDの位置と姿勢ももちろん X からずれますが、その両方をシステムは把握することができます。よってある画面をディスプレイ表示する際に、その画面をどれだけずらせば正しい表示になるかをシステムは知っているので、その微小ずれ分画面を動かしてディスプレイ表示してあげるというわけです。
これによって、理論的にはほぼゼロ遅延を実現します。一般に回転方向の動きのみに対応しますが、その理由はのちほど説明します。
実際の動作
VRアプリケーションが描画するエリアは水色の点線の範囲内です。実際にディスプレイ表示されるのは濃いグレーのエリアを含む矩形の範囲内ですが、濃いグレーのエリアはOutside Cullingによって描画対象から外され、レンズ越しに見える水色の点線の範囲内のみ描画されます。
このとき、VRシステム側で最終微調整を行うと、実際にディスプレイ表示されるのは黄色の実線のエリアになります。したがって右側に黒画がはみ出してしまうことになります。
VRアプリケーション側で朱色の点線エリアのように広めの範囲を描画してもらえれば、黒画のはみ出しを抑制することができますが、周辺部ほど面積が広くなるので、ステンシルマスクによる演算負荷削減効果が大きく失われてしまいます。
そのため、VRアプリケーション側では必要最小限である水色点線のエリア内を描画し、黒画がはみ出してしまう場合は、VRシステム側で周辺部を折り返したり繰り返し描画を行うことによって、周辺部の違和感をできる限り抑える工夫が施されていたりします。
このあたりはフェイク処理(ごまかし)となってしまいますが、
- 人間の視覚(視細胞の分布)として周辺部は詳細な色の認識はあまりされず、明るさの認識が行われる傾向が強いこと
- 仮にHMDが水平方向に1秒間で360度回転したとしても、1フレーム間の回転移動量は3度~4度程度なので、前記予測遅延時間 T が大きくずれていない限り、通常の動作環境でははみ出し分は微小に抑えられるはずであること
から経験的にも問題ないレベルであることがわかっています。
これは裏ワザになりますが、T の精度をチェックするために、HMDを手に持って(親指で近接センサーを塞ぎつつ)ブンブン振り回して黒画のはみ出しが最小限に抑えられていることを実際の現場ではチェックしたりするんですよ。
フレーム補間
同様の技術はフレーム補間でも用いられますが、その背景から説明します。
背景
現状のVR機器では、フレームレートは90Hzや120Hzが主流ですが、その場合フレーム間隔は90Hzで11.1 msec、120Hzで8.3 msecと非常に短くなります。一般的にはこの時間内に描画を完了することは難しい場合が多いですので、グラフィックスパイプラインを並列に何本も走らせることによって描画レートを維持します。
しかしそれでも複雑なゲーム画面などを安定したフレームレートで描画し続けることは簡単ではありません。そのため、VRアプリケーションは45Hzあるいは60Hzで描画し、VRシステムが間のフレームを補間することによって90Hzや120Hz描画を達成する、フレーム補間 Reprojectionというものが用意されています。
その模式図がこちらですが、VRアプリケーションは45Hzあるいは60Hz周期でレンダリングしています。水色の点線部分が描画結果を示します。これに対し上で説明したフレーム内補正でディスプレイ表示される部分が黄色の点線エリアです。
フレーム補間ではさらにこの水色の点線部分を利用して、VRシステム側がフレーム間のHMDの位置と姿勢情報に基づいて黄色の実線エリアをディスプレイ表示します。
フレーム内補正よりもさらに黒画がはみ出すリスクは高まりますが、上のフェイク処理のところで説明したのと同様の理由から、予測遅延時間 T の精度を高めて作りこめば、実際には経験的にも通常の使用環境ではまったく気にならないレベルに抑えられることがわかっています。
なぜここまでして高フレームレートを維持する必要があるのかについてはまた別の回で詳しく説明する予定ですが、簡単に言ってしまうと、高フレームレートほど画面が滑らかになり臨場感が高まるからです。実際60/75/90/120Hzで比較してみると、60Hzだと明らかに感じた動きの粗さが75Hzだと急激に改善され、90Hz以上だと現実世界とあまり違いが感じられないほど動きが滑らかになります。
回転方向と並進方向
さきほど、基本的に回転方向のみを補正すると言いました。これはなぜかと言うと、
- 回転方向の補正では基本的にオクルージョンが発生しないため、システムによる補正が比較的容易であること
- 回転方向のレイテンシーはVR酔いの強い要因の一つであることから、補正効果が高いこと
があげられます。
超厳密に言えば、頭の回転中心と目の位置は一致しませんし、視線方向は回転中心に対して放射状ではありませんから、理論的にはごくわずかにオクルージョンは発生しますが、基本的には無視できるレベルと見なせます。
また、回転方向の補正はVR酔いへの改善効果が高いことが知られており、理論的にゼロ遅延を実現できることはVR機器としては非常に意味があることです。
一方並進方向の補正ですが、もちろんVRシステムではHMDの姿勢だけでなく位置も常に推定されていますから、並進方向のずれも検出できます。しかしながら、並進方向のずれを補正するためには、オクルージョン状態が変化する、すなわち手前の物体によって見えなかったものが補正によって見えるようになることを前提とする必要があります。
この補正を厳密に行うためには、オブジェクトの3D情報が必須ですから、レンダリング後の2D画面をずらすだけで済む回転方向の補正のように簡単には行きません。大変な割にそのVR酔い改善効果はそれほど大きくないと考えられ、対応している機種は事実上ほとんどないと考えられます。
もちろんHMDの前後の動きに対してVR画面の拡大縮小調整を施したり、上下左右の平行移動に対して回転方向と同様のシフトによってフェイク補正を行うことは可能ですが、通常の使用環境でどこまで意味があるかは不明です。
おわりに
長くなってきたので、今回はここまでにします。
Lens Distortion補正をシェーダーを利用してリアルタイムに処理する部分は基本中の基本なので忘れないでください。また、ステンシルマスクを利用して描画エリアをレンズ範囲に制限することによるGPU演算負荷削減効果は高いですので、これも覚えておきましょう。
そして Rotational Reprojection は、理論的に回転方向の遅延をゼロにできる技術ですが、VR酔いへの改善効果が高く、VR機器を成立させるための根幹の技術と言っても過言ではありません。是非覚えておいてください。
次回は Rotational Reprojection の応用編と Foveated Rendering について解説していく予定です。お楽しみに !