【问题标题】:Possible to draw OpenGL HUD overlay over a different application's window (without flickering)?可以在不同应用程序的窗口上绘制 OpenGL HUD 叠加层(不闪烁)?
【发布时间】:2013-11-08 13:32:10
【问题描述】:

我需要在另一个应用程序的顶部绘制由线条和文本组成的叠加层。有问题的应用程序是 3D 外部世界视点,而覆盖是平视显示器。

我无法访问来自外部世界应用程序的任何类型的回调来在其绘制循环中执行绘制代码。

直接在应用程序的窗口上绘图会导致闪烁,因为绘图循环不会同步,所以对我来说这似乎不是一个选项。

我能想到的一种方法是捕获外部世界应用程序的像素并将它们流式传输到我的应用程序中,这样我就可以在同一个绘制循环中在顶部绘制叠加层,但这似乎非常低效。

有没有一种有效的方法可以在不闪烁的情况下绘制外部世界应用程序?

是否可以在最终的显卡输出上/以显示器的刷新率绘制一些东西?

附:它不一定是 OpenGL,但 HUD 已经用 OpenGL 编写,所以它会更容易。

【问题讨论】:

  • 只是问,但为什么要在另一个应用程序之上渲染,为什么不在同一个应用程序和同一个渲染循环中同时渲染 3D 世界和 HUD?
  • 您想看看像 steam、teampeak、mumble 等应用程序的做法。我相信他们劫持了一些 GL 调用以找出交换缓冲区何时发生并注入他们自己的调用。再次猜测,但这涉及在用您自己的覆盖之前保存实际函数调用的内存位置。那么你自己的函数就是一个代理,当目标应用程序试图调用真正的函数时,它可以做它想做的任何事情。
  • 我们曾经这样做过,但是编写 3D 世界代码的公司部门放弃了对允许我们在同一个应用程序中绘图的支持。所以现在它是一个独立的应用程序,但它仍然需要我们使用它的 HUD 覆盖。去图...
  • @jozxyqk:天才。不久前我写了一个 DLL,它劫持了一些 WinAPI 调用来解决类似的情况。我不知道为什么我没有为此想到这种技术。谢谢,这应该可以解决问题!把它作为一个答案,我会接受的。

标签: windows opengl


【解决方案1】:

重复我在 cmets 中所说的话,我遇到了很多劫持 3D api 调用并注入自己的代码以在每一帧末尾绘制内容的应用程序 - steam、teampeak、mumble。由于它在同一个应用程序中,因此没有闪烁,您可以直接绘制,而不是将结果复制到某处并合成。我以前从未做过,可能不会很好地解释它。

这里有一个相关问题:Overlaying on a 3D fullscreen application

【讨论】:

  • 你解释得很好。我完全知道怎么做你描述的,我只是没想到这样做!谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-12
  • 1970-01-01
  • 2012-06-21
  • 1970-01-01
  • 1970-01-01
  • 2021-02-21
  • 1970-01-01
相关资源
最近更新 更多