在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 - before或(如许多消息来源所述)之后的绘图?正如您注意到的,在绘制矩形之前,我使用函数swapBuffers (drawable.swapBuffers())。否则,我在调整尺寸后会有噪音。那么,怎样才是最合适的方法呢?
包括或省略行capabilities.setDoubleBuffered(true)不会产生任何影响。
发布于 2009-10-09 06:53:13
如果JOGL类似于C/C++版本:
RMorrisey和示例代码在说明glFlush的使用时是不正确的。
swapBuffers函数必须位于绘图的末尾。
要确认这一点:有形状做动画非常快,并注意撕裂。如果你被撕裂,那么你是在做一次抽签,如果你没有,那么你是使用双缓冲。
发布于 2011-10-20 14:09:38
如果使用GLCanvas,默认情况下将autoSwapBuffer模式设置为true,则不必手动调用swapBuffers()。您的闪烁与双缓冲无关,而是将sun.awt.noerasebackground设置为true。
发布于 2009-10-09 01:02:04
下面是一个使用JOGL的双缓冲动画示例:
http://www.java-tips.org/other-api-tips/jogl/how-to-implement-a-simple-double-buffered-animation-with-mouse-e.html
不要在显示(.)的末尾调用swapBuffers()打电话:
gl.glFlush();我已经有一段时间没有使用JOGL做任何事情了,希望这会有所帮助。
https://stackoverflow.com/questions/1540928
复制相似问题