在我的应用程序中,我出于两个目的对 QGLWidget 的内容进行快照:
- 当只有叠加层发生变化时,不要一直重绘场景,而是使用缓存的像素图
- Lat 用户截取特定情节的屏幕截图(3D 场景)
我尝试的第一件事是grabFrameBuffer()
。对于第一个应用程序使用此功能是很自然的,小部件中当前可见的正是我要缓存的内容。
问题:在某些硬件上(例如 Intel 集成显卡、带有 GeForce 显卡的 Mac OS X),获得的图像不包含当前屏幕内容,而是之前的内容。因此,如果场景将被绘制两次,在屏幕上您会看到第二张图,在图像中您会看到第一张图(应该是后缓冲区的内容?)。
我尝试的第二件事是renderToPixmap()
。这呈现使用paintGL()
,但不使用paint()
。我有我所有的东西paint()
,因为我使用 Qt 的绘画功能,并且只有一小部分代码使用本机 GL ( beginNativePainting()
, endNativePainting()
)。
我还尝试了常规 QWidget 的快照功能(QPixmap::fromWidget(),或者它的名称),但是 GL 帧缓冲区是黑色的。
关于如何解决问题并获得当前绘制场景的可靠描述的任何想法?