如何放大/缩小到OpenGL屏幕而不再渲染整个屏幕

时间:2014-03-26 23:13:34

标签: c++ opengl

我正在编写一个显示500万个矩形的程序,使用OpenGL进行渲染。 它需要约。 3秒钟在屏幕上显示这些矩形。 但是,当我尝试放大/缩小或向左/向右平移屏幕时,也需要相同的时间。

我想知道是否有办法将所有内容保存到内存/缓冲区中,因此屏幕不必一遍又一遍地重绘。

我也对其他解决方案持开放态度。

以下是我的重塑功能:

static void reshape_cb() {
    glViewport(0, 0, (GLint) screen_width, (GLint) screen_height);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D (0.0, DESIGN_SIZE, 0.0, DESIGN_SIZE);

}

2 个答案:

答案 0 :(得分:5)

  

我正在编写一个显示500万个矩形的程序,使用OpenGL进行渲染。它需要约。 3秒钟在屏幕上显示这些矩形。

这听起来像是以非常低效的方式发送绘图命令。现代GPU能够每秒渲染数亿个三角形。我的猜测是,你正在使用即时模式。

  

我想知道是否有办法将所有内容保存到内存/缓冲区中,因此屏幕不必一遍又一遍地重绘。

缩放通常意味着改变观点或渲染分辨率,因此需要完全重绘。

  

我也对其他解决方案持开放态度。谢谢。

您应优化绘图代码。关键字是:

  • 顶点阵列
  • 顶点缓冲区对象
  • 大型绘图批次

答案 1 :(得分:0)

我同意绘制这个场景不应该花费3秒钟。

然而,要回答这个问题:是的,你可以这样做。

您要渲染到屏幕外帧缓冲区(FBO),您甚至可以在具有单独共享上下文的另一个线程上执行此操作,因此它不会阻止GUI。然后,GUI将使用最近渲染的FBO进行绘制(您可以对这些FBO进行双重缓冲,以便在使用旧的FBO进行显示时可以绘制另一个)。然后,您可以以完全交互式帧速率平移和缩放渲染的FBO。当然,你不能比你渲染的那样向上/向下/向左/向右平移,如果放大太多(超过1.5倍或2倍),事情就会变得模糊。但这是可以完成的。此外,如另一个答案中所述,您的视点或几何图形或阴影无法更改,就像在固定照片中移动一样。