是否可以比屏幕刷新率更快地进行GPU加速3D渲染?
可以用OpenGL做到吗?如果是,如果不使用什么工具?
注意
因为我希望渲染比屏幕刷新率更快,所以我不介意没有输出到屏幕。事实上,没有输出窗口将是一个优势。
我将以编程方式(例如通过glReadPixels
)使用渲染输出,或者输出到文件作为视频供人类稍后观看。
为什么我要这样做
我想用计算机模拟计算机视觉的机器人。模拟机器人将有一个虚拟相机来观察这个世界,并将根据相机输入采取行动。因此,我希望模拟尽可能快地运行,忽略屏幕刷新率。
答案 0 :(得分:7)
是的,使用OpenGL肯定是可行的。渲染速率与屏幕刷新率无关(这就是为什么你可以看到以500 FPS等运行的演示)。
对于机制,您可以渲染到屏幕外的帧缓冲区,并将生成的图像读回主存储器。然后,您可以随意处理/分析它。参见:
答案 1 :(得分:1)
使用OpenGL执行此操作时,我只需将glutSwapBuffers
回调函数末尾的display
替换为glFlush
,这样我就可以从60FPS到600FPS简单的场景。
glutSwapBuffers
确保显示每个计算的帧,因此在刷新屏幕之前停止程序,此时它将后缓冲区放入前缓冲区,这可以在屏幕上看到。
glFlush
仅确保已计算场景并使用新场景更新后备缓冲区(在屏幕上无法看到)。因此,新场景计算仅在呈现新场景之前停止。 glutSwapBuffers
来电
在交换缓冲区之前glFlush
以确保已经计算了场景。
注意强>
在我的应用程序中,glReadPixels
允许我正确读取像素,即使没有glutSwapBuffers
,所以它正在从后备缓冲区读取。
glReadPixels
来检索700像素会有很大的性能损失:FPS下降到200FPS。我猜这是因为后备缓冲区必须位于GPU内存的某个位置(请更正/确认),glReadPixels
正在执行GPU - > CPU通信,这是非常昂贵的。
这意味着无论渲染计算速度多快,我的应用程序仍然会在200FPS下出现瓶颈,除非我长大并学习如何在GPGPU上进行处理并从那里访问后备缓冲区。