プロシージャルジオメトリの話と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するようなネタをこちらに置き換えた場合パフォーマンス的にどうなんでしょうね。
「Programming」カテゴリの記事
- AVIFのHDR画像の貼り付けテスト(2022.12.15)
- HPG 2021スタート(2021.07.07)
- SIGGRAPH 2021のMadden NFL 21の衣類のシミュレーションのセッション(2021.05.27)
- SIGGRAPH 2021 : ChoreoMaster : Choreography-Oriented Music-Driven Dance Synthesis(2021.05.27)
この記事へのコメントは終了しました。
コメント