ゲーム開発者向けイベントCEDEC 2008の2日目では,朝から夕方まで4コマにわたってNVIDIAによるグラフィックス技術を中心としたセッションが行われた。CEDECでは恒例となっている
「開発の鉄人」のサブイベントである。ここでは,NVIDIAの一連のセッションの内容をまとめてレポートしておく。とはいえ,かなりプログラマ寄りの難しい話も多かったので,4本分の講演から,4Gamer的においしい部分をかき集めて紹介してみたい。
DirectX 11時代のオブジェクト表現手法
DirectX 11でのテッセレーションでの注意点を解説するNVIDIA風間隆行氏
|
まず,「DX11における変位細分割曲面のテッセレーション」という講演では,その名のとおりDirectX 11に追加されるテッセレーション(オブジェクト分割)の仕組みに関する講演が行われた。先日行われた
Gamefestでマイクロソフト自身が解説した新パイプラインの話とかぶる部分も多いが,とくにベジエパッチの計算法について念入りな解説がなされていた。あまりに細かい部分は,ここではパスしておくが,DirectX 11のテッセレーションが実現されると,キャラクターモデルなどが近くにきても輪郭がカクカクしないことだけ理解しておけばよいだろう。
さらにテッセレーションでは,ポリゴン分割を行う際に,ベジエ曲面などを使って滑らかに補間するような頂点を出力する。これは確かに滑らかではあるが,これだと,のっぺりと丸いモデルしかできないので,ここにディスプレースメントマッピングを加えて,非常に詳細なモデリングに仕立てようというのが,DirectX 11時代でのポリゴンモデルの扱い方となる。
ところで,ローポリモデルにノーマルマップでディテールを追加する手法は,最近のゲームでは主流といえるものになっているが,それを初めて実用レベルで実装したDOOM 3を思い起こすと分かるように,ノーマルマップで飾っても,ローポリモデルのままだと輪郭がカクカクでいま一つクオリティは高くならない。ディスプレースメントマッピングは,ノーマルマップと似ているが,ポリゴン内の見え方だけを変更するノーマルマップとは異なり,実際に凸凹を貼り付けると形状そのものが変化するので,横から見ても違和感のないモデルを作ることができる。
ディスプレースメントマップとテッセレーションを組み合わせる際の手法と注意点や新しいツールなどについても紹介があった。
ディスプレースメントマップをうまく張り込むための手法の一つ。MipMap適用時にはやや注意が必要とのこと
|
さて,新しく追加されるハルシェーダ,テッセレータ,ドメインシェーダの3種類の機能。プログラマブルシェーダ全盛の昨今,なんでテッセレータだけ固定機能なのだろうかと疑問に思っていた人はいないだろうか? 会場からもそのあたりに関する質問が出ていたのだが,いま一つうやむやな感じでよく分からなかった。講演後に確認したところ,テッセレータの位置付けがなんとなく分かったので,そちらを紹介したい。
ハルシェーダは,パッチに関する操作を行う新シェーダで,ドメインシェーダは頂点を扱う新シェーダである。32頂点からなるデータを扱うハルシェーダでの処理のあとに1頂点ずつの処理を行うドメインシェーダの処理が行われるわけだが,その間にあるテッセレータというのはどのような処理をしているのか,それがいま一つ謎だった。今回聞いた話では,少なくとも現状のところ,テッセレータはドメインシェーダのセットアップユニットとして動作するものという理解でよいようだ。
例えば,ベジエ曲面による分割を行う場合,曲面自体を規定する制御点は16個分の情報が必要となる。そして,パッチ内の位置を表すのに,u,v座標が指定される。ハルシェーダで扱うパッチ内をu方向に10回,v方向に5回分割する場合,uv座標ごとに(0.1,0.0),(0.2,0.0)……(0.1,0.2)……といった感じでパラメータが指定され,そこから新しい頂点が生成される。この処理で,新しい頂点の座標を計算し生成するのはドメインシェーダの役目となる。テッセレータはというと,(0.1,0.2)といったパラメータを生成して,順にドメインシェーダに渡して呼び出すだけ。名前からすると,テッセレーションの中心的な処理をしている雰囲気があるのだが,非常に単純な処理をするユニットだという。
分割の実体はドメインシェーダで行われ,ここはプログラマブルなのだから,ベジエ以外での分割法実装も可能だということだ。ベジエパッチ以外に軽くグレゴリーパッチ(改良型ベジエ曲面)の話や,言葉だけだがBスプライン,NURBSといった単語も出てきていた。
そもそも,なんで3個ものユニットに分けて処理しているのだろうかというのを想像すると,例えば,極端な例で100×100個に分割を行う必要があった場合,1個のユニットで高次方程式を使う処理を1万回繰り返すとさすがにボトルネックになりそうだ。呼び出し部分が独立していれば,複数のドメインシェーダを使った並列処理もできる。GPUを効率よく回すには,このような機能分担がよいのだろう。
講演の趣旨とはちょっと違ったところかもしれないが,個人的にちょっと理解できていなかった部分がすっきりしたのは収穫であった。
ちなみに,今回行われた講演中のデモモデルに使われていたのが,なんとなくエイリアンぽい人型やモンスターデータで,なんでもValveから借りてきたものだとかいう話だった。既存のゲームでは見たことのないモデリングデータなので,DirectX 11世代にリリースされるValveの新作なのかも……と,妄想を膨らませてみるのもいいかもしれない。
PhysXを使いやすくするAPEXの追加情報
PhysXとCUDAを紹介するKitty Vongsay氏
|
以前ちょっと紹介したPhysXで環境ごとに負荷制御ができるようになるAPI,APEXについて少し情報が追加できたのでそれも紹介しておこう。
APEXは,ゲームの実行環境によって,どの程度PhysXの負荷を増やすのかをいろいろな項目別に指定できるようにする仕組みで,負荷調整機能を伴った高機能APIが作られている。今回は,Destruction,植物,布のモジュールの動作が確認できた。
Destructionは,物体が壊れる挙動を物理演算でシミュレートするもので,PhysXでは,あらかじめ壊れたあとの分割済みオブジェクトを定義しておいて,必要に応じてオブジェクトをそちらに切り換え,破片を物理運動させる方式となる。破壊の規模が変わると,ゲーム物理に影響するのではないかとの懸念もあったのだが,デモとその解説からすると,破片の大きなものは最低レベルでも最高レベルでも同じように処理され,レベルが上がることで変わるのは,ごく小さい破片の量だけで,ゲーム物理には影響しない部分での調整のようだ。まあ順当な実装ではあるのだが,レベルを上げてもそんなに派手な割れ方になったりはしないのは少し残念か。
植物系のモジュールは,植生のミドルウェアとして有名なSpeedTreeに対応したもので,SpeedTreeの樹を物理運動させることができるというものになる。負荷制御の詳細は不明だったが,枝葉などの動かす単位などによるものと推測される。