D-MAPテクノロジーについて発表を行なったMatroxのJuan Guardado氏 |
会期:3月19日~3月23日(現地時間)
開催地:San Jose McEnery Convention Centerなど
サンノゼにて19日から24日まで開催されたGame Developers Conferenceにおいて、MatroxはDirectX 9のDirect3D(通称D3D9)においてサポートされることが決定しているディスプレースメントマッピング(Displacement Mapping)と呼ばれる新テクノロジーについての技術解説を行なった。
本稿ではこのテクノロジーの基本を理解すると共に、ここから見えてくるD3D9対応ハードウェアの姿までを予想してみることにする。前回のレポートでは、D-MAPのメリットや概念を解説したが、今回はその詳細や課題点などについて解説する。
■D-MAPの秘密に迫る~MatroxのD-MAPはバンプマッピングとの合わせ技で実現
【図3】 |
図3はD-MAPを実現するための基本概念図をプロックダイアグラムで表現したものだ。これを理解するとD-MAPの仕組みがよく分かってくるので、ここからは、この図を見ながら解説していく。
まず、図中の「High-Res D-MAP」はD-MAPを実現するための高品位な凹凸情報が格納されている領域だ。これを元に「Base-Mesh」で表される基本形状3Dオブジェクトを変形していくことになる。
ただ、いつも高品位なD-MAPを全てのオブジェクトに適用していたのでは無駄が多すぎる。例えば、遠く離れて小さく見える3Dオブジェクトに数千ポリゴンに及ぶD-MAP変形を行なっても、ほとんど細部が表現されないので演算量が無駄になる。これはどうしたらいいか。
テクスチャマッピングに置いて、テクスチャを貼り付けるオブジェクトの距離に応じて、テクスチャを最適な図柄に拡大縮小して取り扱うMIP-MAP(Multum In Parvo Mapping)という仕組みがあるのは多くの人が知っていることだろう(図4)。
【図4】昔ケータイWatchで私が書いた記事の図を再利用する。D-MAPにおけるMIP-MAPも基本的な考えは同じ。拡大縮小する対象がピクセルか数値データかの違いがあるだけ |
High-Res D-MAPには凹凸情報の数値データが入っているわけだが、これをテクスチャマッピングのMIP-MAPの仕組みを利用して、描画オブジェクトの視点からの距離に応じた「Low-Res D-MAP」すなわち、粗い凹凸情報を自動生成するのだ。
このあと、自動生成されたその粗い凹凸情報を元に、3Dオブジェクトに対してポリゴン分割/頂点生成して変形するわけだが、視点からの距離が離れている関係でポリゴン分割するには及ばないほど小さく見える凹凸情報が出てくる。
これを無視してしまうことも出来るわけだが、Matroxの研究では、Low-Res D-MAPのMIP-MAP生成時に、法線ベクトル・マップまでを生成する方式を考案したという。
生成された法線ベクトル・マップは何に使うのか…… そう、これはご存じバンプマッピングに使えるデータである。
つまり、Matroxの考えるD-MAPとは、「大きな凹凸はD-MAPで形成し」、「細かい凹凸はバンプマッピングで表現する」、というシステムになっているわけだ。
■D-MAPを実現するために必要不可欠な機能ブロック~ハードウェア・テッセレーションとは?
今一度、図3をみて欲しい。
Vertex Shader、Pixel Shaderというのは既にDirectX 8.0登場後お馴染みのキーワードだが、これに加え、「Vertex Decl」という目新しいブロックがあることに気が付くだろう。これはなにか。
これはVertex Declaratorの略で、意訳すると頂点生成を行なうところ、ということになる。最近ではMatrox内部ではVertex Declaratorとは呼ばず、Vertex Tessllatorと呼んでいるそうだが、確かにそちらの方が表現的に分かりやすい。
Tessllate(テッセレート)は辞書で引くと「モザイクにする」といったような意味があるが、3Dグラフィックスでは狭義的に「平面分割」の意味で解釈される。
このVertex Tessellatorでは、生成されたLow-Res D-MAPの凹凸情報に従って平面分割を行なう。
【図5】DirectX 9のDirect3Dには「DMA&Tess」という機能ブロックが追加されている。D-MAP機能の要はここにあり |
図5はDirectX 9のDirect3Dデバイスのオブジェクトモデル図だが、「DMA&Tess」と記載されているブロックに目がとまるだろう。そう、Vertex Tessellatorはまさにこのブロックに相当するものなのだ。
Vertex Tessellatorは、おそらくはプログラマブル頂点シェーダ同様にCPUでのエミュレーションが可能なはずだが、ここがハードウェアアクセラレートされたビデオカード(GPU)こそ、真のDirectX 9対応を謳えることになるはずだ。
さて、これ以降の流れはこれまでの3Dグラフィックスの処理系と変わらない。
頂点シェーダーでジオメトリセットアップと頂点単位のライティングを実行、ピクセルシェーダーで実際のシェーディングを行なっていく。その際、Low-Res D-MAP生成時に作られたHigh-Res Normal Mapを元にバンプマッピングも適用していく。
図3中のHigh-Res D-MAPはいわゆるテクスチャマップに相当する。なお、凹凸のある面に貼り付けるので、その図柄は凹凸を考慮した形でデザインされている必要がある。
■D-MAPが抱える課題~D-MAPの美しさと速さを両立させたGPUがDirectX 9ナンバーワンのGPUとなる
リアルタイムD-MAPの研究とその実装案についてはいろいろと問題点や課題点も残されているようだ。セッション中でいくつか興味深い話がなされたのでいくつか紹介しよう。
まず、テッセレーションのアルゴリズムについて。
【図6】 |
基本的には分割後の各三角形の面積が等しくなるように分けていけばよいのだが、どう分割してもいいのかというとそうでもない……ということが分かっているらしい。
図6は三角形の分割パターンの例だ。ともに面積を等しく分割しているが、それぞれの分割方式でD-MAPを適用していくと、その反映され方が微妙に違ってくるという。これを図として表したのが図7a/図7b/図7cだ。
【図7a】 | 【図7b】 | 【図7c】 |
映像は図7aに対し真ん中にくぼみのある山をD-MAPしたものだ。図7cの最終段階では分割パターンの違いでその外観に大きな違いは現れていないが、図7bの途中段階の映像を見ると、真ん中の分割パターンではトゲのようなものが頂上に生えてしまっていて不自然だ。Matroxによれば、テッセレーションは二等辺三角形や正三角形となるように分割した方が、その途中段階が美しくなるという。
ここで「なぜ、分割の途中段階のクオリティを気にする必要があるのか?」という疑問が出ることだろう。
D-MAPは視点からの距離に応じてD-MAP精度を変える、すなわち分割数を適宜増減する、ということを上で説明した。つまり、D-MAPが適用されて変形された3Dオブジェクトは、視点に近づくに連れて、ポリゴン分割数が増えてくるわけなのだ。だから、分割数が少ない時の映像から、分割数が多いときの映像までがスムーズに変化して見えないと不自然になってしまう。
図7の真ん中の分割パターンでは、「ポッピング」と呼ばれる、視点からの位置関係でオブジェクトの形状が劇的に変化してしまう現象が起こってしまうのである。
ところで、この「ポッピング」と呼ばれる問題はポリゴン分割パターンだけで解決できる問題ではない。
D-MAPでは視点からの距離に応じて精度の違うD-MAPをMIP-MAP機構を利用して生成していることは既に述べたが、テクスチャ画像を拡大縮小するのとは違い、下手に凹凸情報を間引くと凸部分が急にへこんでしまったり…… といったポッピング現象に見舞われてしまうのである。いくらポリゴンの分割法が完璧でもこうなってしまってはダメなのだ。
ちなみに、こうした動的な頂点間引きの処理系としては動的LOD(Level of Detail=視点からの距離に応じて3Dオブジェクトの頂点を間引く処理)というのが有名だ。
最近の3Dゲームにおいて、遙か彼方の地形までをレンダリングして見せてくれるエピックスケールな3D地形表示エンジンを持つものは、こうした仕組みを自前で内蔵している。しかし、その頂点の間引き方がまずいケースではこのポッピング現象がよく目に付く。
Matroxでは、この問題に対し、「体積がなるべく変化しないように頂点を間引いていく」というMIP-MAPアルゴリズムを適用することで、ポッピング現象が抑えられるようになったという。発想としては単純だが非常に理にかなっている。しかし、これをハードウェア・アクセラレートするとなるとかなり複雑なロジックとなりそうだ。
このほか、D-MAPのつなぎ目に関しての課題も報告された。
画像テクスチャの貼り付けの際もそうだが、テクスチャとテクスチャの継ぎ目が目立つことがある。この「継ぎ目を見せないテク」というのはテクスチャ職人の腕の見せ所でもあるわけだが、D-MAPの場合は凹凸の情報の継ぎ目を見せないようにするという、これまでのテクスチャデザインは異なったコツが必要になってくるのだ。
また、基本形状モデルにD-MAPを適用したところはそれに従って変形されるが、適用していない部分については基本形状のままとなる。D-MAP適用範囲内と範囲外とであからさまにジオメトリ構造が違っていると、その継ぎ目も露呈してしまう。これが、立方体が宇宙船にD-MAP変形できない理由の1つだ。
こうした問題は、D-MAP関連ユーティリティやD-MAPサポートハードウェアとの両側面からのサポートにより徐々に解決していくことになりそうだ。
Matroxでは開発者向けのD-MAP関連ユーティリティを3Dグラフィック制作ツールの「3DS MAX4.2」用のプラグインまでを開発中であることを明らかにし、D-MAP関連技術には競合他社に対してアドバンテージがあることを誇示した。なお、D-MAPは、DirectX 9で正式にサポートされることがほぼ決定しているため、最終的なDirectX 9リリース時にはSDKの方にもこうしたD-MAP支援関連ツールが同梱されるだろう。
公開された3DSMAX用プラグイン版のD-MAP関連ツール |
■DirectX 9でサポートされる2つのD-MAPとは?
ところで、DirectX 9では、2つのD-MAP形式がサポートされるという。1つは「事前計算D-MAP」、そしてもう1つは「サンプリング型D-MAP」だ。
前者は、その3Dオブジェクトをシーンに登場させる前段階に、あらかじめD-MAPを適用してしまい、その結果のモデルを利用するというものだ。こちらはD-MAPという概念を利用するだけで、実際のリアルタイム描画時には通常の3Dオブジェクトと同等に使用することになる。
D-MAP関連の処理は、リアルタイムで行なわず事前に処理してしまうため、D-MAPをハードウェアアクセラレートできなくても、あまり実際のオブジェクト描画速度には影響しない。ゲームにもよるが各種キャラクター、小道具、大道具などの表現に適していると言えるだろう。
ただし、欠点としては事前にD-MAPしてしまうため、D-MAPを動的に加工して3Dオブジェクトを摂動させたりすることはできない。
後者は、本稿で述べてきたようなD-MAP実現方式だ。「サンプリング型」というのは、元々ある凹凸データを視点からの距離に応じてMIP-MAP生成する(サンプリングして再構成する)ことからこう呼ぶ。この方式ではリアルタイムにD-MAP処理を行なうことになるため、平面分割をハードウェアアクセラレートできることが理想となるはずだ。
この方式のD-MAPでは、凹凸情報をリアルタイムに書き換えつつ3Dオブジェクトに対してD-MAPし直すことで、形状アニメーションなどが容易になる。
たとえば、ある人間の顔の凹凸情報から虎の顔の凹凸情報へモーフィングさせつつ、これを3Dオブジェクトに対して再D-MAP処理をしていけば、映画で見たような人間が虎の顔に変身するような表現が実現できるだろうし、単純に凹凸情報をスクロールしたり拡大縮小するだけでもユニークな動きのある形状表現が出来ることだろう(水面表現など……)。
また、これを地形やキャラクタに適用すれば、これまで各ゲームエンジン側で用意してきた動的LODシステムを実装する必要がなくなってくる。そうした面倒な処理は全てDirectX 9側で面倒を見てもらうこともできるようになるのだ。
■DirectX 9以降のGPUの進化について
DirectX 8系のピクセルシェーディングパイプライン。テクスチャユニットがマルチ化され同時に扱えるテクスチャ数は4。いずれ、こうした発想がジオメトリアクセラレーションの方に適用される日も近いか?(グラフィックワークステーション用GPUでは一部この発想が適用されたものもある) |
レンダリングパイプラインのテクスチャ処理ユニットの数を増やしてマルチテクスチャリングを高速化したり、テクスチャキャッシュサブシステムを統合したり…… などなど、これまでのGPUは、極端なことをいえばテクスチャマッピングの高速化に特化して進化してきた感がある。
前出の図3を見てもらうと分かるようにD-MAPをハードウェアアクセラレートするためには、平面分割機構がプログラマブル頂点シェーダの前に必要になってくるわけだが、D-MAPが頻繁に利用されるようになれば、この部分の処理速度が3Dグラフィックスのスループットにおいて無視できなくなってくるだろう。
DirectX 10では同時に複数のD-MAP適用もサポートされる可能性があるらしいが、もしそうなったとしたら、現在のレンダリングパイプラインにおけるマルチテクスチャユニットのように、複数の頂点テクスチャ処理(つまりはD-MAP)ユニットを持ったものが出てくるかもしれない。
D-MAPは、言ってみれば頂点数を増大させるわけで、そうなれば、結果的に頂点シェーダ部の性能向上までも要求されることになる。既にGeForce4 Tiシリーズに搭載されたnFiniteFXIIエンジンでは、頂点処理効率の方にも目を向け、頂点シェーダーをデュアル化したアーキテクチャを採用している。この流れから考えても、このシナリオはあながち夢物語とも言い切れない。
D-MAPはDirectX 9の1機能にしか過ぎないが、今後のPC向けリアルタイム3Dグラフィックスにおける、ソフトウェア、ハードウェアの進化の方向性を左右するものであるだけに、これからも注目していく必要があるだろう。
直方体にD-MAPを適用すると…… | このようになる。DirectX 9時代のGPUはこの数の頂点を自動生成し、この数の頂点を処理できなければならない |
□関連記事
【3月22日】【GDC】DirectX 9対応のビデオカード第一弾はMATROXから?
http://pc.watch.impress.co.jp/docs/2002/0322/dx9.htm
(2002年3月29日)
[Reported by トライゼット 西川善司]