【发布时间】:2013-10-11 13:08:58
【问题描述】:
我正在尝试查看是否/如何制作一个 windows(甚至是 mac/linux)应用程序,该应用程序将发布处理屏幕上的所有内容。如果可能的话,我希望能够使用 glsl 着色器对屏幕上的所有内容执行颜色反转和 sobel 过滤等操作。有谁知道如何做到这一点?
【问题讨论】:
-
既然您正在讨论可移植地执行此操作,我认为您将需要考虑在许多窗口管理器中处理表面的方式。在合成窗口管理器中(大多数新的都属于这一类),当交换前/后缓冲区时,窗口管理器使用后缓冲区表面的副本通过使用 OpenGL 或 D3D 等传统 API 来制作精美的 3D 效果。不幸的是,在 Windows 中,DWM 不会直接暴露它使用的表面,您可以使用公共 API 做的最好的事情是为应用程序中的任意窗口获取缩略图。
-
有一些未记录的 DWM API 调用可能会对您有所帮助,即
UpdateWindowShared (...)和GetSharedSurface (...)。我知道至少有一种商业产品实际使用了这些,并且您可能会在网上找到一些成功使用 API 中未记录部分的人的示例,但主要问题是您最终会得到一个 D3D 表面,即互操作。可能会使在 OpenGL 中执行此操作变得困难。
标签: c++ windows opengl glsl fullscreen