【Watch記事検索】
最新ニュース
【11月30日】
【11月29日】
【11月28日】
【11月27日】
【11月26日】

3Dゲームファンのための物理エンジン講座 ~HAVOK編~
余ったそのビデオカードで効果物理を加速しよう!

HAVOK Senior EngineerのAndrew Bond氏
3月20日~24日(現地時間) 開催

会場:San Jose McEnery Convention Center

 物理シミュレーションのミドルウェアの老舗ともいえるHAVOKは、新しい物理エンジンの実装形式を発表した。

 その名は「HAVOK FX」。今回は、これが一体、どのような技術なのかを解説していきたい。

HAVOKとNVIDIAのタイアップセッションはGDC会期中数回行なわれたが、常時満員状態。注目度は高い NVIDIA Mark Harris氏。GP GPUのエキスパートだ



■ 2種類の物理エンジンがある

ゲームプレイ物理と効果物理
 「物理シミュレーション・ミドルウェア」、「物理エンジン」というキーワードは最近耳にすることが多いが、「どんなことをやっているソフトウェアなのか」という観点ではわかりにくい。コンピュータの中で現実世界と同じような運動や衝突、移動の演算を行なうのが物理エンジンらしい……というのは漠然とわかっても、ゲームにおける物理をどう処理しているのかはイメージか掴みにくい。まずはこのあたりから見ていくことにしよう。

 大別して、物理エンジンは「ゲームプレイ物理(Game Play Physics)」と「効果物理(Effects Physics)」に分けられる。

 たとえば敵に対して銃撃(ゲーム展開)を行ない、その銃弾が敵の胸に命中(衝突判定)、そのエネルギーを受けて敵は死亡(ゲーム展開)し、敵は吹っ飛んだり倒れたりする(Ragdoll物理)というシーンがあったとする。これはゲーム進行が物理を駆動したり、あるいは逆に駆動された物理がゲームを進行させたりしている事例だ。ゲームプレイ(ゲーム内ルールやゲーム進行)に密接に関わりを持った物理シミュレーションを「ゲームプレイ物理」という。

 このゲームプレイ物理で重要なのは、「そのシミュレーションの品質」、「そのシミュレーションがゲームルールに盛り込めるだけのカスタマイズ性を備えているか」といった部分になる。

 一方、効果物理とは、ゲーム進行によって発生させられたイベントや、ゲームプレイ物理の結果、派生して起こる物理制御を差す。

 効果物理のシミュレーションそのものはゲームプレイ物理と何ら変わりがないし、「そのタイプの物理はゲームプレイ物理だけど、このタイプの物理は効果物理」というカテゴライズはできないので説明が難しい。まあ、ゲームプレイ物理が“親”だとすれば、効果物理は“子”……このような階層構造をイメージすれば感覚的に理解できるかもしれない。

 傾向としては、具体的には液体や気体のようなものを取り扱う流体物理や、布の挙動のシミュレーションなど、ローカルで処理系として独立させても問題ないようなタイプの物理が効果物理となることが多いようだ。

 この効果物理はゲームのコンテンツに関わりの少ないシミュレーションになることから、ゲーム進行を司るゲームループ(ゲームロジック)から独立させて処理しても問題がなさそうだ。つまり、並列処理をしても良さそうだということになる。つまり、これはマルチスレッド処理のテーマに最適ということになるわけだ。

 さらにソフトウェア的に独立性が高いということは、この部分のハードウェア的なアクセラレーションはやりやすいということにもなる。そんなわけでNVIDIAとHAVOKは「効果物理はGPUでアクセラレーションできる」と考えたのだ。



■ HAVOK FXは効果物理

 2005年、NVIDIAとHAVOKの両社の研究開発チームがタッグを組んで共同開発プロジェクトを立ち上げ、開発がスタートしたのが「HAVOK FX」だ。

 GPUは、浮動小数点ベクトル演算器を並列実装したものであり、データ駆動型の並列プロセッサということができる。プログラマブルシェーダ3.0仕様(Shader Model: SM3.0)では、ピクセルシェーダに動的条件分岐がサポートされ、実行命令数にも制限がなくなっており、プログラマビリティも向上している。GPU-ビデオメモリ間は非常に高速なメモリ帯域が確保されており、パフォーマンスも高い。

 上手く実装すれば、GPUを高速な物理アクセラレータとして利用できるのではないか……とHAVOKとNVIDIAは考えたのだ。

最新Pentium 4と最新GeForceとの演算性能比較。縦軸はGFLOPS
 GPUをグラフィックス描画以外で活用するという概念自体がピンと来ない人もいるだろう。

 実はGPUも、入力されたデータに演算を施してこれをメモリに書き出すという処理が行なえるという意味において、できることやっていることはCPUとさほど変わらない。GPUにとってのメモリはフレームバッファ(レンダーターゲット)やテクスチャになるわけだが、最終的に映像としてディスプレイに出力せず、その結果を単なる数値データ列として何かに利用すれば、GPUを汎用プロセッサとして活用したことになる。これが数年前から注目を集めてきた「GP GPU(General Purpose GPU)」というソリューションだ。

 NVIDIAとHAVOKが開発したHAVOK FXは、いわばGPGPUの一形態ということなのである。



■ HAVOK FXの動作の仕組み

3つのステージに分けられた物理処理
 効果物理をGPUで処理させるアイディアを実現するにあたり、HAVOKとNVIDIAは効果物理を以下の3つのステージに分割した。

(1) Integrate 初動計算
(2) Collide 衝突判定
(3) Solve Collisions 衝突結果の反映

 (1)はそのオブジェクトがどう動くかを処理するフェーズだ。処理すべき加速度や向きといった情報を、各オブジェクトに対して反映していく。

(1)の初動計算


 (2)は(1)の結果を踏まえて、誰と誰が衝突するかもしれないという判定をしてそのペアを見つけるフェーズだ。

(2)の衝突判定。誰と誰が衝突する可能性があるのか、ペアを作る


 (3)は(2)の結果を踏まえて実際の衝突の物理シミュレーション結果を適用していくフェーズだ。算出された挙動を持って(1)へと舞い戻る。

(3)の実際の衝突計算。形状にも配慮して衝突後の力の伝搬を算出


初動計算はまとめてGPUで一括処理できるテーマ
 (1)の初動計算は、完全に独立したオブジェクト達への一括処理なので、並列処理が可能。そこでGPUの各ピクセルシェーダ(GeForce 7800/7900ならば24基)に初動計算プログラムをロードしておき、これに一気にタスクを流し込むことになる。

衝突判定で衝突ペアを求める。これはCPUで行なう
 (2)はGPUにとって難しいテーマだ。誰と誰が衝突する可能性があるかを判定するのは、総当たり処理になってしまい、並列処理をするのが難しい。

 そこでHAVOK FXではこの部分は(1)の結果を読み出して、CPUのマルチスレッドプログラムの実行で衝突判定を取っている。CPU側に持ってくることでゲームロジック側の介入を挟み込めるメリットもある。

 (3)は複雑だ。衝突は1対1ではなく1対複数の場合もあり、これは(2)同様にGPU向きの処理でないように思える。

 最も基本的な方針としては、(2)の結果によって導き出された、「誰と誰が衝突している可能性がある」という「衝突リンク」を順番に処理していくものになるが、1対複数に衝突しているケースでは相互依存性があるためにGPU向きの並列処理に流し込めない。

衝突リンクを順送りに処理していたのでは並列プロセッサであるGPUに上手く流せない


 これまたCPUに処理させなければならないか、と思いきや、このあたりの処理のマルチスレッド化に明るいHAVOKでは、賢い方法でこの処理をGPUに実装している。同じオブジェクトが2度登場しないように衝突リンクをグループ分けして、このグループ単位でGPUに流し込むのだ。

独立している衝突ペア単位で並列処理していく
1対複数が発生している場合はそのオブジェクトを含む衝突リンクを別々の処理系パイプラインに流し込む。複数回パイプラインを回すことになるが、回すごとに処理する量は減っていくことになる



■ ゲームプレイ物理とHAVOX FXのインタラクトについて

 HAVOKでは、“親”となるゲームプレイ物理はCPU側で処理される。この点がAGEIAのPhysXシステムと異なる部分である。効果物理は、あくまで“子”の物理処理なので、“親”のゲームプレイ物理との相互作用について考える必要がある。

 親はCPU、子はGPUで処理されるHAVOKだが、上記(2)のフェーズで、CPUが物理シミュレーションに関与できるようになったタイミングがあるので、ここでパラメータに更新をかければいい。

 デモンストレーションでは、竜巻に巻かれる無数の空き缶や三角ポールといったゴミの様子が公開されたが、ゴミ同士の衝突は効果物理としてGPUで処理されるが、この竜巻の挙動はCPUのシミュレーションで実行され、その挙動更新は(2)のフェーズのときにCPUの管理下で行なわれる。

GPUから物理パラメータを読み出してCPU側で特別な物理処理を加えて再びGPUに戻す
竜巻をCPUで再現し、その挙動を効果物理管理下のオブジェクト達に反映させる
竜巻のムービー
(WMV形式、ZIP圧縮、21.2MB)


 さらに、最新のゲームプレイ物理エンジンのHAVOK4では、このHAVOK FXとの完全な統合を実現しており、ゲームプレイ物理(HAVOK4)と効果物理(HAVOK FX)との連携もしっかり行なわれている。つまり、ゲームプレイ物理で動かしているキャラクタと効果物理で動かしているパーティクルや小道具とのインタラクトなども問題なく処理できるということだ。

 これはゲームプレイ物理で動かしているキャラクタの物理衝突形状をシミュレーション実行前(場合によっては実行毎)に効果物理の衝突形状を取り扱っているGPU側のビデオメモリに転送してしまい、効果物理シミュレーション実行時には、その他のオブジェクトと同列に処理してしまうことで実現する。ゲームプレイ物理で動かしているキャラクタが動いた場合は、そのキャラクタの更新情報だけを毎フレームごとにGPU側に転送すればいい。

 これで、効果物理で動かしたオブジェクトが、ゲームプレイ物理で動かしたキャラクタを突き抜けたり……といったことがなくなる。この仕組みにより、ゲームプレイ物理で動かしているキャラクタに着せた服について布シミュレーションを効果物理を実行させるといったことなども問題なくできるわけだ。

ゲームプレイ物理と効果物理のインタラクトは、ゲームプレイ物理からの適当なタイミングでの効果物理へのデータ更新で実現する 無数のゴミの中を兵士が歩くデモ。兵士の足の動きによってゴミはかき分けられたり、蹴られてすっ飛んだりする
歩兵とゴミのムービー
(WMV形式、ZIP圧縮、31.1MB)


 なお、ゲームプレイ物理(HAVOK4)→効果物理(HAVOK FX)への一方向のインタラクトだけでなく、逆へのインタラクトももちろん可能となっている。HAVOK FXは、毎シミュレーション終了後の、その時点でのオブジェクトの向きや位置、その他のカスタム付随情報までを列記した頂点バッファを取り出すことができるので、これを利用すればいいのだ。GPUからPCI Expressバスを通じてのデータ取り出しは遅いというのが定説ではあるが、HAVOKが実験した限りでは3Dゲーム処理に求められる性能に事足りるということであった。

 なお、HAVOK FXは立体的な衝突形状(Convex Model)を持った剛体物理だけでなく、シンプルなパーティクル制御、流体物理までをサポートする。その証拠デモンストレーションとして、パーティクルシステムを使った3Dキャラクタと蒸気とのインタラクト、パーティクルシステムを使った大量の飴玉の挙動やパーティクルベースの水の表現などが披露された。

吹き上げる蒸気を歩兵が走り抜けるデモ。蒸気は兵士によってかき分けられる
水の流体物理をパーティクルベースの効果物理で再現
蒸気と飴玉のムービー
(WMV形式、ZIP圧縮、36.5MB)



■ HAVOK FXはRADEON X1000シリーズでも動作可能 ~Geforce 6 + 7、GeForce + RADEONといった異種デュアルGPUでも動作可能!?

 HAVOK FXのパフォーマンスは、GPUの性能に大きく依存する。

 最初、HAVOK FXはNVIDIAのSLIシステムと連動した発表のされ方をしたので、SLIシステムでなければHAVOK FXが動作できないような報道もあったが、実際には、シングルGPUのシステムでもHAVOK FXは動作する。その場合、GPUはHAVOK FXとグラフィックス描画の両方を行なうことになるので、ビデオメモリ容量が十分なビデオカードでないとグラフィックスの解像度が上げられないといった弊害も出てくる。

 現実的には、GPUを2個同時に駆動させるデュアルGPUシステムの方がHAVOK FXのアクセラレーションは強く効いてくる。これは片方のGPUを完全にHAVOK FX専用に利用できるからだ。

2基のGPUがシステムにあった場合、その1基を物理アクセラレーション専用に利用できる NVIDIAの実験によれば、シングルGPUとデュアルGPUとで、15,000個の岩を転がすHAVOK FXを実行したときのパフォーマンスの向上率は1.7倍となったという。これはSLIシステムの価値を新たな視点から高めることになりそうだ


 さて、筆者がHAVOK関係者にインタビューしたところ、面白い情報を得ることができた。

 ひとつは、HAVOK FXはATIのGPUでも問題なく動作できるというもの。HAVOK FXはプログラマブルシェーダ3.0(SM3.0)仕様のGPUであれば動作できるので、RADEON X1000シリーズでも問題なく動作できるのだそうだ。なお、RADEON X1000シリーズは、SM3.0の機能のうち、頂点シェーダからテクスチャアクセスを可能にするVTF(Vertex Texture Fething)に対応していないが、HAVOK FXではVTFを利用していないので問題がないのだという。

 もうひとつの情報は、異なる仕様のGPUを組み合わせたデュアルGPUシステムでもHAVOK FXが動作できるというもの。つまり、GeForce 6800でHAVOK FX、GeForce 7900で3Dグラフィックスレンダリング……といったことが可能だというのだ。たとえばユーザーがGPUを買い換えた際、新しく購入した新GPUにグラフィックスを担当させ、もともと持っていたGPUにHAVOK FXを実行させるといったことが可能になる。

 HAVOK技術者によれば、「GeForce 7シリーズが最速なのは間違いないが、先代のGeForce 6シリーズも物理エンジンアクセラレータとしては必要十分な性能を持っている」という。これは「旧ビデオカードの新たな使い道」として3Dゲームファンには朗報だろう。

 また、ATIとNVIDIAの混在環境で、RADEONに物理、GeForceで描画……といったことはできるのかとHAVOK技術者に聞いてみたところ、「やったことはないが技術的には可能だし、多分大丈夫」との返答が得られた。ゲームによって物理と描画担当を切り替えてみるなど、コンフィギュレーションをいじるのもかなり楽しそうだ。

 AGEIAに対するアドバンテージは? との質問には「AGEIAのPhysXは物理エンジンアクセラレータ『PhysXカード』を購入しなければアクセラレーションできないが、HAVOK FXでは手持ちのGPUでアクセラレーションできる点が特長」という。

 さらに、「SLIを組めば、普段は2基のGPUで倍速レンダリングマシンとして活躍でき、一方HAVOK FX採用タイトルを動作させるときには片方のGPUを物理エンジンアクセラレータに回すことができて、一台二役の活用ができる」と補足した。

 このようにHAVOK FXの優位点アピールしつつも「もしAGEIAかPhysXの仕様をオープンにするのであれば、HAVOKをPhysXチップでアクセラレーションできるようにしてもいいと思っている」とも言っていた。Havokはソフトウェアメーカーなので、アクセラレーションできれば、そのハードウェアの種類はGPUでもPPU(物理エンジンプロセッサ)でもなんでも問わないという姿勢のようだ。

 HAVOK FXは今年の夏に製品版が出荷され、実際の採用ゲームの登場はその後になる。2006年は、物理エンジンのアクセラレーションというテーマが熱くなりそうである。

シングルGPUで、デプススプライトベースの飴玉を2万個を動かして描画して平均50fps
NVIDIAのデュアルGPUシステムであるSLIシステムでは3万個の岩の剛体物理処理を行なって平均20fpsが達成できている 有名タイトルでは、「Hellgate: London」が対応を表明している。無数の虫を放出して敵を襲わせる特殊武器などの表現はHAVOK FXを使ってアクセラレーションされる
「Hellgate: London」のムービー
(WMV形式、ZIP圧縮、9.2MB)
岩のムービー
(WMV形式、ZIP圧縮、37.6MB)


□Game Developers Conference(英語)のホームページ
http://www.gdconf.com/
□Game Developers Conference(日本語)のホームページ
http://japan.gdconf.com/
□関連情報
Game Developers Conference 2006 記事リンク集
http://game.watch.impress.co.jp/docs/20060324/gdclink.htm

(2006年3月26日)

[Reported by トライゼット西川善司]



Q&A、ゲームの攻略などに関する質問はお受けしておりません
また、弊誌に掲載された写真、文章の転載、使用に関しましては一切お断わりいたします

ウォッチ編集部内GAME Watch担当game-watch@impress.co.jp

Copyright (c) 2006 Impress Watch Corporation, an Impress Group company. All rights reserved.