プログラミング ジオメトリインスタンシング⑨
あいさつ
どうも、はかせです。
今回は前回やったシェーダーインスタンシングを色々試してみた話です。
ちなみにほぼ失敗談ですw
試そうとしたこと
前回やったシェーダーインスタンシングでは、
定数レジスタに固定長の行列配列を置き、
その値をSV_InstanceIDというシステムから自動で格納される値をキーにして
各オブジェクトごとの情報をシェーダーに渡すというものでした。
ここで発生した問題は
一度に生成できるオブジェクトに限りが生まれることです。
どうせやるなら状況に応じて生成数を変えたいものです。
ということで色々試してみました。
配列要素数を増やしてみた
これは単純に配列要素数を増やすことで
上限があるもののまぁこれだけあれば足りるでしょうみたいな
長さで置いてみたというものです。
cbuffer global { matrix gWVP[2048]; };
端的に言えば数がそこまでないならできなくはないです。
ただ2048でコンパイルエラーが発生しました。(おそらく容量オーバー)
1024では通りました。
matrixはfloat4x4でfloat4x4はfloatの16倍のサイズです。
そしてfloatは4byteなので
4 * 16 * 2048 = 65,536byte
およそ65KBぐらいが定数レジスタの容量っぽいですね。
(厳密には入力レジスタとかの兼ね合いで変動しそうですが)
うーん・・・
正直1024程度じゃねぇといった感じですね。
なくはないですが、あまりいい方法ではなさそうです。
あとがき
今回はシェーダーインスタンシングで色々試してみた話でした。
やってみての感想はシェーダーインスタンシングはあまり実用的ではなさそうという感じです。
というのもわざわざインスタンシングするってことは
何万とオブジェクトを出したいんだと思うんです。
そんな状況下で同時に1024程度じゃ正直微妙かなと。
では、シェーダーインスタンシング以外で何があるんだという話ですよね。
今度はそれを探し、実装して、弄ってみたいと思います。
なんか入力レジスタが~みたいなのは見つけたので
あとは私の頭がどれだけ理解できるかにかかってますね。
それでは今回はこの辺でノシ