3

JOGL(Java OpenGL)でダブルバッファリングを実装するための適格な方法は何ですか?

私は次のコードでそれを行おうとしています:

...    

/** Creating canvas. */
GLCapabilities capabilities = new GLCapabilities();
capabilities.setDoubleBuffered(true);
GLCanvas canvas = new GLCanvas(capabilities);

...

/** Function display(…), which draws a white Rectangle on a black background. */
public void display(GLAutoDrawable drawable) {
    drawable.swapBuffers();

    gl = drawable.getGL();

    gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);
    gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);

    gl.glColor3f(1.0f, 1.0f, 1.0f);

    gl.glBegin(GL.GL_POLYGON);
    gl.glVertex2f(-0.5f, -0.5f);
    gl.glVertex2f(-0.5f, 0.5f);
    gl.glVertex2f(0.5f, 0.5f);
    gl.glVertex2f(0.5f, -0.5f);
    gl.glEnd();
}

...

/** Other functions are empty. */

質問:

—ウィンドウのサイズを変更すると、通常、ちらつきが発生します。ご覧のとおり、ダブルバッファリングの実装に誤りがあります。

—疑問があります。関数swapBuffersをどこに配置する必要がありますか—(多くの情報源が言うように)描画の前または後ですか?お気づきのように、長方形を描く前にdrawable.swapBuffers()関数swapBuffers( )を使用しています。そうしないと、サイズ変更後にノイズが発生します。それで、それを行うための適切な方法は何ですか?

行を含めたり省略したりしてcapabilities.setDoubleBuffered(true)も効果はありません。

4

3 に答える 3

7

GLCanvasを使用する場合、autoSwapBufferモードはデフォルトでtrueに設定されているため、swapBuffers()を手動で呼び出す必要はありません。ちらつきはダブルバッファリングとは関係がなく、sun.awt.noerasebackgroundをtrueに設定します。

于 2011-10-20T14:09:38.793 に答える
3

JOGL が C/C++ バージョンのような場合:

RMorrisey とサンプル コードは、glFlush の使用について述べている点で正しくありません。

swapBuffers 関数は、描画の最後に配置する必要があります。

これを確認するには、シェイプのアニメーションを非常に高速に実行し、ティアリングを監視します。テアリングが発生する場合は、単一の描画を行っています。そうでない場合は、ダブル バッファリングを使用しています。

于 2009-10-09T06:53:13.573 に答える
1

以下は、JOGL を使用したダブル バッファ アニメーションの例です。

http://www.java-tips.org/other-api-tips/jogl/how-to-implement-a-simple-double-buffered-animation-with-mouse-e.html

display(...) 呼び出しの最後に、swapBuffers() を呼び出す代わりに試してください。

gl.glFlush();

JOGL で何かをしたのは久しぶりです。お役に立てれば。

于 2009-10-09T01:02:04.837 に答える