2

この機能は非常に不十分に文書化されているようです。DirectX SDK のジオメトリ シェーダー チュートリアルでは、CreateGeometryShaderWithStreamOutput を使用する例はなく、その基本を説明するスレッドはどこにもありません。msdn では、それを作成するために使用する関数が示されています、しかし、それがどのように、そして何のために使用されているかではありません.それをうまく使用した人はいますか?小さな例またはチュートリアルへのリンクを共有できますか?それは何のために使用され、パフォーマンスは賢明ですか?私が理解している限り、GPU ベースの錐台カリングに使用されますか?

4

1 に答える 1

3

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 );
于 2012-09-27T10:28:42.607 に答える