2012-03-06 43 views
4

パーティクルシステムをジオメトリシェイダーで完全に更新するか、ジオメトリシェーダーに位置と寿命の更新データを渡す必要がありますか?現時点では、私はジオメトリのすべてを更新しますが、これが最良のアイデアであるかどうかはわかりませんが、データの一部はC++で必要です。パーティクルシステムをジオメトリシェイダーで完全に更新する必要があります

答えて

3

シェーダのほとんどすべてに可能です(特にSM4 +の場合)。市場浸透が必要な場合は、SM3以上のものはお勧めしません。かなり残念なSM2カードを使用している人がかなりいるため、最新のゲームではSM2のフォールバックは提供していませんでした。

その他の質問RTTを使用して、メインメモリへの往復をやり直すことはできません(グラフィックスメモリからメインメモリへの転送を最小限に抑えます)が、AABBを計算するには幾分精巧なトリックを使用する必要がありますあなたが純粋なGPUに行くなら、それはあなたが物事のCPU側で望むでしょう)。

代わりに、CPU側でパーティクルの状態を変更する必要があるすべてを行います。その後、そのデータの厳密なメモリ表現がGPUに更新されます。頂点シェーダはかなり複雑です(ただし、頂点シェーダで可能な限り上手くいくのですが)、この圧縮されたパーティクルの表現を抽出し、それを変換し、非圧縮データをピクセルシェーダに渡します。ここで重要なのは、パーティクルごとに頂点ごとに分割することができることです。&これはインスタンス化を使用することを意味します(これはちょうど言い方です:周波数分周器を使用する)。我々は、粒子の回転を、その法線についての通常の+回転で表します。

パーティクルCPUサイドの状態変更を行うもう一つの理由は、CPUサイドのビヘイビアを合成する方がずっと簡単です。興味深いパーティクルエフェクトを作成できるようにするには、少なくとも半分以上のパーティクルシステムにはかなりのノブが必要です。

EDIT:インライン化できないParticle :: Updateに似たものがあれば、パーティクル関数呼び出し、特に仮想関数呼び出しを最小限に抑え、パーティクルのメモリ表現をしっかりとパックしてください!

+0

ああブリリアントな返信、それは私に多くの意味があります。私の次の仕事はソフトパーティクルを実装することです。このため、純粋なGPUを使用している場合、深度の並べ替えを非常に簡単に行うことができないため、この質問をする必要がありました。私は非常にあなたが言ったことを反映するために今私のコードを変更することができます – RobBain85

1

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

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

+0

私の粒子システムは、煙、火災、埃、雨などの形で来ます。現時点では、位置と速度のためにシェーダにランダムなxyとzの値を送ります。また、パーティクルのフレーム時間とライフタイムを渡します。 My Shaderは、粒子が入ってくる値に基づいて粒子の位置を決定します。ソフトウェアでこれらの計算を行いますか? – RobBain85

+0

多分私はあなたを誤解します...しかし、あなたがランダムな位置と速度を送ると、パーティクルはちらつきますか?または、これらの値は1回だけ計算され、フレーム時間のみが更新されますか?その場合、確定的な動きだけが可能である。 –

+0

申し訳ありませんええ、彼らは粒子が何度も繰り返してemmitedされているときに適用されます – RobBain85

関連する問題