1

我想在 OpenGL 中旋转一个对象而不再次绘制,以节省时间。在 init 方法中,我想绘制图片,然后仅根据鼠标事件旋转它。

这是完整的方法:

 gl.Clear(OpenGL.GL_COLOR_BUFFER_BIT | OpenGL.GL_DEPTH_BUFFER_BIT);
 gl.LoadIdentity();     
 gl.Rotate(camera_angle_v, 1.0f, 0.0, 0.0);
 gl.Begin(OpenGL.GL_POINTS);

 //Draw

 gl.End();
4

3 回答 3

3

OpenGL 从根本上不是这样工作的。您正在渲染的帧本质上是一个二维像素数组。当您绘制图像时,它会更改其中一些像素的值来为您创建图像。一旦绘制了某些东西,它就会一直留在那里,直到您将其清除为止。OpenGL 不会跟踪您过去渲染的内容(除了它填充在帧中的像素),因此除了当前渲染的三角形/线之外,它无法对任何东西进行任何转换。

在您的绘制方法开始时,您清除框架(将所有像素重置为清除颜色)。之后您必须重绘对象。这就是 OpenGL 的工作方式,而且速度非常快。在现代 GPU 上,您可以每帧绘制数百万个三角形,并且仍然保持 60fps。如果你一开始没有清除框架,图像将被绘制在旧框架的顶部,你会得到一种镜厅的效果。

如果性能是一个问题,请考虑学习更现代的 OpenGL。您现在使用的是即时模式 OpenGL,它是 1992 年 OpenGL 1.0 规范的一部分。1997 年,OpenGL 1.1 引入了顶点数组,它为大量顶点提供了显着的速度提升,因为只有一个方法调用对于所有顶点,而不是每个顶点一个方法调用。每个新版本的 OpenGL 都会提供更优化的绘图方式。

于 2012-07-21T21:51:11.313 回答
1

您必须再次绘制对象 - 这就是 OpenGL 的工作原理。

每个帧都根据当前场景几何从头开始渲染。

于 2012-07-21T21:50:29.033 回答
0

好吧...如果您使用的是即时模式,我想您可以使用显示列表并相应地调用 glRotate 。尽管正如 Robert Rouhani 所说,您使用的技术是古老的(而且 99% 的在线教程都教给您)。使用 VAO(甚至更好的 VBO)来绘制对象。

于 2012-07-22T01:48:52.893 回答