今回はグラフィックスの最終回です。
IPD設定に関して簡単に触れたあと、グラフィックス全3回の総括として、典型的なレンダリングプロセスについて説明します。
はじめに
VR機器のグラフィックスレンダリングについて、第1回ではシェーダーを利用してリアルタイムに処理する Lens Distortion 補正や、ステンシルマスクを利用して描画エリアをレンズ範囲に制限する Outside Culling についてまず紹介し、VR機器の肝となる技術のひとつである Rotational Reprojection の基礎について解説しました。
第2回ではRotational Reprojection の応用編として、Reprojection 技術が持つ問題点とその対策について解説しました。また可変解像度レンダリングの代表例として、Fine Central / Coarse Peripheral Rendering と名付けた技術(Fixed Foveated Rendering とも言われる)について説明し、その発展形としてディスプレイ解像度の向上のための必須技術と言われる Foveated Rendering についても勉強しました。
それでは今回はIPD設定からはじめましょう !
IPD設定
VR・AR機器の構造 その1 でIPD調整について説明しましたが、IPDというのは Interpupillary Distance すなわち瞳孔間距離のことです。IPD調整は正しい立体視を再現するために必須であり、
- IPDに応じたレンズ配置(レンズ間距離をIPDに合わせる)
- ディスプレイ上に表示される双眼画の配置(レンズの正面に表示する)
- IPDに応じた双眼画の生成(双眼のゲームカメラ距離をIPDに合わせる)
この3つがすべて満たされる必要があります。
レンズとディスプレイが片眼ずつ一体となったVRヘッドセットでは、メカ的にその距離を変えることによってIPD調節ができる機器があります。これによって、目の位置とレンズ中心とディスプレイ中心を合わせることができ、好適な視覚刺激を受けることができるようになります。
しかしながら、正しい立体視の再現という意味ではこれだけでは不足です。これに加えて、双眼画を正しいIPDに合わせてディスプレイ表示することが必要です。
VRアプリケーションではいわゆるゲームカメラをふたつ持ち、双眼の視点としてIPD分離れた距離に配置されます。デフォルトはIPDの平均値である約 63 mm に設定されますが、厳密にはゲームカメラの距離をユーザーのIPDに合わせて双眼画を作ることにより正しい立体視を実現できます。
つまり、正しい立体視環境を提供するためには、VRシステムがユーザーのIPD値を取得保持し、グラフィックスレンダリングのパラメーターとしてVRアプリケーションに渡すことが必要というわけです。
典型的なレンダリングプロセス
ということで、一通りVR機器のグラフィックスレンダリングに関する要素技術を説明しました。
- シェーダーを利用したリアルタイム Lens Distortion 補正
- ステンシルマスクを利用した Outside Culling
- トラッキングシステムと密に連携した Rotational Reprojection
- Fine Central / Coarse Peripheral Rendering
- Foveated Rendering
- IPD設定
VRアプリケーションによって元の双眼画がキックされ、グラフィックスパイプライン上でこれらの処理が行われてディスプレイ表示されるわけです。以下に典型的なレンダリングプロセスを纏めます。
ここでは出力ピクセルを逆引きで追跡することによってディスプレイ表示される双眼画を作る手法をベースに説明します。以下はフレーム内 Reprojection + Fine Central / Coarse Peripheral Rendering の場合の例です。
VRアプリケーションが必要に応じて設定するもの
- IPD測定結果をシステムから取得し画作りに利用
- 描画無効エリアをステンシルマスクで設定
- Fine Central 画面と Coarse Peripheral 画面を適用する領域の指定および重複領域のブレンディングの指定
VRアプリケーションが毎フレーム行うもの
- 描画完了予測時間をシステムに通知
- 予測時間後のHMDの位置姿勢推定値をシステムから取得
- 双眼画を生成(Reprojection 有効レイヤーにのみ Fine Central / Coarse Peripheral を適用する例)
- Reprojection 有効レイヤーの Fine / Coarse for L / R の 4 枚画像
- Reprojection 無効レイヤーの L / R 2 枚画像
- 双眼画(=上記 6 枚のアプリケーション画面)をグラフィックスパイプラインにキック
VRシステムが毎フレーム行うもの
以下の描画を R, G, B それぞれで行う。
- ディスプレイ出力するピクセル座標 (x, y) のアプリケーション画面上のピクセルデータを逆引き参照する -> この時点でステンシルマスクで無効化されている領域はスキップされる
- Lens Distortion の補正式から座標 (x’, y’) を取得
- Reprojection 無効レイヤーへの参照
- 有効データが存在した場合には座標 (x’, y’) のピクセルデータを取得
- 有効データが存在しなかった場合には Reprojection 有効レイヤーを参照
- Reprojection 有効レイヤーへの参照
- さらに Reprojection の回転補正から (x’’, y’’) を取得
- その座標位置に応じて Fine 画面あるいは Coarse 画面を参照(参照座標はマップの仕方による)
- ブレンディング領域の場合は Fine / Coarse 両方の画面を参照し、たとえばリニアブレンディングによりピクセルデータを生成
何となくイメージわきましたかね !? もちろんレンダリング手法はこれに留まらずいろいろなやり方がありますが、たとえばこのようにして双眼画はディスプレイ出力されます。
ここでは Fine Central / Coarse Peripheral を例にしましたが、Foveated Rendering でも基本的には類似のプロセスでのピクセル参照が可能です。ただし視線推定値を取得しその座標に基づいてFine / Coarse の元画作りが必要です。
目の動きにはサッカードのように瞬時に大きく動くものや、眼振など視覚刺激起因で発生する反射作用もありますから、視線の推定精度もそうですが、特に推定演算の遅延には注意が必要です。
おわりに
以上全3回にわたってVR機器のグラフィックスレンダリングについて勉強しました。如何でしたか ?
特に回転方向のレイテンシーを理論上ゼロにする Rotational Reprojection 技術は興味深かったのではないでしょうか。
VR機器では今後 Inside-Out 方式が主流になっていくと思われますが、一方でディスプレイ解像度の向上やFOVの拡大も現実感や臨場感を高めていくためには必要です。
Inside-Out 方式ではヘッドセット側での演算負荷が増大する方向になりますが、そこにさらにピクセル演算負荷が増大するのは厳しいものがあり、やはり据え置きのプロセッサー支援に期待する側面はあります。
そのときに有線接続が発生するとケーブル制限が生じ、せっかくのスタンドアローン環境のメリットが大きく失われ大変残念です。となると無線接続に期待が高まりますが、そこには演算遅延に加えて転送遅延という問題が立ちはだかることになります。
そこにも Reprojection 的なアプローチが活躍できる余地はありそうですね。
- ヘッドセット側にセンサー類はすべてある -> ヘッドセット側でHMDの位置と姿勢を推定
- 推定値をPCに転送
- PC側に豊富な演算資源がある -> PC側でグラフィックスレンダリング
- 広めのレンダリング結果をヘッドセットに転送
- 最新のHMDの位置と姿勢の推定値から、レンダリング結果をシフト/加工してディスプレイ出力
たとえばこんな感じになるのでしょうか。でも8K画面を120Hzで無線転送するのは現状のインフラでは難しいですね。4K画面で45Hzなら行けるでしょうか。いずれにしてもフレーム補間 Reprojection は必須です。
広めにレンダリングすると 2 乗で演算負荷が増大するので気をつけなければなりません。そこで有用なのが Coarse Peripheral です。視細胞は周辺に行けば行くほど杆体も減少していくので、周辺エリアの解像度を落とすことによって演算負荷の増大を抑えることができます。FOVが広くなるほど周辺エリアの解像度の必要性は失われて行くと考えられますから、バランスの取れた演算負荷設計が可能となるでしょう。
とは言えこれだとシステムが複雑になってしまいますよね。やはりシンプルにPCからのストリーミングで行きたいところですが、遅延がネックです。
ということで、グラフィックスはこれにて終了です。でもVR・ARの講義はまだまだ続きますよ。次回もお楽しみに !