0

每次渲染时,我都会越来越多地绘制 GLUT 基元。为了让事情变得更快,我决定不每次都清除,只是放入新的原语。那是错的吗?

当我这样做时,我眨了眨眼。放置 sleep() 表明一帧是好的,第二帧是空的,依此类推。

编辑:执行一次的渲染(显示)中的简短代码(我使用Java的JOGL):

gl.glPushMatrix(); 
gl.glColor3f(1, 1, 0);
gl.glTranslatef(0, 0, 0);
glut.glutSolidCube(10);
gl.glPopMatrix();
drawable.swapBuffers();
4

3 回答 3

1

肯定是空的。当你清除时,你清除了前缓冲帧。然后,当调用后缓冲帧的 swapBuffers() 变为前,同时你的东西正在被绘制到前缓冲帧,它刚刚变成后缓冲帧。然后,当后缓冲帧完成时,缓冲区交换完成(由对 swapBuffers() 的调用触发。这就是双缓冲的工作原理。如果你不清除帧颜色,你会累积你的绘图随着时间的推移在前端缓冲区中,我不确定这是理想的结果。在每个渲染循环开始时清除一次前端缓冲区对性能影响不大。当您频繁调用 glClear() 时会出现问题,就像之前调用它一样每个对象绘制也没有意义,因为在这种情况下,您只会看到最后绘制的对象。对于闪烁 - 你应该更详细地描述你是如何做到这一切的。从你的例子中,不清楚它为什么会发生。

于 2012-12-13T08:32:08.167 回答
0
gl.glDisable(GL_DEPTH_TEST);

?

如果没有看到更多代码,很难说。

当我在 openGL 代码中得到意想不到的结果时,我会在脑海中浏览状态可能性列表并将它们设置为启用或禁用:

  • 深度测试
  • 纹理
  • 灯光
  • 混合
  • 剔除
  • 帧缓冲区
  • 着色器
于 2012-12-13T02:17:30.857 回答
0

Swapbuffers(HDC) 实际上并不复制缓冲区的内容,而只是交换前后缓冲区,这就是为什么你看到每个奇数帧,但看不到偶数帧的原因。

于 2012-12-13T08:31:32.947 回答