我正在编写一个显示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);
}
答案 0 :(得分:5)
我正在编写一个显示500万个矩形的程序,使用OpenGL进行渲染。它需要约。 3秒钟在屏幕上显示这些矩形。
这听起来像是以非常低效的方式发送绘图命令。现代GPU能够每秒渲染数亿个三角形。我的猜测是,你正在使用即时模式。
我想知道是否有办法将所有内容保存到内存/缓冲区中,因此屏幕不必一遍又一遍地重绘。
缩放通常意味着改变观点或渲染分辨率,因此需要完全重绘。
我也对其他解决方案持开放态度。谢谢。
您应优化绘图代码。关键字是:
答案 1 :(得分:0)
我同意绘制这个场景不应该花费3秒钟。
然而,要回答这个问题:是的,你可以这样做。
您要渲染到屏幕外帧缓冲区(FBO),您甚至可以在具有单独共享上下文的另一个线程上执行此操作,因此它不会阻止GUI。然后,GUI将使用最近渲染的FBO进行绘制(您可以对这些FBO进行双重缓冲,以便在使用旧的FBO进行显示时可以绘制另一个)。然后,您可以以完全交互式帧速率平移和缩放渲染的FBO。当然,你不能比你渲染的那样向上/向下/向左/向右平移,如果放大太多(超过1.5倍或2倍),事情就会变得模糊。但这是可以完成的。此外,如另一个答案中所述,您的视点或几何图形或阴影无法更改,就像在固定照片中移动一样。