5

在我的应用程序中,我出于两个目的对 QGLWidget 的内容进行快照:

  • 当只有叠加层发生变化时,不要一直重绘场景,而是使用缓存的像素图
  • Lat 用户截取特定情节的屏幕截图(3D 场景)

我尝试的第一件事是grabFrameBuffer()。对于第一个应用程序使用此功能是很自然的,小部件中当前可见的正是我要缓存的内容。 问题:在某些硬件上(例如 Intel 集成显卡、带有 GeForce 显卡的 Mac OS X),获得的图像不包含当前屏幕内容,而是之前的内容。因此,如果场景将被绘制两次,在屏幕上您会看到第二张图,在图像中您会看到第一张图(应该是后缓冲区的内容?)。

我尝试的第二件事是renderToPixmap()。这呈现使用paintGL(),但不使用paint()。我有我所有的东西paint(),因为我使用 Qt 的绘画功能,并且只有一小部分代码使用本机 GL ( beginNativePainting(), endNativePainting())。

我还尝试了常规 QWidget 的快照功能(QPixmap::fromWidget(),或者它的名称),但是 GL 帧缓冲区是黑色的。

关于如何解决问题并获得当前绘制场景的可靠描述的任何想法?

4

4 回答 4

2

如何获取可靠的 QGLWidget 快照

将当前场景渲染到帧缓冲区,将数据从帧缓冲区保存到文件。或者在 glFlush 之后获取当前的后缓冲。其他任何东西都可能包括伪影或不完整的场景。

于 2012-05-04T23:20:37.513 回答
2

似乎 QGLWidget::grabFrameBuffer() 在内部从 OpenGL 调用 glReadPixels() 。在双缓冲配置中,初始模式读取后台缓冲区(GL_BACK),使用 OpenGL 调用 glReadBuffer(GL_FRONT) 切换到前台缓冲区,然后使用 QGLWidget::grabFrameBuffer() 在屏幕上显示图像。

于 2014-08-16T18:56:25.373 回答
1

的结果QGLWidget::grabFrameBuffer(),就像所有其他 OpenGL 调用一样,取决于视频驱动程序。Qt 只是将您的调用转发给驱动程序并获取它返回的图像,但图像的内容不受 Qt 的控制。除了确保您已经为您的显卡安装了最新的驱动程序之外,除了向您的显卡制造商报告错误并祈祷之外,您无能为力。

于 2012-05-04T00:05:06.717 回答
0

我使用paintGL();and glFlush(); 使用前grabFrameBuffer()。paintGL 有助于在抓取帧缓冲区之前再次绘制当前帧,这会精确复制当前显示的内容。

于 2013-01-06T22:03:38.057 回答