[CEDEC 2006#08]NVIDIA,DirectX 10を利用したエフェクトの実例とパフォーマンスの秘密を解説
CEDEC 2006の2日めには,メインスポンサーであるNVIDIAによる開発者向けセッション「開発の鉄人」が開催された。朝から夕方まで4コマ連続で開催されたもののなかから,ここでは「DirectX 10のエフェクトとパフォーマンス」と題されたセッションの模様をレポートしたい。
■DirectX 10のキモはジオメトリシェーダとStream Output
Brian Deudarshu氏
|
さて,「パフォーマンス」と題されているだけに,「DirectX 10のパフォーマンスに関して,NVIDIAの次世代GPUを絡めた,突っ込んだ解説があるのでは?」と期待してしまう向きもあるだろう。実際,若干ながらパフォーマンスに関する話題もあったのだが,NVIDIA日本法人のシニア・エンジニアであるBrian Deudarshu(ブライアン・デゥダーシュ)氏による講演のテーマは,「DirectX 10のエフェクト(の使い方)」のほうだった。CEDEC自体が,ゲーム開発者に向けたイベントなので,こちらがメインになるのは,致し方ないところだろう。
DirectX 10に関しては4Gamerでも何度となく取り上げているが,DirectX 10ではドライバレベルでの大改変がなされ,(難しい話をすれば)システムコールからして大きく変わってくるなど,3Dプログラミングに与える影響も大きい。 そして,2006年8月30日に行われたATI Technologiesによるセッションでも解説されたとおり,グラフィックスパイプラインにジオメトリシェーダ(Geometry Shader)ユニットが新設され,各シェーダユニットがグラフィックスメモリにアクセスできる点がDirectX 10の大きな特徴だ。
というわけで,このNVIDIAのセッションでも自ずとジオメトリシェーダとSteam Outputの応用が中心テーマになった。ジオメトリシェーダやStream Outputを用いた具体的な事例を,一部のサンプルコードとともに紹介するという内容である。どのような例が取り上げられたのか,簡単に紹介していこう。
●ジオメトリシェーダを用いた ●リアルタイムのファーシェーディング 毛が生えた動物のようなゲームキャラクターを使いたい場面があったとする。このとき,ふわふわとしたファー(毛)をリアルタイムでレンダリングするのは,それなりに難しい。
現在,ファーシェーディングでは,主に「シェル法」が用いられている。キャラクターの表面に,半透明テクスチャを何層か(ここでは8層)重ねてシェルを描き,表面にボケ味を出す。そのうえで,キャラクターの表面から垂直に立ち上がる毛のようなヒレ(フィン)を重ねる。これによって,毛のふわふわとした感じを表現するというのがシェル法の概要だ。このとき,「毛のないキャラクターモデルから,フィンを生成する」のに計算が必要になるため,それなりに重い処理となる。
ジオメトリシェーダはCPUから頂点シェーダユニットを介して与えられた頂点や線,三角形をもとに,そこから計算によって,別の頂点や点,三角形を生成できる
|
この点,DirectX 10では,フィン生成にジオメトリシェーダを利用できる。ジオメトリシェーダでフィンの頂点を生成させてレンダリングすればいい,というわけだ。簡単に言うと,CPUに負荷をかけることなく,GPUだけで毛が生えたキャラクタが画面に描けるわけである。
●Stream Outputを用いた布の処理 ジオメトリシェーダには,フレームバッファ(≒グラフィックスメモリ)にデータを書き出す機能「Stream Output」が用意されているといる。この機能については,先述のATI Technologiesによるセッションでも紹介されたが,Deudarshu氏は,その応用例として,布の処理を挙げてみせた。
現実的な話として,例えば衣服として用いられる布は,キャラクターの動きに応じてひらひらと動いたりする。あるいは,破れて風に舞ったり,何かと衝突したときにはへこむと同時にしわが寄ったりと,なかなか複雑な動きをするわけだが,ここで紹介されたのは,この布を,スプリングのようなもので結合されたパーティクル(粒子)の集まりとしてシミュレートする方法だ。
布を,この図のようなスプリングで結合されたパーティクルの集まりとしてシミュレートする。パーティクルは隣り合ったパーティクルに拘束されている
|
右のスライドにある「構造用スプリング」の概念図を見てほしい。このように,隣り合った点同士はスプリングでつながっており,動きには制限と波及効果がある。あるパーティクルが動くと隣のパーティクルが動き,さらにその隣のパーティクルが……という具合である。すると,全体として布のような動きを表現できるわけだ。 そして,このようにお互いに拘束されたパーティクルの動きの計算に,ジオメトリシェーダとStream Outputを用いるという。あるパーティクルの計算を行うと,その結果が次のパーティクルの動きに影響を与える。ジオメトリシェーダは計算結果をグラフィックスメモリに書き出して,そのデータをもとに再び計算を行えるので,パーティクルの動き(≒布の動き)のような計算は得意,というわけだ。
実際には,以上のような方法だけでは計算量が大きくなり過ぎる。そのため,Deudarshu氏は計算量を減らすテクニックなども解説したが,これはさすがにプログラム手法の話になるので,本稿では省略させていただきたい。
●GPUを使ったメタボール(マーチングキューブ)
メタボールの例
|
最後の実例は「マーチングキューブ」とも呼ばれる「メタボール」だ。これは,かなり昔に流行した3D技法で,見たことのある読者もいるだろう。液体のような動きをする金属っぽい物体……映画「ターミネーター2」に出てきた殺人アンドロイドといえば「ああ,あれか」と分かるかもしれない(分からないか?)。
メタボールを理解するに当たって,少し予備知識を。 地上では,地面から離れるに従って,「位置エネルギー」と呼ばれるエネルギーが大きくなる。そして,位置エネルギーが同じ地点を結んだ面を「等重力ポテンシャル面」という。一番分かりやすいのは海面で,海面は,地球上のどこにあっても,位置エネルギーが同じところにできているのだ。
GPUにスライドの右側で示されているようなメッシュを与え,GPUで等ポテンシャル面とメッシュの交差する場所を求めて,そこから新たな頂点を生成する
|
というわけでメタボールだが,メタボールでは,重力の代わりに適当な関数が与えられており,関数の結果が等しくなる面を「等ポテンシャル面」として描いている。GPUに,空間をメッシュに区切った頂点データを与えると,DirectX 10では,ジオメトリシェーダが「その頂点が等ポテンシャル面の内側にあるか外側にあるか」を計算し,そのうえで等ポテンシャル面がメッシュと交差する点を推定し,そこを新たな頂点としてレンダリングする。これにより,GPUだけでメタボールを描けるのである。
■DirectX 10のパフォーマンスは?
講義では,これらの課題について,それぞれコード例を挙げつつ詳しい説明がなされた。開発者には参考になった部分もあったのではないだろうか。 だが,演題として掲げられたパフォーマンスは? と戸惑う読者は多いだろう。実は,ここまで述べてきたことに,すでにパフォーマンスが含まれているのである。
今回はファー,布,メタボールと三つ例が挙げられたが,いずれも「CPUをほとんど使用せずに実現できる」ことが大きなポイントだ。CPUは,こうした処理から解放されるわけだから,その分,ゲームのパフォーマンスは上がることになる。
ジオメトリシェーダはメモリにデータを書き出す機能を持つ。この機能を使うと再帰的な処理(一度処理したデータを,もう一度使って同じ/別の処理を行うこと)などをGPUで行えるようになる
|
例えば,ゲームにスライムのような“ウネウネ系”モンスターが現れたとしよう。モンスターがプレイヤーを襲う,というのはシナリオスクリプト,あるいはモンスターのAI上の仕事で,DirectX 9でもDirectX 10でもCPUの担当だ。だが,この先が異なる。DirectX 9では,少なからずCPUが描画に関わる必要があるのに対し,DirectX 10ではモンスターの描画処理はGPUが一手に引き受けてくれる。これにより,CPUは「モンスターにプレイヤーを襲わせる」などといった,ゲームの本質に関わる部分に専念できるようになる。そしてこの結果として,DirectX 10世代ではゲームのパフォーマンスアップが見込めるというわけだ。
また,セッションの最後に設けられたQ&Aのなかでは,メモリアクセスにかかる時間の低減についても触れられていた。 CPUからフレームバッファにアクセスするには,PCI ExpressやPCIなどを介する必要があり,かかる時間が大きい。この点,DirectX 10ではシェーダユニットがグラフィックスメモリにアクセスでき,CPUに近い汎用性の高い処理が行えるよう改良されているので,CPUがフレームバッファ(=グラフィックスメモリ)にアクセスするという,時間的ロスの多い動作が不要に――とまではいかないかもしれないが,少なくは――なる利点もある。
ちなみに,DirectX 10対応のGPUの登場時期やパフォーマンスについては「発表されていない製品については触れられない」という予想どおりの答えが返ってきた。 NVIDIAによる講義ではあるものの,NVIDIA製GPUに特化した部分はなく,総じてDirectX 10の使い方に絞った内容だった今回の講演。ハードウェアの新情報を期待していた向きには期待ハズレだったかもしれないが,参加したゲーム開発者には,それなりに参考になったのではないだろうか。(米田 聡)
|
|
|