■ Prismatic Solid 技術スライド公開
これはものすごく参考になる。XNAの特性を活かしてほとんどの処理をシェーダーに振って実現しているのだろうとは思っていたけれど、その実装が詳しく解説されている。
モデルのエッジの面取りはシェーダーで法線を丸めることで実装。モデルデータはモデリングツールは使用せずに、全てコード内でプロシージャル生成。多面体切断処理はCPUで別スレッドで実行されてて、水面の波はGPUで計算して法線を生成してる、とのこと。
パーティクルは16bitFloatのバッファに座標と速度を格納して、MRTで更新。寿命はw成分に入ってて、生成はバッファテクスチャへの書き込みで行ってるらしいだけど、書き込み位置は寿命管理は無視して順番に上書き、みたいな方法なんだろうか?空きワークを検索するいい方法が思いつかない。
パーティクルの座標は256x256のテクスチャに書き込んでいて、最大65536個まで表示可能。地面の当たり判定は、Y軸並行投影でレンダリングして生成した地面のハイトマップと法線マップをシェーダー内で参照して跳ね返りの処理を行っている。
大量に出る弾オブジェクトもパーティクルと同様の手法で動かしている。当たり判定はテクスチャをロックして読み込むのではなく、動的にコリジョンマップを生成してオクルージョンクエリーでそこに描画できたかどうかをチェックしている。この発想はなかった。覚えておくとどこかで使えそう。
あとスフィアシェーダーやカプセルシェーダーなども独特の質感が出てて、ベベルシェーダーで面取りされたモデルとの組み合わせで印象的なビジュアルになっていた。モデルデータも全て計算で作られてる、ってのは凄いなぁ。
XNAはCPU速度はC#を使っている都合上あまり期待できないけれど、GPUに関しては、vfetchなども含めてXbox360のフル機能をほぼそのまま使えるような状態になってるので「いかに処理をGPUに振るか」は重要なポイントだと思ってたけど、ここまで活用されてるとは驚く。
ゲーム動画はこちら(http://bit.ly/faKxzc)。画面を埋め尽くす圧倒的な量の敵弾と、ソリッドで独特なビジュアルが印象的なゲーム。地面で跳ねる大量のパーティクルが素敵。