1

SlimDX/D3D11 を使用してパーティクル システム マネージャーを作成していますが、定数バッファーに関するいくつかの問題が見つかりました。

私のパーティクル システム マネージャーは、物理特性の異なる複数のパーティクル システムを同時に描画でき、XNAのParticle 3D サンプルに基づいています。描画操作の一般的な考え方は次のとおりです。

  • context.ClearRenderTargetView(...)
  • パーティクルをレンダーする
  • swapChain.Present()

「パーティクルのレンダリング」操作は次のように実装されます。

  • shaderTimeGlobalVariable.Set(currentTime)
  • シェーダー手法の各パスについて:
    • パスを適用
    • 各パーティクル システム:
      • 定数バッファを物理定数で設定 (EffectConstantBuffer.SetRawValue)
      • 1 つ以上の context.Draw 呼び出しを発行します。

私の問題は、最後の定数バッファー呼び出しのみが考慮されているように見えるため、すべての粒子システムが同じ物理特性を持つように強制されることです。

したがって、まず第一に、これは正しい/予想されると思いますが、いくつかの重要な点が欠けています。何が欠けているのか誰かが私に明確にすることができますか?

解決策は、パーティクルの物理的特性を頂点バッファーに挿入することであり、頂点ごとに約 12 バイト多く、したがって、使用している物理システムごとに 12k から 120k のコストがかかると思います。可能であれば避けたいこと:他に利用可能なオプションはありますか?

4

1 に答える 1

2

シェーダー変数を変更した場合は、パスを (再) 適用する必要があります。したがって、手順は次のようになります。

  • 時間設定
  • 各パーティクル システム
    • 定数バッファを設定
    • パスごとに
      • パスを適用
      • 描く

実際のバッファ データに応じて、パフォーマンスを最適化するために呼び出しを並べ替えることができます。

定数バッファーを設定した後にパスを適用する必要がある理由は、エフェクト フレームワークが適用呼び出しでのみ GPU にデータを送信するためです。

于 2012-06-11T21:28:31.550 に答える