はかせのラボ

私の頭の中を書いていく雑記ブログです

プログラミング ジオメトリインスタンシング⑧

あいさつ

どうも、はかせです。
今回はついにジオメトリインスタンシングっぽいことができたので
それについてです。

実行結果

くだくだ言う前にまずは実行結果です。
f:id:hakase0274:20190611223901p:plain
上に白いやつが、下に灰色のやつがありますね。
これDrawメソッドは1フレームに一回しか呼んでいません。

実装

今回はシェーダーの定数レジスタを使って実装してみました。
やり方は簡単で、

cbuffer global
{
    matrix gWVP[10];
};

こんな感じで定数バッファの領域に配列置いて

// GPU(シェーダ側)へ送る数値をまとめた構造体
struct CONSTANT_BUFFER 
{
	DirectX::XMMATRIX mWVPs[10];
};

CONSTANT_BUFFER cb;
cb.mWVPs[0] = (XMMatrixTranspose(XMMatrixRotationY(90) * XMMatrixTranslation(0, 0, 0) * View * Proj));
cb.mWVPs[1] = (XMMatrixTranspose(XMMatrixRotationY(0) * XMMatrixTranslation(0, 1, 0) * View * Proj));

こんな感じで値をセットして

mDeviceContext->DrawIndexedInstanced(mDrawNum, 2, 0,0,0);

Draw実行です。

渡された値の何番目を使うかはインスタンスIDを用いて決めています。

struct VS_IN
{
    float4 pos : POSITION;
    uint instanceID : SV_InstanceID;
};

output.pos = mul(input.pos, gWVP[input.instanceID]);

ちなみに今回試してわかったことなんですが、
SV_InstanceIDはDrawInstanced系のメソッドを使わないと
値があてがわれないっぽいです。
(普通のDrawメソッドじゃ何も出なかった)

あとがき

今回はようやっとジオメトリインスタンシングっぽいことができた話でした。

調べたところ今回の私の実装みたいな定数レジスタに直接値をセットするのは、
シェーダーインスタンシングと呼ばれているようです。

ただこの実装だと同時に描画できる個数が縛られるのと
定数レジスタに配列を置くということであまりメモリ効率がよくなさそうです。

何にしてもようやく1ドローコールで複数描画できるようになったのはいいことです。
今後も勉強を進め、もうちょい良い実装を見つけたいと思います。

それでは今回はこの辺でノシ
今回作ったものはgithubに上げました
github.com

VisualStudio グラフィックスデバッグなるものを知った話

あいさつ

どうも、はかせです。
今回はジオメトリインスタンシングの勉強のため
描画がどう行われているかデバッグするグラフィックスデバッグというものを
知ったのでその紹介です。

グラフィックスデバッグ

端的に言うと、
特定フレームにおける描画のパイプラインとかの情報を
見ることができる機能です。

デバッグ→グラフィックス→グラフィックスデバッグの開始を押します。
画像は少し経ってからの画面です。
f:id:hakase0274:20190610230744p:plain
画像の下側にフレームと書いてある画像があると思います。
こちらをダブルクリックするとこんな画面が出ます。
f:id:hakase0274:20190610230430p:plain

左のイベント一覧がCPU側で実行された命令になります。
このイベントをクリックすると下側に情報が出てきます。
ここで各パイプラインの値とか見ることができます。

ただこの機能万能ではないようで、
f:id:hakase0274:20190610231136p:plain
シェーダーなどのバイナリデータは何もせずには見れないっぽいです。
書いてある通りに飛ぼうとしましたが、そもそも項目がありませんでした(´;ω;`)
(一番見たかった部分が見れなかった)

あとがき

今回はグラフィックスデバッグを使ってみた話でした。
頂点情報なんかも見れるのはいいですね。
ちゃんと意図したとおりの値が入っているかわかるだけで大分デバッグしやすくなります。
(16進数だけど)

シェーダーとかもちゃんと設定すれば値が見れるそうです。
うまく使いこなせたらかなり強力なツールっぽいですね。

それでは今回はこの辺でノシ