テッセレーションによるハイポリゴンのモデル表示例
![画像集#002のサムネイル/[GDC 2009#23]こんな割れ方をしていたなんて! DirectX 11テッセレーションの動作を探る](/games/033/G003329/20090327071/TN/002.jpg) |
PCゲーム業界の今後を占ううえで,避けて通れない
DirectX 11(Direct3D 11)。GDC09では,MicrosoftやAMDが,いくつか関連するセッションを用意していたが,本稿では,両社のセッションから,テッセレーションに関する部分をまとめてみたいと思う。題材となるのは,北米時間2009年3月25日に行われた,Microsoftの
「Direct3D 11 Tessellation Deep Drive」,そして26日に開催された,AMDの
「Your Game Needs Direct3D 11,Get Started Now!」だ。
DirectX 11のテッセレーションデモを見る
さて,DirectX 11のテッセレーション(Tessellation,あるポリゴン面を,複数のポリゴン面へと細かく分割すること)用SDK(Software Development Kit,ソフトウェア開発キット)では,「Cutmull-Clark」分割アルゴリズムが実装されているとのことだ。ほかのアルゴリズムを利用することもできるようだが,Cutmull-Clarkは,さまざまなツールで採用されていて,事実上の業界標準といえるため,これを使うことがSDKでは想定されている,といった感じか。
Cutmull-Clarkの分割アルゴリズム
![画像集#006のサムネイル/[GDC 2009#23]こんな割れ方をしていたなんて! DirectX 11テッセレーションの動作を探る](/games/033/G003329/20090327071/TN/006.jpg) |
![画像集#007のサムネイル/[GDC 2009#23]こんな割れ方をしていたなんて! DirectX 11テッセレーションの動作を探る](/games/033/G003329/20090327071/TN/007.jpg) |
ポリゴン面の細分割ということで,なんとなく,辺を半分ずつにしていくのかなと漠然と思っていたのだが,デモを見る限り,それは「Pow2 Partitioning」,つまり2のn乗で分割が指定されているときのみ。さらにいえば,実際の分割レベルは,実数値で指定されているようにも見える。以下,写真を何枚か撮ってみたので,拡大しながらチェックしてみてほしい。
実数指定の場合。設定値は左から1.88,15.62,24.75
![画像集#015のサムネイル/[GDC 2009#23]こんな割れ方をしていたなんて! DirectX 11テッセレーションの動作を探る](/games/033/G003329/20090327071/TN/015.jpg) |
![画像集#016のサムネイル/[GDC 2009#23]こんな割れ方をしていたなんて! DirectX 11テッセレーションの動作を探る](/games/033/G003329/20090327071/TN/016.jpg) |
![画像集#017のサムネイル/[GDC 2009#23]こんな割れ方をしていたなんて! DirectX 11テッセレーションの動作を探る](/games/033/G003329/20090327071/TN/017.jpg) |
Cutmull-Clarkのアルゴリズムのままでは,設定値ごとに4倍(2×2)で頂点数が増えていくのだが,このデモでは,もっと段階的に増やせるよう,「Charles Loop」と「Scott Schaefer」による双三次近似が適用されているという。
ちょっと難しいので,以下,流してもらってもかまわない前提で,突っ込んだ説明は行わないが,与えられた四角形の基本パッチに対し(※Loop-Schaeferの近似は現状では四角形にしか使えないらしい),四角形の4辺それぞれで分割数が指定されていることも分かる。辺ごとで独立して,ほとんど無段階に分割数を増やせるものが,今回のデモには実装されているようだ。
「左辺を23.16個に割り,上と右は1個,下側は11.21個に分割」するデモも行われた
![画像集#018のサムネイル/[GDC 2009#23]こんな割れ方をしていたなんて! DirectX 11テッセレーションの動作を探る](/games/033/G003329/20090327071/TN/018.jpg) |
LODモデルの切り換えのように,ある距離でいきなりボコっと変形するようなこともなく,ぬるぬると無段階で変化させることができ,ちょっと負荷が高いときには分割量を微妙に少なくしたりなど,応用範囲の非常に広いものになっている。
実際問題として,左辺を23.16個に割り,上と右は1個,下側は11.21個に分割するといわれても想像しにくいのだが,そんなこともできるらしい。
また,分割モードもいろいろあるので,これだけでもかなり多彩な面分割が可能になる。
現状,リアルタイム分割は実用的な速度で動かない。そのため……(※下の写真に続く)
![画像集#022のサムネイル/[GDC 2009#23]こんな割れ方をしていたなんて! DirectX 11テッセレーションの動作を探る](/games/033/G003329/20090327071/TN/022.jpg) |
ところで,現状ではDirectX 11対応ハードウェアが存在しないため,リファレンスラスタライザで実行するしかない。そのため,分割数2でフレームレートは1fpsを下回るレベルになっており,カクカク,どころの騒ぎではなかったりする。
ちなみに,Direct3D 11におけるテッセレーションの最大レベルは64。1辺を最大64個に分割できる仕様になっているようで,DirectX 11世代のハードウェアに要求される演算能力はとてつもないものになりそうだ。
デモでは,Autodeskの「Maya」上で処理して形状を確認したりしていた
![画像集#023のサムネイル/[GDC 2009#23]こんな割れ方をしていたなんて! DirectX 11テッセレーションの動作を探る](/games/033/G003329/20090327071/TN/023.jpg) |
![画像集#024のサムネイル/[GDC 2009#23]こんな割れ方をしていたなんて! DirectX 11テッセレーションの動作を探る](/games/033/G003329/20090327071/TN/024.jpg) |