2010/3/7 Na-7
2010/4/2 Na-7
XNA3.1でUVアニメーション(シェーダインスタンス方式)
注意 | この資料は、筆者が自らの経験を記録したものであり、他人に勧めるものではありません。 この資料を参考として行った行為がいかなる結果になろうとも、筆者は責任を負いませんので予めご承知おきください。 |
◎目次
◎概要 |
◎使用ツール |
◎サンプルプロジェクト |
◎解説 |
◎パフォーマンスについて |
◎概要
UVアニメーションとは、3Dモデルの頂点データの一部であるテクスチャ座標データを動的に変更してアニメーションする技法である。
ここでは、メタセコイアで作成したモデルの頂点データを動的に変更し、UVアニメを行うサンプルプロジェクトを紹介する。
多数のモデルを高速で描画するために、シェーダインスタンス技法を使用している(モデルインスタンスの概要説明はこちら)。
◎使用ツール
ツール名 | 入手元 |
XNA3.1(XNA GameStudio 3.1:ゲーム開発用フレームワーク) | http://msdn.microsoft.com/ja-jp/xna/default.aspx |
メタセコイア(Metasequoia 2.4:3Dポリゴンモデラー) | http://www.metaseq.net/metaseq/index.html |
◎サンプルプロジェクト
2010/4/2追加 | UVアニメーション (カスタムモデルクラス対応版)サンプルプロジェクト(XNA3.1用) | ・Gamefest
Japan 2008 デモプログラムをベースにUVアニメ化したサンプル ・コードの一部がコンテントパイプラインやライブラリで実装されているので、プログラム本体がすっきりしている ・(モデリングツール等を利用して)予め板ポリモデル4頂点のUV設定を‘フレーム1枚あたりの解像度’に合わせておく必要がある ・‘フレーム1枚あたりの解像度’が異なるアニメモデルを追加する場合、板ポリモデルをその都度追加する必要がある ・パフォーマンスは未計測 |
◎解説
・両面板ポリゴンモデルをModelクラスに読み込み、時間経過に伴ってテクスチャ座標をずらしている。
・3Dモデルの頂点データの取得やフォーマットの確認、カスタム頂点構造体の定義についてはこちらを参照すること。
・モデルデータ取得用のカスタム頂点フォーマットAと、シェーダーインスタンス用のカスタム頂点フォーマットBを定義している。
・頂点/インデックスのデータ/バッファ領域もABそれぞれ確保している。頂点バッファBとインデックスバッファBは、‘一度に描画するインスタンス数’分の領域を確保している。
・LoadContent()内で、モデルデータをバッファAに読み込み、複製してバッファBにセットしている。
・個別インスタンス情報(頂点座標、スケール、UV座標、回転)を配列に格納し、定数レジスタにセットしてシェーダに渡している。
・回転はY軸固定として、1方向のみサポートしている。
・光源処理をコメント化したシェーダも用意した。光源処理をなくしたい場合は、.fxファイルを差し替えること。(パフォーマンスが若干向上する)
・デバッグコンポーネント実装済。(デバッグコンポーネントの解説はこちら)
◎パフォーマンスについて
測定データ等についてはブログ参照。
と比較すると、
・CPU処理時間は1.5〜2倍ほど短縮した(CPU負荷軽減)
・fpsは若干低下した(GPU負荷若干増)
・機能は若干低下した(回転はY軸固定)
・プログラムは比較的シンプル
総合的に考えると、通常は本稿方式の方が良い。但し、多くのインスタンス情報をシェーダに渡すケースでは、情報量が増えるほど‘一度に描画するインスタンス数’が減るため、本稿方式の方がパフォーマンス低下幅が大きい。
尚、CPU処理時間は全インスタンス数、fpsは画面描画数に影響される(ゲームデザインの工夫次第でパフォーマンス調整可能)