ジオメトリシェーダを活用した新表現(4)~ディスプレースメントマッピング

真っ平らな平面(単一ポリゴン)に対して、微細な凹凸があるかのように陰影処理するテクニックをバンプマッピングと呼び、これの主流技法は法線マップを活用したものであることは既に本連載第14回~第16回で述べた。

法線マップを活用したバンプマッピングでは実際に凹凸ができるのではなく、凹凸があるかのように陰影処理するだけなので、そのポリゴン面に視点を近づけてその凹凸を掠めるようにしてみると、実際には凹凸がないことが露呈してしまう。

これをより発展させ、テクスチャに記載された凹凸情報(ハイトマップ)に沿って、実際に3Dモデルをジオメトリレベルで変位(ディスプレース)させてしまう技術を「ディスプレースメントマッピング」(Displacement Mapping)と呼ぶ。

イメージ的には、既に存在する基本モデルに対して、テクスチャに記載された凹凸情報でディテールを変形する(整形する)……というような感じになる。

テクスチャに書かれている凹凸情報で3Dモデルを変形させるということは「頂点シェーダでテクスチャを読み出して頂点を変位させる」という作業が必要になる。つまり、頂点からテクスチャを参照する「Vertex Texture Fetching」(VTF:頂点テクスチャリング)と呼ばれる機能にGPUが対応している必要がある。VTFはDirectX 9世代SM3.0対応GPUでは、サポートされているGPUとされていないGPUが混在したため、互換性面で積極的に活用される局面が少なかったが、DirectX 10世代SM4.0対応GPUでは全てのGPUが対応すべき必須機能となっているので積極的に利用しても問題がない。

ここでは、バンプマッピング(法線マッピング)のさらに先にある、ディスプレースメントマッピングの二通りの実現方法を紹介していく。

法線マップによるバンプマッピングとディスプレースメントマッピングの違い

ポリゴンを分割してディスプレースメントマッピングを行う方法

既に存在する3Dモデルに対してディスプレースメントマッピングを実行する場合、ディテールの凹凸を記載したハイトマップ解像度と、それを適用する側の3Dモデルの頂点解像度のバランスがとれていないと、ディスプレースメントマッピングの品質は低くなってしまう。そんな解像度バランスを気にしなければならないくらいならば、ディスプレースメントマッピングなんか活用せずに、オーサリング段階で初めからそのディテールを適用した3Dモデルを用意した方が実行時の負荷も軽くなるし面倒が少ない。

ディスプレースメントマッピングを行うには、ハイトマップテクスチャと3Dモデルのポリゴン数のバランスが重要になる

しかし、もし、頂点数の少ないポリゴンモデルに対し、解像度の高い凹凸情報を適用し、必要に応じて頂点を増加させてディスプレースメントマッピングができれば、非常に便利だ。視点から近い時には低ポリゴンで、法線マップで凹凸表現をして、視点に近づくに従ってポリゴン分割数を上げて、凹凸情報の反映量も増やして、精度の高い整形を行うようにすれば、ジオメトリのLOD(Level of Detail)が実現できる。

視点からの距離に応じて必要なポリゴン分割を行ってからディスプレースメントマッピングを行うことが理想

この仕組みを実現するためには適用する凹凸情報の精度に合わせて、3Dモデルの頂点を増やす仕組みが必要になる。

3Dモデルの頂点の増加……はもっと詳しく言えば、もともとの3Dポリゴンモデルを細かく分割してやる必要があるということになる。

この「ポリゴン分割処理」(Subdivision)を実現するのが「テッセレーション」(Tessellation)というテクニックだ。テッセレーションを行う機能モジュールを特に「テッセレータ」(Tessellator)と呼ぶ。

テッセレータはポリゴンの分割屋さん

ATIのRadeon HD 2000/3000シリーズには、まさくこのテッセレータの仕組みをハードウェア実装した機能ブロックが搭載されているが、DirectX 10では標準機能としてサポートされていないので、互換性の側面からするとやや使いづらい。ちなみに、テッセレータ機能のDirectXへの組み込みはDirectX 11で実現されることがほぼ確約されている。(続く)

民生向けGPUとして世界で初めてハードウェアテッセレータを搭載したのは、Matroxが2002年に発表した「Parhelia-512」だった

最近ではAMDが2007年に発表した「Radeon HD 2000」シリーズがハードウェア・テッセレータを搭載した。写真は最上位モデルの「Radeon HD 2900 XT」

(トライゼット西川善司)