4

パーティクルシステムをジオメトリシェーダーで完全に更新する必要がありますか、またはジオメトリシェーダーに位置とライフなどの更新されたデータを渡す必要があります。現時点では、ジオメトリ内のすべてを更新していますが、C ++で一部のデータが必要な場合に備えて、これが最善のアイデアかどうかはわかりません。

4

2 に答える 2

4

シェーダーのほとんどすべてが可能です (特に SM4+ を使用する場合)。なんらかの市場浸透が必要な場合は、SM3 を超えるものはお勧めしません。最新のゲームに SM2 フォールバックを提供しなかったことを今でも後悔しています。かなりの数の人々がまだ古い安っぽい SM2 カードを使用しているからです。

質問の続きです。RTT を使用して、メイン メモリに戻るラウンド トリップを行うことはありません (これは非常に遅く、グラフィック メモリからメイン メモリへの転送を最小限に抑えます)。 (CPU側で必要になります)純粋なGPUを使用する場合。

代わりに、CPU 側でパーティクルの状態を変更する必要があるすべてのことを行います。次に、GPU に更新されるデータのタイトなメモリ表現を取得します。頂点シェーダーはかなり複雑です (しかし、それはまったく問題ありません。頂点シェーダーでできる限りのことを行ってください!)。この圧縮されたパーティクルの表現を抽出し、変換して、圧縮されていないデータをピクセル シェーダーに渡します。ここで重要なことは、頂点ごとおよびパーティクルごとのデータを分割できること、また分割する必要があることです。これは、インスタンス化を使用することを意味します (これは単なる言い方です: 分周器を使用します)。法線 + その法線を中心とした回転で粒子の回転を表します。

パーティクル CPU 側の状態変更を行うもう 1 つの理由は、CPU 側の動作を合成する方がはるかに簡単だからです。少なくとも半分まともなパーティクル システムは、興味深いパーティクル エフェクトを作成できるようにするには、かなりの数のノブを回す必要があります。

編集:そして、失敗したインライン化できない Particle::Update に似たものがある場合は、粒子ごとの関数呼び出し、特に仮想関数の呼び出しを最小限に抑え、粒子のメモリ表現をしっかりとパックしてください!

于 2012-03-06T16:28:18.853 に答える
1

それは、使用しているパーティクル システムの種類によって異なります。ほとんどの場合、C++ のソフトウェア表現とシェーダーのハードウェア表現があります。シェーダのジオメトリ データは、ソフトウェア表現から計算され、できるだけ小さくする必要があります。ほとんどの場合、計算能力が制限リソースではなく、グラフィックス カードへの転送速度であるためです。

メソッドを使用して転送をさらに減らすことができる場合でも、ソフトウェア表現をメモリに保持して、さらに使用することができます。これがデータを 2 回計算することを意味する場合でも、転送プロセスよりも高速になる可能性があります。

于 2012-03-06T16:17:24.597 に答える