6

私は Android とネイティブ C++ で Android 用のシーン描画を実装していegl 1.1ます。glSurfaceView現在、バックバッファとフロントバッファがスワップされているときに、「onDrawFrame」の最後に表示されるバックバッファに描画できるアンドロイドを使用しています。

私の問題はこれです-バックバッファーを表示し、スワップしていないかのように書き込みを続行できる必要があります。この要求の背後にある理由は、シーンが非常に大きく、各フレームを構築することは不可能であり、ユーザーが長時間待たなければならないため、描画の終了も待機していないためです。

つまり、段階的にシーンを構築する必要があります。レンダリング中の特定の時点で、時間だと判断しeglSwapBuffers、バック バッファーから描画されたコンテンツを表示する を呼び出しますが、書き込みを続けると、明らかに同期していない「前のフロント バッファー」に書き込みます。 . (これまでに描いたものは含まれていません)。

私の唯一の選択肢は、スワップする前にバックバッファをコピーすることです。疑似:

  1. バックバッファに描画
  2. バックバッファを一時バッファにコピー
  3. スワップ
  4. 一時バッファを(新しい)バック バッファにコピーします
  5. より多くのものをバック バッファーに描画する
  6. 等々...

私の質問 - ステップ 2、4 を実行する方法はありますか?

  • glCopyPixelsこの場合、役に立ちますか?例?
  • ですかglBlitFramebuffer

それとも、私はこれにすべて間違って近づいていますか?

私がすでにやったこと:

  • に設定EGL_SWAP_BEHAVIORしてみましEGL_BUFFER_PRESERVEDたが、特定のデバイスでしか動作しないようです ( khronos notesで説明されているように) :

一部のサーフェスでは、カラー バッファーの内容を保持するかどうかをアプリケーションで制御できます。

  • 各フレームでシーンを再レンダリングする - 不可能。これが推奨されていることを何度も読みました。
4

1 に答える 1

3

あなたの一般的なアプローチは正しいです。バッファの一部のサブ長方形を同じバッファ内の別の位置にコピーするだけなので、を使用glBlitFramebuffer()するとより役立つ可能性があります。glCopyPixels

ただし、少なくとも利用可能な場合OES_framebuffer_objectは、潜在的により良いアプローチを考えることができます。

  1. テクスチャまたはユーザー定義のレンダーバッファーに描画します
  2. テクスチャを BACK バッファにレンダリングする/Renderbuffer を BACK バッファにブリットする
  3. スワップ
  4. テクスチャ/レンダバッファを更新
  5. テクスチャを BACK バッファにレンダリングする/Renderbuffer を BACK バッファにブリットする
  6. スワップ
  7. [... 等々 ...]

そうすれば、フレームごとに 2 つのコピーを持つコピー/更新/コピー/スワップ サイクルがなくなり、更新/コピー/スワップだけが 1 つの追加コピーで行われます。

于 2014-05-29T12:05:02.780 に答える