【发布时间】:2013-11-08 13:32:10
【问题描述】:
我需要在另一个应用程序的顶部绘制由线条和文本组成的叠加层。有问题的应用程序是 3D 外部世界视点,而覆盖是平视显示器。
我无法访问来自外部世界应用程序的任何类型的回调来在其绘制循环中执行绘制代码。
直接在应用程序的窗口上绘图会导致闪烁,因为绘图循环不会同步,所以对我来说这似乎不是一个选项。
我能想到的一种方法是捕获外部世界应用程序的像素并将它们流式传输到我的应用程序中,这样我就可以在同一个绘制循环中在顶部绘制叠加层,但这似乎非常低效。
有没有一种有效的方法可以在不闪烁的情况下绘制外部世界应用程序?
是否可以在最终的显卡输出上/以显示器的刷新率绘制一些东西?
附:它不一定是 OpenGL,但 HUD 已经用 OpenGL 编写,所以它会更容易。
【问题讨论】:
-
只是问,但为什么要在另一个应用程序之上渲染,为什么不在同一个应用程序和同一个渲染循环中同时渲染 3D 世界和 HUD?
-
您想看看像 steam、teampeak、mumble 等应用程序的做法。我相信他们劫持了一些 GL 调用以找出交换缓冲区何时发生并注入他们自己的调用。再次猜测,但这涉及在用您自己的覆盖之前保存实际函数调用的内存位置。那么你自己的函数就是一个代理,当目标应用程序试图调用真正的函数时,它可以做它想做的任何事情。
-
我们曾经这样做过,但是编写 3D 世界代码的公司部门放弃了对允许我们在同一个应用程序中绘图的支持。所以现在它是一个独立的应用程序,但它仍然需要我们使用它的 HUD 覆盖。去图...
-
@jozxyqk:天才。不久前我写了一个 DLL,它劫持了一些 WinAPI 调用来解决类似的情况。我不知道为什么我没有为此想到这种技术。谢谢,这应该可以解决问题!把它作为一个答案,我会接受的。