プロフィール

Na-7

Author:Na-7
SE(システムエンジニア)として約15年間システム系ソフト会社を勤めあげ、2008年3月退社。現在、ゲーム制作会社設立を目指して活動中。


アクセスカウンター


最新記事


最新コメント


最新トラックバック


月別アーカイブ


カテゴリ


DATE: CATEGORY:スポンサー広告
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
DATE: CATEGORY:三国志軍記開発
三角形2043個.JPG
シェーダーインスタンシング検証画面
サンプルを改修し、一度に幾つまで描画可能か検証した。
一定数を超えると動作が不安定になる?



◎回想

私がインスタンシングに手を出すのは2度目です。
…いや、正確に言うと普通のインスタンシングではなく、その技術を応用して6万頂点のデカい地形モデルの高速化を図りました。(気になる人は2009/3/29以降のブログを参照してください)

で、その頃気になったのは「インスタンシングの全容がよくわからなない」ということでした。

インスタンシングのテクニックは複数あるとのことですが、資料によって用語が違ったり、サンプルを実行すると「No Instancing」と書かれたものが2種類出てきたり、HWインスタンシングが表示されなかったり…(ってこれは私のPC環境固有の問題ですが)。

そこで今回はまずインスタンシングの概要を体系的にまとめてみようと思います。



◎比較一覧表

幾つか集めた資料の中では、公式サンプルの中のInstancedModel.htmが良さげな感じ。但し英文でちょっと長いので、肝心な部分がわかりにくいです。誰か訳して~(笑)

htmlの最後に比較表があったので、これとGamefest2008プレゼンテーション資料の内容を併せ、補足説明を追加しました。

XNA モデルインスタンス テクニック 比較一覧表

行見出しは(本来公式サンプルの名称とすべきでしょうが)No instancingではわかりにくいので日本語名称にしました。

わりとよさげな感じでまとまったと思いますが、自分で補足した部分は若干不安があります。もし間違いを見付けたら指摘して頂けると嬉しいです。



◎調査結果より

No instancingやらVFetchやらダイレクトマッピングやらで、インスタンシングの全容がよくわからなかったのですが、自分で1つの表にまとめることで、一通り把握することができました。

で、今後取り組むテクニックは…やはりシェーダーインスタンスですね。メモリコストは悪いですが、CPUコスト(≒パフォーマンス)はHWインスタンスと同等らしいので。

最初はマテリアルバッチを適用し、その後シェーダーインスタンスに取り組もうと考えていたのですが、併用事例は見当たらないので併用不可かもしれませんし、もし可能だとしても、マテリアルバッチを適用した段階でコードが複雑になってしまいます。そこでまずシェーダーインスタンスを導入し、マテリアルバッチはその後で考えます。


ちなみに、ダイレクトマッピングまでやればCPUコストも最速になるかと思っていたのですが、これはXbox360専用のテクニックということですので、今は無視します。



◎非公式サンプル調査

公式サンプルの解析は大変なので、手始めにこちらのサンプルコードを解析しました。XNA2.0以降で動かす場合は若干の改修が必要ですが、シンプルでわかりやすいです。

三角形10個

コード内容は一通り理解したので、モデル数を幾つまで増やせるか試してみました。ちなみに、私の予想では一度のDrawPrimitivesで描画できる最大数は60程度です。

三角形1000個

あれ?(^_^;

三角形100個×10行=三角形1000個描画できました。私の認識は間違ってたみたいです(汗)



◎1度に描画可能なモデル数は?

問題は、エフェクトファイルの先頭の配列宣言です。

float4x4 InstanceTransforms[1000];

「HLSLでは、配列の数だけ定数レジスタを消費する。だから定数レジスタの数を超えることはできない」という認識だったのですが…まさか定数レジスタが1000個もあるとは思えません。

で、試しに三角形を5000個に増やしたら、エフェクトファイルのコンパイルエラーになりました。

maximum constant register index exceeded - Try reducing number of constants referenced

エラー内容を考慮すると、定数レジスタの数に依存するという認識は正しいようです。

で、実際に幾つまで可能なのか試してみました。

三角形1025個   三角形2043個
1025個を指定した画面(左図)と2043個を指定した画面(右図)

1~1023:
 正常に表示される

1024:
 1個も表示されない

1025~2043:
 1024を引いた数だけ表示される

2044~:
 エフェクトファイルのコンパイルエラーになる


上記の結果から推測すると、

・このPC環境には1024個の定数レジスタがあり、
 それを超えると動きが不安定になる。

・HLSLの規定数(約2048)を超えると、
 コンパイルエラーになる

このように考えれば筋が通ります。ただ、内蔵グラボで1024個は多すぎる気がしますが…。

…あ、そうか!
スカラ型じゃなくてベクタ型の配列だから、実際に必要な定数レジスタは4分の1ですね!

つまりこのPCの定数レジスタ数は256、だから一度に約1024個まで描画可能ってことか~!



◎まとめ

こちらの「バーテックスシェーダの比較」で定数レジスタ数を確認すると、シェーダモデル2.0は256以上となってました。つまり、シェーダモデル2.0以降では、一度に最大1023個まで描画可能というわけです。

この様子だと、ビルボードアニメ6000体を12回(両面なら24回)で描画できるかもしれませんね。マテリアルバッチを検討する必要も無さそうです。



◎次回予告

次回は、UVアニメのサンプルにシェーダインスタンシングを適用します。どれだけ速くなるか楽しみですね~!w

スポンサーサイト

テーマ : ゲーム製作 関連 - ジャンル : ゲーム

コメント

あれ?

疑問が…。float4で1レジスタ消費するとして、float4x4はその4倍ですから1インスタンス辺り4レジスタ消費します。なので

>float4x4 InstanceTransforms[1000];
だと4000レジスタ消費相当のように思えるのですが…。にもかかわらず、コンパイルは通りますね。何でだ? コンパイラが最適化を行うなどしているのかも知れませんが、PIXで解析しなきゃ分からないかな。

はぅ…

>float4x4
…頭の中でfloat4と思い込んでいたのですが、float4x4ですね。

>4000レジスタ消費相当
仰る通りですが、コンパイルも通るし、三角形モデルは1023個まで表示されます。

このPCに定数レジスタが4000個もあるとは到底思えないのですが…理解不能(?_?)

謎が解けました!

サブPC(GeForceFX5200)で試したら、三角形モデル60以下は正常表示、61以上はエラーで落ちました。公式サンプルの数値通りです。

つまり、メインPCがイレギュラーだったというわけです。バーテクスシェーダーをソフトウェアで対応しているそうですので、定数レジスタも仮想で4096個分実装していると考えれば納得できます。

なるほど! 256というのはシェーダ2.0で保証される“最低限の”定数レジスタ数で、ハードやソフトウェアエミュレートの性能によってはそれをオーバーできるということでしょうか。

マニュアルを見ていたらGraphicsDevice.GraphicsDeviceCapabilities.MaxVertexShaderConstantsというプロパティで定数レジスタの数が分かるようですが、そちらの環境だとこれが256をオーバーしているかも知れませんね。

配列を大きくするとコンパイルが通らないのは、“最大限”すらオーバーしていたのかな。


もしNa-7さんが2.0に拘るなら、定数レジスタ数は256に抑えないとダメかも……(汗)。

定数レジスタの数

>オーバーできる
はい。MSのマニュアルでも「最低 256」と記述されているので、オーバーする分にはOKですね。

>MaxVertexShaderConstants
メインPCで確認したら「8192」でした。コンパイルエラーの上限と一致しますが、4096以上使用したら表示がおかしくなりました。ドライバの仕様なのかバグなのかよくわかりません(笑)

>“最大限”
MaxVertexShaderConstantsの値と一致したのが少し気になりますが、たまたまですよね?コンパイルエラーは環境に依存しないと思うので。

>定数レジスタ数
256あれば正常動作するように作ります。256超にも対応できれば理想的ですが、安定動作が保障されるレジスタ数がよくわからないのが難点ですね。

>MaxVertexShaderConstantsの値と一致
そちらの環境では「頂点シェーダはソフトウェアエミュレートだった」かと思います。

ハード的な制約のないソフトウェアエミュレートなのに、別にレジスタ数を512とか3333とかいった値に制約する必要はないわけですから、仕様上の最大限にしているんじゃないでしょうか。

そうですね

>仕様上の最大限
多分そんな所ですよね。ちなみに、他のプロパティも幾つか確認したら、スゴイことになってましたw
次回の記事で触れます。

コメントの投稿


管理者にだけ表示を許可する

トラックバック


この記事にトラックバックする(FC2ブログユーザー)



copyright © ゲーム制作の舞台裏 all rights reserved.Powered by FC2ブログ
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。