テッセレーション

テッセレーション英語: tessellation)は、コンピュータグラフィックスの画像演算手法の1つである。2次元画像上で3次元の複雑な立体を表現するために多数のポリゴン(polygon)が用いられるが、テッセレーションはこのポリゴンメッシュをさらに分割して表現することで、画像をより詳細かつ滑らかで現実感のあるものにする技術である。「テセレーション」とも表記される。

テッセレーションの例(三角形と四角形)
上の三角形も下の四角形も当初のデータは各頂点の座標3点と4点に過ぎない。テッセレータはこれらの頂点間を補完する新たな頂点を生成するテッセレーションを行なう。テッセレーションによる分割単位は半端な数でも行なえる。

概要

この手法が登場した背景には、コンピュータの進歩に伴う3次元コンピュータグラフィックスにおけるポリゴン描画数の増加がある。映画やCMなどで用いられるプロダクションレンダリングの分野では、古くからサブディビジョンサーフェイス(細分割曲面)やNURBSのように、デザイナーが操作・管理するデータの量(特徴点の数)を抑制しつつ最終レンダリング品質における詳細度を向上させる仕組みが考え出されてきた。

一方、PCなどで用いられるGPUによる画像処理の演算速度やビデオメモリ(VRAM)容量の向上によって、リアルタイム(実時間)での3D画像の描画においても1フレームあたりのポリゴン数を増すことが可能になったが、今度は元のモデルにおいて膨れ上がった頂点データをGPU側で読み込むために長時間掛かるのが利便性や性能を損なうという問題が出てきた。特に2015年現在でも、マザーボードグラフィックスカード上のディスクリートGPUを接続するPCI-Express規格は、CPU-メインメモリ間やGPU-ビデオメモリ間と比べて遥かに帯域幅が小さく、CPU-GPU間におけるデータの転送速度が性能のボトルネックとなりうる。また、グラフィックスカードに搭載されているビデオメモリは直結型のため、CPU用システムメモリと比べて簡単に増設するわけにはいかず、ビデオメモリに格納するデータはできるかぎり少ないほうがよい。

そのため、最初に読み込むモデルでは粗めのポリゴンにしておいて、GPUで読み込んだ後にそれを演算によって(オンデマンドで)小さなポリゴンに分割・生成することで、大きくなり続ける初期モデルのデータ量を抑制する工夫がなされるようになった。テッセレーションをハードウェアによって実行できれば、例えば入力ジオメトリデータ量は同一だが、詳細化の必要がない遠景は低ポリゴンのままで表現し、視点に近いオブジェクトほどポリゴンを動的に細かく分割することでジオメトリを詳細に表現する、といった最適化が可能になる。テッセレーションは、詳細化が必要な近景に関してのみCPU側で実行してデータを増幅したのち、GPUに転送して描画する形にすることもできるが、実際の描画を担当するGPU側で増幅できるほうがCPUの負担やCPU-GPU間のデータ転送量を減らすことができる。

PC用リアルタイム3DグラフィックスAPIの標準規格には、主にマイクロソフトによって開発されているDirectXDirect3D)と、Khronosグループによって管理されているオープン規格であるOpenGLが存在するが、Direct3D 9およびOpenGL 2.xでのテッセレーション[1][2]AMDATI)による拡張実装にとどまる[3][4][5][6][7]など、テッセレーション機能に関しては長らく標準化が進まない状況にあった。2006年11月にWindows Vistaとともにリリースされた「DirectX 10」や2009年8月にリリースされた「OpenGL 3.2」ではジオメトリシェーダーが標準導入され、また2009年10月にWindows 7とともにリリースされた「DirectX 11」や2010年3月にリリースされた「OpenGL 4.0」からはついにテッセレーションシェーダーが標準導入されるに至った。DirectX 11やOpenGL 4に対応するハードウェアにおいては、実時間処理でのテッセレーションは幾つかの高性能なGPU内の専用回路であるテッセレータ(tessellator)によって実現されるようになっている。なお、組み込み環境向けのOpenGL ESにおいても、2015年8月にリリースされたOpenGL ES 3.2においてジオメトリシェーダーとテッセレーションシェーダーが標準化された。後発の下位レベルグラフィックスAPIであるVulkanMetalにおいてもテッセレーションのパイプラインを利用することができる。

描画パイプラインとテッセレーション

以下では、(PC用グラフィックスの分野に限定するならば)実質的な標準の1つとなっているマイクロソフト社のDirectX 11でのテッセレーション機能について説明する。なおジオメトリシェーダーもまたディスプレースメントマッピングなどでテッセレーションに応用することができる[8][9]が、マイクロソフトは(性能上の問題から)ジオメトリシェーダーをテッセレーションに使用することを推奨していない[10][11]

DirectX 11ではレンダリングパイプラインの途中(頂点シェーダーとジオメトリシェーダーの間)に新たにテッセレーション機能を加えており、以下の3つのステージから構成される。

  • ハル シェーダー(hull shader)
  • テッセレータ(tessellator)
  • ドメイン シェーダー(domain shader)

ハルシェーダーでは、パッチ(patch)情報に基づいてポリゴンごとの曲面の制御点(control points)の算出を行なう[注 1]。ハルシェーダーはプログラマブルシェーダーであり、ポリゴンの分割数をすべて一様に与えることもできれば、稜線近くだけポリゴンの分割度(Tess Factor)を増すような工夫も行なえる[注 2]

テッセレータでは、ハルシェーダーの指示に従ってポリゴンを実際に分割する。Direct3Dでは元のポリゴンとして3角形、4角形、線分が用いられる。

ドメインシェーダーでは、ハルシェーダーが計算した曲面生成用の制御点に沿ってテッセレータが分割したポリゴンごとの頂点座標を算出する。ドメインシェーダーはプログラマブルシェーダーであり、例えば凹凸データを与えることでディスプレースメントマッピング(Displacement Mapping)も可能である。

テッセレーション処理は描画パイプラインにおけるオプションであり、もしテッセレーションを行なわないならば、上記の3つのステージはスキップすればよい。

DirectX 11では、頂点シェーダーからデータを受け取り、テッセレーションを経て、ジオメトリシェーダーへと送られる構造になっている。

OpenGL 4では、ハルシェーダーに相当するものはテッセレーション制御シェーダー(tessellation control shader, TCS)、テッセレータに相当するものはテッセレーションプリミティブジェネレーター(tessellation primitive generator)、そしてドメインシェーダーに相当するものはテッセレーション評価シェーダー(tessellation evaluation shader, TES)と呼ばれる。

応用例

コンピュータゲームでよく用いられる手法のひとつであるLOD(Level of Detail)は、演算量を縮減する目的から、視点からの距離に応じて画像の遠部にある立体のポリゴン数を減らす工夫であり、テッセレーションを用いない従来手法ではポリゴン数を変えた数種のモデル(ハイポリゴンモデル〜ミドルポリゴンモデル〜ローポリゴンモデル)を距離に応じて切り替えるようにしていたが、切り替え時に外形の形状が突然変わるために不自然な印象を与えていた(ポッピング現象)。テッセレーションでは分割度を自在に変化させられるのでこのような問題は本質的に発生しないとされる。このような手法は距離適応型テッセレーション(Distance Adaptive Tessellation)と呼ばれる[12]

また、ピクセル陰影処理において、リアリティ向上のためにテクスチャを利用してバンプマッピングや法線マッピングなどを行なっているが、これらは最良の場合でも視線方向から見た陰影を元の形状に貼り付けているだけのフェイク技法であるため、元の形状が稜線によって途切れる凹凸形状までは変化しない。具体的には、例えば球状の物体にいくらテクスチャを貼り付けて凹凸に見せても、テッセレーションを用いない限り周囲の外形は常に円形でしかない。テッセレーションではテクスチャ情報などを元に凹凸の形状を後付けで加える「ディスプレースメントマッピング」(Displacement Mapping)と呼ばれる表現手法が容易に行なえ、先の例では外形まで変更できるため、さらにリアリティを向上することができる。

テッセレーションとコンピュータ・モデル

有限要素問題を解決するために使用された円盤のテッセレーション。
これらの矩形レンガは、辺同士のタイリングと考えられ、トポロジー的に六角形タイリング英語版と同一であるようなテッセレーションにて接続されている。ここで、それぞれの六角形は隣接レンガによってその長辺が2つに分割されるような矩形に帰着(平坦化)される。
このバスケット織り英語版タイリングはトポロジー的にカイロタイリング英語版と同一であり、それぞれの矩形の一方の側面は2つの辺として数えられ、2つの隣接する矩形における1つの頂点によって分割される。

コンピュータグラフィックスの分野では、テッセレーション技術はポリゴンデータセットの管理およびレンダリングに適した構造への分割によく用いられる。通常は、少なくとも実時間レンダリングにおいては、データは三角形面にテッセレートされるが、これはときおり「三角形面化(triangulation)」と呼ばれる。テッセレーションはDirectX 11とOpenGL 4における主要な機能である[13][14][15][16][17]CADにおいて、構築されるデザインは、解析的3D表面と曲線や、3D立体の連続的な境界線によって構成される限定的な面と端部などによって境界表現トポロジーモデルで表現される。任意の3D立体は、たいてい直接に分析するには複雑すぎる。このため、それらは(通例不規則な四面体や六面体のような)小さく分析の容易な3次元ボリューム要素片からなるメッシュ(網目)によって近似(テッセレート)される。このメッシュは有限要素解析に用いられる。オリジナルの限界頂点(limit vertices)がメッシュに含まれるように、表面のメッシュは(ポリラインに近似される)個別の面と辺ごとに生成される。オリジナル表面の近似がさらなる処理の要求に適合することを保証するために、通例表面メッシュ生成のための3つの基本パラメータが定義される。

  • 平面近似ポリゴンと表面との最大許容距離(別名:"sag"、サグ、たわみ):このパラメータは、メッシュがオリジナルの分析的表面と十分な類似であること(または、ポリラインがオリジナル曲線と類似であること)を保証する。
  • 近似ポリゴンの最大許容サイズ:このパラメータはさらなる分析のための十分な詳細度を保証する。
  • (同一面上における)2つの隣り合う近似ポリゴン同士の最大許容角度:このパラメータは分析に重大な影響を及ぼすような小さなコブや穴でさえもメッシュに現れないことを保証する。

メッシュを生成するアルゴリズムは、これらのパラメータによって操作される。いくつかのコンピュータ分析では「適応型メッシュ(adaptive mesh)」が必要とされるが、これは分析にさらなる詳細度を必要とするような領域内で(より強いパラメータによって)より微細化されるようなメッシュのことである。いくつかのジオデシック・ドームは、可能な限り正三角形に近い三角形からなる球面のテッセレーションにより設計される。

テッセレーションでは、2つの頂点間に異なる2つの法線を持つ場合、生成される面に亀裂が生じてしまうという問題がある。また、上手に形状を制御しないと追加される頂点が想定よりも立体物の外側に加えられることで不必要に膨張してしまうことがある[18][19]

脚注

注釈

  1. ^ パッチ情報はテッセレーションの前の頂点シェーダーによって空間配置などに関して事前に演算処理される。
  2. ^ 法線マッピングでは法線ベクトルに対する陰影だけを擬似的にポリゴンに塗り加えただけであり、立体面の法線が視線と直交する箇所、つまり稜線ではポリゴンの多角形がそのまま外形線となって現われてしまう。これを避ける、または影響を最小化するにはポリゴンを小さくする必要があるが単純にポリゴンを小さくするとそれ以降の演算量が幾何級数的に増大する。

出典

  1. ^ テッセレーション (Direct3D 9)”. Microsoft Learn. Windows DirectX Graphics Documentation (August 2009). 2022年11月11日閲覧。
  2. ^ Tessellation (Direct3D 9) - Win32 apps | Microsoft Learn
  3. ^ 4Gamer.net AMD,コードネーム「R600」こと「ATI Radeon HD 2000」を発表”. www.4gamer.net. 2022年9月14日閲覧。
  4. ^ [連載][西川善司の3Dゲームエクスタシー]「ATI Radeon HD 2000」シリーズのGPUアーキテクチャ徹底解説”. www.4gamer.net. 2022年9月14日閲覧。
  5. ^ 西川善司の3DゲームファンのためのDirectX 11テッセレーション活用講座 「テッセレーションステージはこう使え」 ゲームエンジンにテッセレーションを組み込むための基本技をNVIDIAが伝授。ハイパー頂点とは何か!?”. GAME Watch. 株式会社インプレス (2010年3月10日). 2022年9月14日閲覧。
  6. ^ AMD_vertex_shader_tessellator
  7. ^ GPU hardware info database launchpad”. www.gpuinfo.org. 2022年9月14日閲覧。
  8. ^ 3Dグラフィックス・マニアックス(38) ジオメトリシェーダ(9)~ジオメトリシェーダを活用した新表現(5)”. マイナビニュース (2008年11月14日). 2022年9月14日閲覧。
  9. ^ SubD10 サンプル”. docs.microsoft.com. DirectX SDK (August 2008) C++. 2022年9月14日閲覧。
  10. ^ Direct3D 10 に関してよく寄せられる質問”. docs.microsoft.com. DirectX SDK (August 2008) C++. 2022年9月14日閲覧。
  11. ^ Direct3D 10 Frequently Asked Questions - Win32 apps | Microsoft Learn
  12. ^ OpenGL 4.0 Tessellation For Professionnal Applications | GPU Technology Conference (September 21, 2010)
  13. ^ Direct3D 11 の機能 | Microsoft Learn
  14. ^ Direct3D 11 Features - Win32 apps | Microsoft Learn
  15. ^ テッセレーションの概要”. Microsoft Learn. Windows DirectX Graphics Documentation (August 2009). 2022年11月11日閲覧。
  16. ^ Tessellation Stages - Win32 apps | Microsoft Learn
  17. ^ The OpenGL Graphics System: A Specification (Version 4.0 (Core Profile) - March 11, 2010)
  18. ^ CEDEC 2010 - Windows版「ロストプラネット2」にみるDirectX 11フィーチャー(前編) (2)”. マイナビニュース (2010年9月2日). 2022年9月14日閲覧。
  19. ^ 西川善司の3Dゲームファンのための「ロスト プラネット 2」グラフィックス講座(後編) 「MT FRAMEWORK」のDirectX 11対応とニンテンドー3DS対応、そして今後のロードマップをチェック!”. GAME Watch. 株式会社インプレス (2010年9月13日). 2022年9月14日閲覧。

関連項目

外部リンク