Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt MDI应用程序与OpenGL:如何抓取有效的屏幕截图?_Qt_Opengl_Screenshot_Mdi_Shader - Fatal编程技术网

Qt MDI应用程序与OpenGL:如何抓取有效的屏幕截图?

Qt MDI应用程序与OpenGL:如何抓取有效的屏幕截图?,qt,opengl,screenshot,mdi,shader,Qt,Opengl,Screenshot,Mdi,Shader,我有一个用Qt编写的应用程序。一些子窗口包括QGLWidgets,即OpenGL上下文。其中最突出的是使用OpenGL顶点和片段着色器来可视化其数据 我需要以编程方式捕获应用程序主窗口的屏幕截图,当然包括所有碰巧可见的子窗口。一开始听起来很简单(“肯定被问了很多次,所以让我们用谷歌搜索一下吧!”),但仔细观察之后,似乎有点棘手 现在我已经试过了: 不适用于使用着色器程序的子窗口,显然是因为重定向上下文似乎不支持必要的OpenGL扩展。(呈现代码检查关联的上下文是否支持所需的扩展,如果不支持,则拒

我有一个用Qt编写的应用程序。一些子窗口包括
QGLWidget
s,即OpenGL上下文。其中最突出的是使用OpenGL顶点和片段着色器来可视化其数据

我需要以编程方式捕获应用程序主窗口的屏幕截图,当然包括所有碰巧可见的子窗口。一开始听起来很简单(“肯定被问了很多次,所以让我们用谷歌搜索一下吧!”),但仔细观察之后,似乎有点棘手

现在我已经试过了:

  • 不适用于使用着色器程序的子窗口,显然是因为重定向上下文似乎不支持必要的OpenGL扩展。(呈现代码检查关联的上下文是否支持所需的扩展,如果不支持,则拒绝继续。)
  • 静默地将所有OpenGL上下文保留为空——即使是那些仅使用基本原语的上下文
  • 可以工作,但只捕获特定子窗口的OpenGL上下文,而我想获取整个应用程序(基本上就是Windows中的
    Alt+PrtScr
    所做的)
  • 我还尝试先做#2,然后对所有子窗口迭代#3,只是将#3的结果从#2复制到图像的正确位置。这非常有效,直到我使一些子窗口重叠——在这种情况下,来自#3的图像覆盖子窗口帧,等等。因此,这种方法可能需要更多的代码来处理所有令人讨厌的角落情况

    一些额外的背景:一旦我得到了截图,我将把其中的几个放在一个序列中,以便创建一个视频——可能使用。这使得这个问题是对(第一部分)的一种延续;只是这个应用程序已经从一个单一的上下文独立的OpenGL程序发展到使用Qt进行整体窗口和UI小部件的东西,并将图形嵌入到子窗口中

    当然,我更喜欢一个好的,QT的跨平台解决方案,我也愿意考虑使用一个Windows特定的黑客攻击。(这应该是可能的,因为我可以看到
    Alt+PrtScr
    做了非常正确的事情。)


    那么,有什么建议吗?

    非常粗糙,但是像这样捕获桌面(不隐藏窗口)并裁剪除窗口以外的所有内容是否有效

    更一般地说,我甚至不确定OpenGL规范是否要求输出必须放在前缓冲区:一个实现可以只使用视频叠加(或伏都教式VGA穿越骗局)作为输出。

    这有什么用吗??

    我能想到的唯一一件事就是立即执行以下伪代码:

     for each window
         grab the window into its own pixmap
         grab the GL portions and paste into the windows
     order the window pixmaps by depth of the window (deepest first)
     initialize a common pixmap
     for each window pixmap
         paint the window pixmap into the common pixmap at the appropriate location.
    

    它确实有用!为什么我自己不能想到这个呢。。。我看到的唯一缺点是,与只抓住感兴趣的窗口相比,这基本上要慢一些。这可能是相关的,因为我实际上是想抓拍一段视频。但我还是接受了答案,因为它完全符合我的要求——非常感谢!它使用grabFrameBuffer(),因此仅捕获OpenGL视口。见问题中的第#3项。我同意这应该有效,因此+1。但至少现在,我要走懒惰的道路:)