使用OpenGL绘制到另一个应用程序窗口

时间:2012-02-16 07:44:20

标签: c++ opengl

在我的程序中,我必须运行另一个应用程序(使用OpenGL绘制内容)并绘制它。

如何在Windows或Qt中执行此操作?

有解决方案的文章,可以找到here

2 个答案:

答案 0 :(得分:0)

在Windows中只使用非常模糊和脏的黑客。我不推荐它。 Qt只是一个框架,它取决于底层操作系统。在Windows上,Windows的所有约束都适用。

在X11上,您可以通过两种模式创建OpenGL上下文: direct indirect (请参阅glXCreateContext和glXCreateNewContext的 direct 参数)。间接上下文可以在X客户端之间共享,因为对于X服务器,没有进程或不同的客户端。只有XID,OpenGL上下文就是其中之一。这允许您在连接到同一X显示的进程之间传递间接OpenGL上下文的XID。直接上下文绕过GLX协议,因此无法共享。

答案 1 :(得分:0)

  

运行另一个应用程序(使用OpenGl绘制smth),然后绘制它。

     

获取此程序绘制的图像(通过opengl),将其用作纹理,进行一些变换并替换原始图像。

这是两个相当不同的事情。根据进一步的澄清,“最简单”和“最干净”的方式(如果你可以称之为,根本就可以称之为你想要的那样)就是挂钩wglSwapLayerBuffers似乎是内部调用SwapBufferswglSwapBuffers,您需要确认或挂钩所有三个)。

然后您拥有一个有效的上下文句柄,并且在交换缓冲区时,您确定(必然!)帧缓冲内容有效且一致,不存在半绘制基元。因此,没有什么阻碍你回读前面或后面的缓冲区(或两者!),在它上面运行一些内核,并在将控制权返回给应用程序之前将其写回来。

由于上下文句柄仅对进程有效,因此唯一能够可靠地正常工作并且没有一些非常讨厌的黑客(比这更糟糕)的方法是插入假的{{ 1}},就像GLIntercept等工具一样 您也可以从迷你调试器“窃取”手柄,但它对您的过程无效,所以没用。

但是......就像datenwolf说的那样:只是不要这样做。

相关问题