2016-07-09 6 views
2

私は最初のゲームエンジンに取り組んでおり、GPUパーティクルシステムを実装しようとしています。私は前にCPUに実装しましたが、今はもっと効率的にしようとしています。私の問題は、具体的には、生涯にわたって粒子を産卵することです。Spawning GPU Particle

パーティクルエンジン用のフレームバッファテクスチャで作業しているので、非常に並列ですが、CPUに戻れないという代償を払っています。私はその特定のパーティクルシステムの計算を扱うクワッドを描画するための最初のパスを持っています(並べ替えのためにおそらく2番目のクワッドが必要です)。次にglDrawArraysInstancedを実行します。

パーティクルを作成する必要があるとき、またはCPUによって初期化されたパーティクルを作成する必要があるか、パーティクルが生成されるかを表すブール値またはintを使用する。だから、生存期間(最初のfboテクスチャのアルファ値)が0より小さい粒子(ピクセル)を見つけたら、それを作成するはずですが、残りの部分の作成を無効にするにはどうすればいいですか?パーティクル数を減らすか、バーストするパーティクル数を減らしますか?私はフィードバックを変換するようなことについて聞いたことがありますが、それが最善の方法かどうかはわかりません。また、ステートレスパーティクルはサウンドリミットを制限します。すべてのパーティクルが1:1の産卵率を持つわけではありません。

質問を簡単に繰り返すにはGPUパーティクルを生成する最も良い方法は何ですか?

CPUにパーティクル数がある場合は、glDrawArraysInstancedで描画する量を設定できます。回答に含めることができれば、感謝します。

+2

"私は最初のゲームエンジンに取り組んでいます" - [ゲームではなく、エンジン](http://geometrian.com/programming/tutorials/write-games-not-engines/) –

+1

前のゲーム。他の人のエンジンを使うのに疲れて、すべてのゲームに全く新しいコードベースを書こうとは思わない。私はレンダリング、物理学、照明、入力、および他のシステムのトンですでにたくさんの作業を行ってきました。停止はすぐに良いアイデアのようには聞こえません。 –

+1

ああ、@ JesperJuhl - 私は記事を読んだだけです。私はすでにいくつかのゲームアイデアを計画しており、コード内のすべてのシステムはさまざまなタイプのゲームの中で動作するように計画されています。私が1つのゲームをコーディングした場合、それはあまり柔軟性がありません。例えば、私の入力システムは、LinuxやWindows、まもなくMacと互換性があり、使いやすくて柔軟性があるようにさまざまな入力と機能を持つように設計されています。厳しい愛に感謝しますが、本当に必要なことはありません - この問題を解決するための最良の(そして最も柔軟な)方法を理解する必要があります。 –

答えて

0

私は行く必要があります...

CPUは、粒子の最大数が何であるかを知っている(プールサイズになる)と「ライブ」の粒子の現在の数なければなりません。最初の数値は粒子状態のVBOを初期化またはサイズ変更するために使用され、頻繁に変更すべきではありません。必要に応じて、2番目のフレームをフレームごとに変更することができます。

個々のパーティクルの寿命は、VBO値の一部として保存する必要があります。おそらく、カウンターや時間値を使って位置や色などを決定し、このカウンターが最大値に達すると、パーティクルを「殺す」ように再割り当てします。初期カウンタ値を変更することによって、パーティクルはすべて同じように開始して更新する必要はありません。

パーティクルの状態を更新するには、はい、変換フィードバックが必要です。古いものから各パーティクルの新しい値を計算し、これらを別のVBOに書き込む「頂点シェーダー」があります。詳細とサンプルコードについては、OpenGL SuperBibleを参照してください。私は2つのVBOの間でping-pongを行います.1つは古い値用、もう1つは新しいものですが、シェーダー内に書き込むことができる大きな配列(はるかに大きなuniform)のTexture Buffer Objectsを使用することもできます。毎回更新されるパーティクルの数は、CPUライブカウンターによって制御されます。

これが役に立ちます。

+0

答えていただきありがとうございますが、私はVBOの使用を検討していましたが、私はそれに反対しました。私はテクスチャ(これはhttp://nullprogram.com/blog/2014/06/29/のような)が多数の粒子のためのより良い解決策になると思った。私のパーティクルは現在のところ生涯ループしていますが、私はそれらを少しでも "死ぬ"ことができるようにしたいと思います。それが私の問題です。 GPUだけで1つの新しいパーティクルを作成する方法はありません。 –

+0

効率的な並列処理を行いたい場合は、個々の粒子を制御するという考えをしないでください。巨大な数を対象とするアルゴリズムが必要です。個々のパーティクルは、glDrawArraysInstancedなどで使用されるライブカウントを減らすか、パーティクルに負の年齢があり、年齢が> 0になるまで表示されないようにすることで、少しでも「死ぬ」ことができます。 –

+0

これは私の計画です。 。パーティクルのランダムな寿命のため、gldrawarrayinstancedのために生存している粒子の数を制御することは困難です。 GPUで増減するパーティクル数があれば、私はこの問題を解決できます。 –