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放置在绘图之前还是之后(正如许多消息来源所说)?正如您所注意到的,我在绘制矩形之前使用了函数 swapBuffers ( drawable.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 回答