« CEDEC終了 | トップページ | 明日から »

2012.08.23

プロシージャルジオメトリの話とDraw Indirect系命令

昨日は、CEDECで「DirectX 11を使用した高度なプロシージャルレンダリング」を聴いてましたが、DrawInstancedIndirectの話題がでたわけですが、やっぱりアレは面白いネタに使えそうだなぁ(GDCのスライドは下記)。

Draw Indirect
http://gpuexperiments.blogspot.jp/2008/12/draw-indirect.html

DrawInstancedIndirect
http://msdn.microsoft.com/ja-jp/library/ee419595(v=vs.85).aspx

MSDNだけを見るとわかりにくいので上のblog記事が参考になるのですが、UINT 4つのデータのUAVのBufferをDrawInstancedの引数として使えるインスタンシング描画命令なのですが、GPUで引数をセットすることでGPU側で色々と計算した結果やバッファを元に描画をしちゃおうというわけです。

ID3D11DeviceContext::DrawInstanced
http://msdn.microsoft.com/ja-jp/library/ee419594(v=vs.85)

ID3D11DeviceContext::DrawInstancedの引数は、

UINT VertexCountPerInstance・・・インスタンス単位の頂点数
UINT InstanceCount・・・インスタンシング数
UINT StartVertexLocation・・・頂点の開始位置
UINT StartInstanceLocation・・・インスタンシングの開始位置

といった感じなのですが、VertexCountPerInstanceをGPUで決定できると言うことは、たとえば、Compute Shaderで任意の数の頂点データを生成してDrawを発行などができますね。

Compute Shaderで任意の数の頂点データを生成するというのはAppendStructuredBufferに書き出すのがよいですね。AppendStructuredBufferはシェーダの中でデータを追加できるバッファでSTLのvectorとかと感覚的に近いですね。

AppendStructuredBuffer
http://msdn.microsoft.com/ja-jp/library/ee422322(v=vs.85)

プリミティブトポロジーをトライアングルストリップやトライアングルリストの場合、AppendStructuredBufferのデータの並びがちゃんとそのトポロジーに沿った形で入ってるとちゃんとメッシュが構築できると思います(インデックスリストをCompute Shaderで生成したらDrawIndexedInstancedIndirectもある。これは引数のデータサイズが異なる)。

そんなわけで、Compute Shaderでプロシージャルジオメトリして、三角形や四角形ベースにデータを並び替えて描画するというのは結構面白そうな話ですね。

そういえば、GPU ExperimentsではDrawAutoの話が出ていますが、ジオメトリシェーダがStream OutputしてDrawAutoするようなネタをこちらに置き換えた場合パフォーマンス的にどうなんでしょうね。

« CEDEC終了 | トップページ | 明日から »

Programming」カテゴリの記事

コメント

この記事へのコメントは終了しました。