0

OpenGL ES 2.0 を使用して、iPhone に状態保持パーティクル システムを実装しようとしています。状態を維持するとは、各パーティクルが時間的に前方に統合され、時間とともに変化し、レンダリング呼び出しごとに初期条件から計算できない固有の速度と位置ベクトルを持つことを意味します。

ここに私が考えることができる1つの可能な方法があります。

  1. VBO で粒子の初期条件を設定します。
  2. 頂点シェーダでパーティクルを統合し、結果をフラグメント シェーダでテクスチャに書き込みます。(最初のレンダリング呼び出し)
  3. テクスチャから VBO にデータをコピーします。
  4. VBO のデータからパーティクルをレンダリングします。(2 回目のレンダリング呼び出し)
  5. 2.~4.を繰り返します。

効率的に行う方法がわからないのは、ステップ 3 だけです。CPU を経由する必要がありますか? OpenGL ES 2.0 を使用して GPU でこれを完全に実行できるかどうか疑問に思います。どんなヒントでも大歓迎です!

4

1 に答える 1

2

単純に glReadPixels を使用しないとこれが可能だとは思いません。ES2 には、OpenGL が GPU を使用してバッファの内容をコピーできるのと同じ柔軟なバッファ管理がありません (たとえば、テクスチャ間でデータをコピーできます)。と vbo を使用するか、単に変換フィードバックを使用します。これは、基本的に、まさにあなたが望むことを行うように設計されています)。

GPU を使用する必要がある場合の唯一の選択肢は、レンダリング後にglReadPixelsを使用してフレームバッファの内容をコピーすることだと思います。また、 EXT_color_buffer_floatまたは関連するものをチェックして使用し、高精度の値が得られていることを確認することをお勧めします (RGBA8 はおそらくパーティクルには十分ではありません)。これを通常のレンダリングと混合している場合は、GPU を待っている CPU を失速させないように、おそらく大量のバッファリング (1 つか 2 つのフレームを待機) を組み込む必要があります (PowerVR はバッファリングするため、これは特に悪いことです)。レンダリング前のフレーム全体)。

ES3.0 では変換フィードバックがサポートされる予定です。これは役に立ちませんが、将来への希望を与えてくれることを願っています。

また、ARM CPU で実行している場合は、NEON を使用してすべてのパーティクルをすばやく更新する方が速いようです。これは非常に高速で、CPU+GPU 方式で発生するすべてのオーバーヘッドをスキップします。

于 2013-06-13T17:54:25.817 に答える