2010/3/2 Na-7
2010/3/3 Na-7
2010/3/5 Na-7
2010/3/7 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 |
◎サンプルプロジェクト
UVアニメーションサンプルプロジェクト(XNA3.1用) 2010/3/5版
2010/3/5版:大半のUV座標が反映されないバグを修正(詳細はこちら)
◎解説
・両面板ポリゴンモデルをModelクラスに読み込み、時間経過に伴ってテクスチャ座標をずらしている。
・3Dモデルの頂点データの取得やフォーマットの確認、カスタム頂点構造体の定義についてはこちらを参照すること。
・モデルデータ取得用のカスタム頂点フォーマットAと、シェーダーインスタンス用のカスタム頂点フォーマットBを定義している。
・頂点/インデックスのデータ/バッファ領域もABそれぞれ確保している。頂点バッファBとインデックスバッファBは、 全インスタンス数分の領域を確保している。
・LoadContent()内で、モデルデータをバッファAに読み込み、複製してバッファBにセットしている。
・頂点バッファへの書き込みはSetDataを使用し、全インスタンス分のデータを毎フレーム1回更新している 。(エラー回避のため、SetDataOptions.NoOverwriteを使用している)
・DrawIndexedPrimitivesのminVertexIndexやstartIndexを指定して、インデックスバッファの読み取り位置をずらすことにより、全インスタンス数 分の頂点データを描画している(2010/3/5版)
・光源処理をコメント化したシェーダも用意した。光源処理をなくしたい場合は、.fxファイルを差し替えること。(パフォーマンスが若干向上する)
・デバッグコンポーネント実装済。(デバッグコンポーネントの解説はこちら)
◎パフォーマンス測定データ
UVアニメ(シェーダーインスタンス&動的頂点バッファ方式)パフォーマンス測定結果一覧表(PDF形式)
○データ分析
□タイムルーラー表示有無(=アルファ処理の有無と判断)
・メインPC:2〜3倍、サブPC:1〜2倍程度の差がある
→メインPCはアルファ処理が比較的弱い
・メインPCはCPU側が16.6ms未満でも17fpsまで低下
→メインPCのアルファ処理はGPU側がネックになっている
□一度に描画するインスタンス数
・描画数を増やすと両機共にパフォーマンス向上した
→描画数が多い方が効率が良い
→但しFPSが向上したのはメインPCのみ
→サブPCは常にGPU側がネックになっている
□シェーダー内の光源計算
・メインPCのスコアは少し影響があった(最大1.5倍)
・サブPCのスコア影響は微小
→サブPCは光源以外にGPUネックがある
○自己評価
・メインPCで10000枚59fpsは十分速いが、アルファ処理を加算するとパフォーマンスが激減したので不安がある
・サブPCはアルファ処理が強いようだが、それ以前に1000枚48fpsは遅すぎる
→さらなる改良が必要?
2010/3/7追記
・CPU処理時間は全インスタンス数、fpsは画面描画数に影響される(ゲームデザインの工夫次第でパフォーマンス調整可能)
・本稿サンプルはUV座標のみ動的頂点バッファに格納しているので中途半端。どうせなら全インスタンス情報を動的頂点バッファに格納すると、‘一度に描画するインスタンス数’を減らさずに済むため、描画パフォーマンスが向上する可能性がある。(インスタンス情報が多い場合に効果的?)
・UVアニメ(シェーダインスタンス方式)と比較した場合の評価はこちら。