Tiled Resources for Xbox 360 and Direct3D 11 : Direct3D11のメガテクスチャ技術の資料とサンプル

Gamefest 2011のUK版の”Tiled Resources for Xbox 360 and Direct3D 11″というセッションのスライドをちょっと見ていたのですが,ちょっと興味深い内容でした.
http://www.microsoft.com/download/en/details.aspx?id=27854
Overviewでは,
Come see over 180 GB of textures running live within a sample implementation of “tiled-resources” technology for Xbox 360 and Direct3D 11. Tiled resources are also known as megatextures, virtual textures, sparse textures, and partially resident textures. In addition to enabling groundbreaking, paradigm-shifting changes to game content production, tiled resources also have the benefit of supporting much tighter control and predictability of texture memory budgets in game titles, even when using traditionally produced texture content.
のように書かれています.”tile-resources”技術の紹介でリソースをタイルに格納して大規模なデータ(180 GBの「仮想アドレス空間」が使えるよ…とのこと)を扱う技術なのですが,いわゆるMega Texture,Virtual Texture,Sparse Texture, Resident textureといった手法に使われる技術です.
Mega Textureというと巨大なテクスチャデータから,高解像度テクスチャが必要な部分とそうで無いところを解析して最適なテクスチャマッピングを行う技術で,うまくメモリをやりくりしながら常に近景で高解像度が使えるようにする技術ですね(低解像度から高解像度に切り替わる瞬間が見えちゃうことも結構ありますが…).
Xbox 360とDirect3D11での実装を解説したセッションで,スライドの他に下記のMSDNのblogではサンプルコードが公開されていました.
サンプルコード
http://blogs.msdn.com/b/chuckw/archive/2011/10/28/tiledresources11.aspx
サンプルは,Direct3D11用でTiledResources11とTiledTexturePackToolの2つのVisual Studio 2010プロジェクトが付属します.TiledTexturePackToolの方がサンプルプログラム本体なのですが,このサンプルで試すデータを生成するプログラムとしてTiledTexturePackToolが付属します.TiledTexturePackToolは,フラクタルで地形用のハイトマップ,法線マップ,カラーマップを生成してくれます.
TiledTexturePackToolでは,デフォルトでは16384×16384テクスチャを生成しますが十分なメモリが無い環境では生成できないようです.なお,デフォルト設定でカラーテクスチャが1.31GBほど,ハイトマップ,法線マップが683MBほどのデータで生成されます(デフォルトの解像度だと生成までかなり時間がかかりますので気長に待つ必要があります.Releaseビルドがオススメ).
それからデフォルトではビッグエンディアンのようでリトルエンディアンにする場合には下記のコマンドライン引数を指定すると良さそうです.ドキュメントで書かれてるコマンドライン引数ではダメでした(ソースを確認したら下記でした).
/endianswap [intel]
ツールが無事にデータを生成するとの3つのファイル(s_diffuse.sp,s_heightmap.sp,s_normalmap.sp)が作成されるのでTiledResources11のワーキングディレクトリにコピーします.これで準備は完了です.
あとは,ビルドして実行するだけです.実行したあとはこんな感じです.地形が見たい方はTerrain renderのチェックを入れてください.

地形をレンダリングした結果.クリックすると大きなサイズになります

ワイヤーフレーム表示.クリックすると大きなサイズになります

タイルリソース,右下のレンダーターゲットの表示はresidency.クリックすると大きなサイズになります
WASD…シーン内の移動
左クリック…カメラ回転
右クリック…タイルリソース
移動やカメラ回転すると貼られるテクスチャの解像度が随時変わるのがわかると思います.ハイトマップも同じ手法が使われてるので近いところの山のジオメトリは詳細ですが,遠景や画面外からいきなり画面内に入ったときなどは起伏が荒くなるのがわかると思います.法線も何ですが,ちょっとシェーディング的に気づきにくいです.テクスチャ側の処理のサンプルなので,テセレーションはありませんが組み合わせるのもいいと思います.
データサイズのわりに動作速度速いです.Radeoh HD 5770ですが,500fps近く出てます.今回は,16384×16384で作りましたが実際のゲームプロジェクトではそんなにサイズはいらないかもしれません.そうなるとデータサイズ,処理負荷それぞれ下がると思いますので,使いやすくなると思います.
それから今回は,地形を題材にやってますが,リアルタイムPtexもおそらくこの手法が有効なんじゃ無いかと思います.
なお,この技術が理解できてくると下記の『Partially Resident Textures』(PRT)まわりがかなり理解できてくると思います.そこにつながってくるので,実は結構重要な話だったんですね.個人的には色々と話がつながってきました.
4Gamer.net 「Radeon HD 7970」ではメガテクスチャ処理のGPUアクセラレーションが可能に!? GPUコンピューティング向けの工夫やディスプレイ周りをチェックする
http://www.4gamer.net/games/135/G013536/20120106063/