Reu*_*nen 5 opengl shader qt mdi screenshot
我有一个用Qt编写的MDI应用程序.一些子窗口包括QGLWidgets,即OpenGL上下文.其中最突出的是使用OpenGL顶点和片段着色器来可视化其数据.
我需要以编程方式捕获应用程序主窗口的屏幕截图,当然包括碰巧可见的所有子窗口.起初听起来很容易("肯定已被多次询问过,所以我们只是谷歌吧!"),但经过仔细研究后看起来似乎有点棘手......
现在这是我到目前为止所尝试的:
QPixmap::grabWidget对于使用着色器程序的子窗口不起作用,显然是因为重定向上下文似乎不支持必要的OpenGL扩展.(呈现代码检查关联的上下文是否支持所需的扩展,如果不支持则拒绝继续.)QPixmap::grabWindow 默默地将所有OpenGL上下文留空 - 即使只使用基本原语的那些.QGLWidget::grabFrameBuffer工作,但只捕获特定子窗口的OpenGL上下文,而我想抓住整个应用程序(基本上是Alt+PrtScr在Windows中).我还尝试先做#2,然后对所有子窗口迭代#3,只需将#3的结果复制到#2的图像的正确位置.这非常有效,直到我做了一些子窗口重叠 - 在这种情况下,来自#3的图像覆盖子窗口框架等等.所以这种方法可能需要更多的代码来处理所有令人讨厌的角落情况......
一些额外的背景:一旦我得到截图,我将把它们中的几个放在seqence中以创建视频 - 可能使用ffmpeg.这使得这个问题成为我上一个问题(前一部分)的延续; 只是该应用程序已从单一上下文独立OpenGL程序演变为使用Qt进行整体窗口和UI窗口小部件的东西,并将图形嵌入子窗口.
虽然我当然更喜欢一个不错的Qt-ish跨平台解决方案,但我也愿意考虑采用特定于Windows的黑客攻击.(这应该是可能的,因为我可以看到Alt+PrtScr做了非常正确的事情.)
那么,有什么建议吗?
非常黑客,但是像本教程中那样捕获桌面(不隐藏窗口)并裁剪除窗口之外的所有内容是否有效?
更一般地说,我什至不确定 OpenGL 规范是否要求输出必须放置在前缓冲区中:实现可以仅使用视频覆盖(或 Voodoo2 式 VGA 直通恶作剧)进行输出。