「レイトレーシング」といえば,重い処理の代名詞だったのも今は昔。最近はGPUの演算能力が物凄く発達している……のとは別に,CPUでまともに計算するレイトレーシングで,リアルタイムゲームができるまでになってきているのだ。2007年のIDFでは,8コア搭載のPCで描画方式をレイトレーシングに変えた
「Quake III」「Quake 4」が公開され,90fpsというフレームレートで駆動されていた。
今回のGDC08では,IntelのResearch Scientist,Daniel Pohl氏による講演が行われた。「Quake」のレイトレーシング版は,OpenRTというAPIで実現されていたものであるが,Intelでは改良版のIntelRTというAPIで動作させている。IntelRTがパフォーマンスを発揮しているのは前述の通りである。
8コア,16コアでもほぼコア数に比例したパフォーマンスが期待できる
|
さて説明が前後するが,そもそもレイトレーシングとは,光が物体に当たって反射し,目に入ってくるまでの過程を逆方向にたどって描画する手法だ。描画するピクセル単位に光線(レイ)を飛ばし,何か物体と交差した場合は,そこから光源に向かってレイを飛ばして,その表面の色や明るさを決定していく。光源にたどり着く前に何かにぶつかったら,そこはきっと影になっている……といった感じでレンダリングを行っていく。ドット単位でさまざまな処理が必要なため演算負荷が高いのだが,原理上,非常に並列処理に向いたアルゴリズムである。最近のIntelは,1コアあたりの性能向上よりもマルチコア戦略での性能向上にご執心なので,レイトレーシングはまったく都合のよい題材といえるだろう。
こういったライティングはレイトレーシングならではのこと
|
ここでは,レイトレーシングでない現状のGPUの描画方式を「ラスタライズ」と表現している。ラスタライズ技法では,ポリゴン単位に描画処理が行えるため,ピクセル単位で描画処理が必要になるレイトレーシングよりは格段に処理が軽くなる。
最近は写真のようなリアルな絵も作れるようになってきたが,ゲームではできるだけ手を抜きつつ綺麗な絵を出そうと無理をすることが多いので,よく見ると齟齬が生じている場合もある。
右の
「FlatOut 2」の例では,ボウリングのピンが倒れたのに,影はレーンに残ったままになっている。
「Call of Duty 4」の画面では,高精細に表示された樹の画像に対して,その影の部分ではジャギーが目立つ。ラスタライズでは,影はもともと描画できない。影用のオブジェクトを作ったり,影を描き込んだりして影っぽい画像を出しているため,物理的な影とはちょっと異なる部分も出ている。こと影の表現に関しては,物理的に光のシミュレーションを行うレイトレーシングのほうが正確である。
ラスタライズで描画に問題が生じている例。タイヤの位置がずれていたり,半透明の影がうまく表示されていなかったりする
|
|
左が「Crysis」(ラスタライズ),右がレイトレーシングの例
|
|
リアルタイムレイトレーシング自体の詳細については,あまり詳しく触れられていなかった。複雑な物体を凸型オブジェクトに分割し,ツリー上に管理する方式が高速化の鍵となっているようだ。詳しくは
OpenRTの公式サイトなどを見るのがよいだろう。
ラスタライズを基本に作られたゲームをレイトレーシングで再現するためには,通常のレイトレーシングには含まれない要素をうまく実装してやる必要がある。Quakeで登場するポータルの表現はどのようにするのか,シェーダはそのときどうするのか。この講演ではそれぞれのケースについて必要な手法が紹介され,どういった処理をすればよいのかに加えて,毎回「あなたが思うほどには重くない」という言葉が付け加えられていた。
ピクセルシェーダは使用可能。右は最終目標で,グローバルイルミネーションを実装する場合のイメージ
|
|
最後に,VAIOの省電力型ノートPCでのQuake 4のレイトレーシング版実行結果が示された。超低電圧版で動作クロック1.20GHzのシングルコアCPU(ULV Celeronか?)を使用したPCにもかかわらず,25〜45fpsを実現しているという。なぜそんなに速いのかについては,ちょっとしたオチもあって,画面が小さいので描画負荷が低いのだという。原理的にピクセル単位に処理を行うレイトレーシング法は,表示ピクセル数が少なくなれば,それに比例して単純にフレームレートは上がるはずだ。そこで,逆説的な話ながら,モバイル端末などのほうが実はレイトレーシングに向いているなどという論も出てくる。
反射回数と,描き換えられる部分(色つき)の様子。反射回数が増えるほど,色つきの部分が小さくなっている
|
|
|
|
今回の講演を見る限りでは,ラスタライズ方式の現行GPUが画質を上げていくとしても,ラスタライズであるがゆえの欠陥を補正していくのは簡単ではないかもしれない。レイトレーシング方式は,根本的に膨大な演算量が必要であるものの,それが解決されれば画質の点では有利な部分も多い。
さらに,演算量で有利になる場合もある。多重映り込みのあるシーンだ。さまざまなマッピング技法を駆使してリアルな絵作りを行う現行方式では,細部のリアリティを上げるために,フルシーンのマッピングデータを何度も別途レンダリングしなければならない。レイトレーシングでは,描画する必要があるピクセル数分だけ,レイの処理を延長するだけですむ。多重映り込みは,多重度が高くなるほど,新規で描画しなければならない面積が減っていくので(映り込み内のごく一部),超高画質にしていっても演算量はそれほど増えないのだ。
また,衝突判定を,レイを飛ばすアルゴリズムを応用して実装できることも解説された。現状の衝突判定アルゴリズムは,BSP(Binary Space Partitioning)が主流と思われるので,速度はかなり速いはずだが,衝突判定用の仕組みを入れる必要がなく,網目などの貫通判定も厳密に行える。すでに存在しているレイトレーシングの仕組みで十分いけるので,省メモリが必要な場合にはよい選択かもしれない。
1年ほど前,Intelはそれまで(非公式に)独立型GPUとなるとしていたコードネーム「Larrabee」を,純然たる演算用クラスタCPUに方向転換した。LarrabeeはテラFLOPSクラスの演算性能を持つとされているが,IntelのテラFLOPSを実現した試作チップは80個のCPUコアを集結したものとなっていた。現状の数十倍の演算能力を実現するめどはすでに立っているわけだ。
レイトレーシングが十分実用的になれば,GPU自体が存在意義を失ってくる。いま思えばLarrabeeの方向転換には,このような背景があったのかもしれない。
現在のところ,リアルタイムレイトレーシングは,「ハイエンドシステムがあったら」という条件で現実的な速度となってきた段階であり,画質などの総合面で見ると,ラスタライズ(GPU)に取って代わるのは,まだ先の話のようにも思われる。しかし,ハードウェアの処理速度などというのは日進月歩なので,これくらいの負荷のものがミドルクラスのPCで軽々動く日々も遠くはないのかもしれない。