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アニメ(シェーダインスタンス方式)と比較した場合の評価はこちら

 

inserted by FC2 system