-2

注:私のOpenGLプロジェクトでは、有効SDL_GL_SwapBuffersにしていSDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1)ます。

を呼び出した後にピクセルを保持しSDL_GL_SwapBuffers()、レンダリングされたピクセルを再レンダリングせずに再利用するにはどうすればよいですか?また、保持されたピクセルを背景レイヤーとして結合し、バッファーをクリアしてglClear()背景レイヤーの上にポリゴンをレンダリングするにはどうすればよいですか?

コメント付きのサンプル コードを提供します。

4

1 に答える 1

1

技術的には、選択したスワップ方法によっては、バックバッファの古い内容を取り戻すことができる場合があります。これは完全なハックですが、うまくいく可能性があります。交換の場合、カラー バッファーをクリアせずにバッファーを再度スワップすると、フロント バッファーの古いコピーがバック バッファーに転がっている可能性があります。スワップメソッドがコピーの場合、自分で発行しない限り、バックバッファーは決してクリアされるべきではありませんglClear (...)。スワップ後にバッファーを読み取ろうとすると、バッファーの内容を未定義のままにする 3 番目の一般的なスワップ オプションがあるため、注意してください。

最後に述べたスワップ動作は、PowerVR (iOS) などの組み込みグラフィックス デバイスで一般的です。デスクトップではあまりありません。そして、これはすべて、OpenGL のウィンドウ システムの実装が 1 つのフロント バッファーと 1 つのバック バッファーを使用していることを前提としています。舞台裏の実装ではトリプル バッファリングを実装できますが、ほとんどのウィンドウ システム API はバックバッファの数を要求する方法さえ提供していません。スワップ チェーンは GL の世界では厄介なものです :-\

要するに、フレーム償却レンダリング(前のフレームで計算された値を使用してアルゴリズムを終了する) は OpenGL で実現できますが、ウィンドウ システムが実際にフロント/バックバッファーを使用しようとすると (たとえば、 WGL、glX、CGL、EGL) を使用します。あなたがしなければならないことは非常に簡単で、FBO に引き込み、FBO のスワップ チェーンを自分で管理することです。残念なことに、これによりメモリ要件が増加しますが、最新のグラフィック エンジンのほとんどはこの方法で償却を行っています。

これについては、自分で FBO を検索する必要があります。理論を説明しましたが、質問にはコードが含まれていないため、(今後の参考のために) 期待できるのはこれだけです。

于 2013-10-10T21:51:03.960 に答える