ニュース
[SIGGRAPH]ゲームにおいて平面視表示を立体視表示へと変換する2つの手法
オーガナイザーは,ATI Technologiesで数々のテクノロジーデモを生み出し,現在Bungieに在籍するNatalya Tatarchuk氏だ。
9:00から17:30というタイムスケジュールで――昼食休憩はあったものの――16人もの開発者が登壇するというこのセッションは,かなりのスパルタ&過密といえるものだったが,実際,興味深い内容がかなり盛り込まれているものだった。
今回行われたこのセッションをとても1本のレポートにまとめることができないので,後日いくつかのレポートに分割して詳細をお伝えするとして,今回は,その中からゲームにおける3D立体視表示の話題を現地からお届けしよう。
原理は簡単だが負荷が厳しいゲームの立体視表示
3D立体視のテレビ放送がほとんど行われていないのに,3D立体視対応テレビがここまで訴求されているアンバランスな状況を理解できないという読者も多いことだろう。しかし,実のところ,3D立体視対応テレビは,3D立体視用ディスプレイ的な位置づけで発売されているのだ。つまりその用途は,3D立体視対応のBlu-ray視聴と,3D立体視表示でのゲームプレイということになる。
3D立体視でのゲームプレイという点に集中して話を進めるが,ゲームにおける3D立体視表示は,「原理としては簡単」と言われている。
これはなぜかというと,平面視表示を行う場合,もともと仮想空間に単眼カメラを配置して,そこからの情景をレンダリングしているわけで,同様の表示を3D立体視表示で行う場合には,カメラを人間の両目に合わせた距離だけ離した2か所に配置し,それぞれをレンダリングをすればいい。
ただ,もちろんこの場合,平面視表示のときに比べてレンダリング負荷が2倍になるのは言うまでもない。
例えば,平面視表示時に60fpsでレンダリングするゲームがあるとして,これを3D立体視表示にするためには,左右の目に向けてそれぞれ60fpsずつ,合計120fpsでレンダリングしなければならない。
そのため,GPUパワーをギリギリまで使い込んでいるゲームを3D立体視表示にするのは,技術的にではなく負荷的に厳しいとされている。
そこで,GPU負荷を軽減するためによく用いられるのは,レンダリング解像度を半分にしてしまうという手法だ。どういうことかというと,1280×720ドット解像度で60fpsのゲームがあったとして,これを640×720ドット解像度に下げたうえで,左右の目に向けてそれぞれ60fpsずつレンダリングし,1280×720ドット解像度へと拡大表示(スケールアップ)するのである。
Crysis 2で採用された3D立体視表示技術
「画面座標系手法:再投射法」
しかし,Crysis 2では,上記のように2眼分をレンダリングするという手法を採用していないという。
その理由として,Crytekでシニアグラフィックスエンジニアを務めるNicolas Schulz氏は,「解像感を下げずに,平面視表示時に近いクオリティで3D立体視表示を可能にさせたかったため」と述べている。
Crytekでは,この手法を「Image Space Approach: Reprojection」(画面座標系手法:再投射法)と呼んでいる。
広義には,疑似3D立体視表示といってもいいのかもしれないが,本当の3次元情報を基に3D立体視表示へと変換しているので,まるっきりウソというわけでもない。
これらのバッファは本来,前後関係が矛盾するような2重レンダリングを避けたり,不要な描画を省略するための処理系に用いられるのだが,この値を利用して3D立体視表示へと変換するのが画面座標系手法:再投射法である。
さて,実際どのようにCrysis 2で3D立体視表示を行っているのかだが,その前に「この深さを示すバッファから分かる深度値によって何ができるのか」を説明しておきたい。
例えば,ある画素に着目したとして,この場所を左右の目で見たときにどの程度ずらせばいいのかを知りたいといった場合,その画素に対応した深度値さえ分かれば,できあがった平面視表示のレンダリング結果からでも,どの程度左右にずれているべきなのかを逆算できるのだ。
すなわち,平面視表示用レンダリング結果と,深度値さえあれば,3D立体視表示に必要な2つの映像をレンダリングすることができることになる。
画面座標系手法:再投射法では,深度値を用いた逆算に基づき,ピクセルシェーダの画面座標系ポストプロセスを使って,平面視表示のレンダリング結果から左右の目に向けて2つの映像を生成する。実際の処理系としては,深度値からズレ量を逆算し,平面視表示のレンダリング結果をサンプルしていくという流れだ。
なお,視点が横にずれることによって遮蔽関係が変わることもあるが,これは2つのケースが想定できる。
1つは,視点をずらしたことで,平面視表示時に見えていたものが遮蔽されてしまうケース。この場合は,視線により近い深度値がないかを矛盾がないように探査して,もし値が存在しているならばその値を画素のズレ量にすることで最適化することになる。
回り込みを考慮しなければならないため,丸みを帯びたオブジェクトの輪郭で発生しがちなこのアーティファクトだが,Crytekによれば,Crysis 2は,ビルが建ち並ぶ現代のニューヨークを舞台にしているため,丸みを帯びた形状のオブジェクトが少なく,さほどエラーを気にする必要がなかったとのことだ。
ちなみに,これらの追加処理系に掛かるコストは,PlayStation 3,Xbox 360ともにわずか1msだという。画面座標系手法:再投射法は,いわば2D画像処理ともいえる手法のため,シーンのジオメトリやシェーダの複雑度に依存せず,常に1msの追加コストで済むのが強みである。負荷のわりに十分に満足できる結果だとCrytekは述べていた。
なお,この深度値と平面視表示用のフレームを用いた3D立体視表示変換は,HDMIにおける3D立体視表示フォーマットの拡張仕様としても定義されている。
裸眼立体視表示は2視点の映像だけではなく,より多視点からの映像を生成する場合もあるのだが,こうした3D立体視表示のために柔軟な映像フォーマットとして規定されているわけだ。
ただし,今のところ,深度値と平面視表示用のフレームとで3D立体視表示を行ってくれる3D立体視表示対応テレビは存在していない。そもそも深度値,というかZバッファは,GPUを用いた場合の副産物なので,テレビが対応していないというのも納得できる話である。
今は,Crytekのように1つのフレームをGPUで2つのフレームへと変換しているが,将来的にテレビでこうした処理を行ってくれるような未来がやってくるかもしれない。
PlayStation 3版「Cars 2」は
Cellプロセッサで3D立体視に対応
こうした深度値と平面視表示用のフレームを用いて,画像処理的に3D立体視表示を実現したゲームタイトルは,Crysis 2以外にもあった。それはDisney Interactive Studiosの「Cars 2: The Video Game」(以下,Cars 2)だ。これは同名のCG映画をゲーム化した作品で,Avalanche Softwareが開発を担当したレーシングゲームである。
そこでAvalanche Softwareは,画像処理的アプローチを用いてCars 2を3D立体視表示化に対応させるという方法を選択したのだが,PlayStation 3版のみを3D立体視表示に対応させればよかったため,この処理系にCellプロセッサのSPU(Synergistic Processor Unit,Cellプロセッサに内蔵されている128bit SIMD型RISCプロセッサ)を用いることにしたという。
PlayStation 3が搭載しているCellプロセッサのSPUは,7基のうち1基がシステムで利用されており,6基が利用できる仕様である。Cars 2では,4基のSPUを多目的な用途に利用するというゲームエンジン設計になっており,3D立体視表示化処理以外にも,この4基のSPUが利用される。
「平面視表示用のフレームから3D立体視表示用のフレームを生成する」という着想それ自体はCrysis 2と同じCars 2だが,GPUかCPUかという処理主体が異なるわけだ。
基本着想としては同じだが,実現様式が異なる |
Gathererd Reads(収集読み出し系)手法とScattered Writes(拡散書き出し系)手法の概要 |
深度値から左右の目の視点に合ったズレ量を求めるという点は両者ともに変わらないが,異なるのはどのフレームを基準としているかである。
まずCrysis 2の場合は,平面視表示のフレームからそれぞれの画素をズレ幅を考慮しつつ3D立体視表示用のフレームへと合成していく「Gathererd Reads」(収集読み出し系)手法が用いられている。
これに対してCars 2では,3D立体視表示用フレームの画素を基準とし,それぞれに合った画素を平面視表示用フレームからズレ幅を考慮しつつコピーしてくる「Scattered Writes」(拡散書き出し系)手法が採用されている。
Cars 2の場合も,視点をずらしたことによって新たに遮蔽が生じる可能性があるのだが,左右の目の視野,すなわち3D立体視表示用のフレームを基準としているため,遮蔽に対して特別な後処理が不要になる。
Cars 2では,ITEMバッファという,1ライン分の横解像度に相当する作業バッファが用意される。この作業バッファを用いて,“ネタ元”となる平面視表示用のフレームと,深度値から逆算したズレ幅で左右にズラしたフレームとの対応関係を書き込んでいき,最後に画素値を計算するという流れになるわけだ。
ただ,この手法においても,Crysis 2が用いている手法と同じく,「平面視表示時のフレームで遮蔽されている一方,3D立体視表示用に生成したフレームだと遮蔽されず,新たに見えることになる『未知の領域』は,何の画素値も与えられない『穴』になってしまう」という問題はある。Cars 2においては,奥側の背景を複製することでこの領域の穴埋めを行うとのことだった。
このアーティファクトは,やはり丸みを帯びた3Dモデルの輪郭付近で起きやすい。Cars 2では,丸みを帯びた車が多く登場するため,画面全体の約5%がそうした領域になるそうだ。
ただ,動きの速いゲームのため,見た目はそれほど破綻していないというのが制作側の感想である。
平面視表示用のフレーム |
左目用として合成した3D立体視表示用のフレーム。緑でマークされている部分が新たに見えることになる領域だ |
この未知の領域を背景で埋めてごまかした左目用のフレーム。本当は後輪が見えるべきだろうか |
Avalanche Softwareによれば,3D立体視表示に変換した場合のフレームレートは,平面視表示時と比べても低下がなかったとのこと。この点は,改めてSPUのパワフルさに驚かされた部分だ。
なお,この拡散書き出し系アプローチは,DirectComputeやCUDA,あるいはOpen CLでも実装できるはずなので,PCでも似たようなアプローチを実践してくるスタジオが登場してくる可能性がある。
現在,ゲームを3D立体視で楽しむユーザーがまだ少ないので,本稿で紹介したような疑似手法に対するクレームのようなものをあまり聞かない。ただ,掛けるコストに対して得られるメリットが大きいことは確かなので,PCはともかく,PlayStation 3やXbox 360などのコンシューマゲーム機では,こうした手法が今後主流になっていくのかもしれない。
- 関連タイトル:
クライシス 2
- この記事のURL:
(C)2011 Crytek GmbH. All Rights Reserved. Crysis, Crytek and CryEngine are trademarks of Crytek GmbH. EA and the EA logo are trademarks of Electronic Arts Inc. All other trademarks are the property of their respective owners.