この機能は非常に不十分に文書化されているようです。DirectX SDK のジオメトリ シェーダー チュートリアルでは、CreateGeometryShaderWithStreamOutput を使用する例はなく、その基本を説明するスレッドはどこにもありません。msdn では、それを作成するために使用する関数が示されています、しかし、それがどのように、そして何のために使用されているかではありません.それをうまく使用した人はいますか?小さな例またはチュートリアルへのリンクを共有できますか?それは何のために使用され、パフォーマンスは賢明ですか?私が理解している限り、GPU ベースの錐台カリングに使用されますか?
1 に答える
DirectX SDK で 2 つの例を見つけることができます (directX 10 セクション)。
- パイプGS
- パーティクルGS
NVidia のサンプルも確認できます: http://developer.download.nvidia.com/SDK/10/direct3d/samples.html
Rain と Metaballs はストリーム アウトを使用しています
これらのサンプルはすべて dx10 にありますが、dx11 への移植はかなり簡単です (ほんの数ビットを置き換えるだけです)。
それにはかなりの使用法があります(完全なリストではありません):
- 動的粒子
- モデルの前処理 (スキニング、ディスプレイスメント、テッセレーション)。したがって、モデルにディスプレイスメントを一度適用してから、ディスプレイスメントされたモデルを複数のパス (シャドウ マップ/マテリアル...) に再バインドできます。
- モデルのエクスポート: シェーダーでジオメトリを生成し、ストリーム出力コンテンツを CPU に戻し、3D モデルとしてエクスポートします。
ストリーム出力の代わりに未加工のパイプラインを使用する場合は、次の手順を実行する必要があります (これは、Microsoft Stream Outputドキュメントからの要約です) 。
FX フレームワークは内部で同じことを行います。
ジオメトリ シェーダーはCreateGeometryShaderWithStreamOutputで作成する必要があります
CreateGeometryShaderの代わりに
ジオメトリ シェーダーの出力レイアウトと一致するようにD3D11_SO_DECLARATION_ENTRYを設定する必要があります (これは入力アセンブラーと同じように機能します)。
次に、バッファがストリーム出力アクセスで作成されていることを確認します。
D3D11_BUFFER_DESC bufferDesc;
bufferDesc.BindFlags = otherBindFlags | D3D11_BIND_STREAM_OUTPUT;
bufferDesc.Usage = D3D11_USAGE_DEFAULT;
bufferDesc.CPUAccessFlags = 0;
otherBindFlags を同時に D3D11_BIND_UNORDERED_ACCESS にすることはできないことに注意してください (シェーダー ビューと Raw ビューは許可されます)。
最後に、描画を実行する前に、ストリーム出力バッファーにSOSetTargetsを割り当てます。
UINT offset[1] = 0;
ID3D11Buffer* m_pBuffer (your buffer created before)
deviceContext->SOSetTargets( 1, &m_pBuffer, offset );
描画呼び出しが完了したら、次を使用してクリーンアップすることを忘れないでください。
UINT offset[1] = 0;
ID3D11Buffer* pNullBuffer = 0;
deviceContext->SOSetTargets( 1, &pNullBuffer, offset );