一般的なOpenGLの実装では、多数の呼び出しをキューに入れて、それらをまとめてアクティビティのバーストにまとめ、利用可能な通信帯域幅とGPU時間リソースを最適に利用します。
やりたいことは、基本的にダブルバッファレンダリングの反対です。つまり、各描画ステップがすぐに表示されるレンダリングです。これを行う1つの方法は、単一のバッファウィンドウにレンダリングし、glFinish()
各ステップの後に呼び出すことです。主な欠点:コンポジットウィンドウマネージャーなどを使用する最新のシステムではうまく機能しない可能性があります。
私がお勧めするもう1つのアプローチは、インクリメンタル描画用に別のバッファーを使用し、このバッファーからメインフレームバッファーを常に更新することです。主なテーマは、フレームバッファオブジェクトとRenderToTextureです。
まず、FBOを作成します(たくさんのチュートリアルがあり、StackOverflowの回答として)。FBOは基本的に、テクスチャやレンダーバッファなどのターゲットバッファを接続できる抽象化であり、描画呼び出しの宛先としてバインドできます。
では、どのようにそれらの問題を解決するのですか?まず、描画ループを遅らせてアニメーションを作成しないでください。これにはいくつかの理由がありますが、主な問題は、これによってプログラムの対話性が失われることです。代わりに、アニメーションのどのステップにいるのか(グローバル)カウンターを維持します。それを呼びましょうstep
:
int step = 0;
次に、描画機能でフェーズを実行する必要があります。1)テクスチャの更新2)画面の更新
フェーズ1は、フレームバッファオブジェクトをレンダリングターゲットとしてバインドすることで構成されます。これが機能するには、ターゲットテクスチャがバインドされていない必要があります
glBindTexture(GL_TEXTURE_2D, 0);
glBindFramebuffer(GL_FRAMEBUFFER, animFBO);
glViewport(0, 0, fbo.width, fbo.height);
set_animFBO_projection();
ここでの秘訣は、animFBOを一度だけ、つまり作成後にクリアし、その後は二度とクリアしないことです。次に、アニメーションの手順に従って線を描画します
draw_lines_for_step(step);
ステップカウンターをインクリメントします(これは複合ステートメントとして実行できますが、より明示的です)
step++;
アニメーションFBOを更新したら、画面を更新します。最初にanimFBOのバインドを解除します
glBindFramebuffer(GL_FRAMEBUFFER, 0);
これで、メインの画面上のフレームバッファが表示されます
glViewport(0, 0, window.width, window.height);
set_window_projection(); //most likely a glMatrixMode(GL_PROJECTION); glOrtho(0, 1, 0, 1, -1, 1);
次に、FBOにアタッチされたテクスチャをバインドし、フルビューポートクワッドに描画します
glBindTexture(GL_TEXTURE_2D, animFBOTexture);
draw_full_viewport_textured_quad();
最後に、バッファスワップを実行して、アニメーションステップの反復を表示します
SwapBuffers();