3
  • 是否可以比屏幕刷新率更快地进行 GPU 加速 3D 渲染?

  • 可以用OpenGL来做吗?如果是,如何,如果不是,使用什么工具?

笔记

因为我希望渲染速度快于屏幕刷新率,所以我不介意没有输出到屏幕。事实上,没有输出窗口将是一个优势。

我将以编程方式(例如通过)使用渲染输出glReadPixels,或者将其作为视频输出到文件供人们稍后观看。

我为什么要这样做

我想做计算机视觉机器人的计算机模拟。模拟机器人将有一个虚拟摄像头来观察这个世界,并将根据摄像头输入采取行动。因此,我希望模拟尽可能快地运行,而不考虑屏幕刷新率。

4

2 回答 2

7

是的,这绝对可以通过 OpenGL 实现。渲染率与屏幕刷新率无关(这就是为什么您可以看到以 500 FPS 等速度运行的演示)。

至于机制,您可以渲染到屏幕外帧缓冲区并将生成的图像读回主内存。然后,您可以随心所欲地处理/分析它。看:

于 2013-01-13T12:24:07.950 回答
1

要使用 OpenGL 来完成,我必须简单地将回调函数glutSwapBuffers末尾的displayglFlush

glutSwapBuffers确保显示每个计算的帧,因此在屏幕刷新之前停止程序,此时它将后缓冲区放入可以在屏幕上看到的前缓冲区。

glFlush另一方面,仅确保已计算场景并使用新场景更新后台缓冲区(在屏幕上看不到)。因此,新场景计算仅在新场景被渲染之前停止。glutSwapBuffers在交换缓冲区之前调用 glFlush以确保已计算场景。

笔记

在我的应用程序上,glReadPixels即使没有 ,我也可以正确读取像素glutSwapBuffers,因此它是从后缓冲区读取的。

然而,仅仅调用来检索 700 像素会有很大的性能损失glReadPixels:FPS 下降到 200FPS。我猜这是因为后备缓冲区必须位于 GPU 内存的某个位置(请更正/确认这一点),并且glReadPixels正在进行 GPU -> CPU 通信,这非常昂贵。

这意味着无论渲染计算的速度有多快,我的应用程序仍然会在 200FPS 时遇到瓶颈,除非我长大并学习如何在 GPGPU 上进行处理并从那里访问后台缓冲区。

于 2013-01-14T17:32:14.923 回答