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

How to zoom-in/out to an OpenGL screen without rendering the entire screen again

本文关键字:屏幕 OpenGL 放大 何放大 缩小 一个      更新时间:2023-10-16

我正在编写一个程序来显示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);
}

我正在写一个程序来显示500万个矩形,用OpenGL渲染。大约需要。3秒时间将这些矩形显示在屏幕上。

这听起来像是你在以一种非常低效的方式发送绘图命令。现代图形处理器每秒可以渲染数亿个三角形。我猜你正在使用立即模式。

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

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

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

你应该优化你的绘图代码。关键字是:

  • 顶点数组
  • 顶点缓冲对象
  • 大图纸批次

我同意画这个场景不应该花3秒钟。

然而,要回答这个问题:Yes, you can do that.

你会渲染到一个屏幕外的帧缓冲区(FBO),你甚至可以在另一个线程上做一个单独的共享上下文,这样它就不会阻塞GUI。然后,GUI将使用最近渲染的FBO进行绘制(您将对这些FBO进行双重缓冲,以便在使用旧的FBO进行显示时可以绘制另一个FBO)。然后你可以在渲染的FBO上以全交互帧率进行平移和缩放。当然,你不能比渲染时上下左右移动得更远,如果你放大太多(超过1.5倍或2倍),画面就会变得模糊。但这是可以做到的。此外,正如另一个答案所指出的,你的视角或几何或阴影不能改变,它就像在一张固定的照片中移动一样。