I would like to add particular effects directly on the screen (first on ubuntu 12.04), for example i would like to code a c++ deamon that would be able (for example) to blur all my screen in real-time. One should be able to move his mouse, read text, browse the internet but everything stills blurry. I've read that the task should be to access and modify the screenbuffer. Is that true ? Am I looking the wrong way using OpenGL ?
2 回答
您需要使用合成管理器,例如Compiz,它通过 OpenGL 重新路由所有绘图并允许您做各种花哨的事情。
比如Ubuntu自带的可以让雨滴落在你的屏幕上,可以通过Compiz设置管理器开启。
但是,如果您是 OpenGL 新手,我不建议您深入研究。首先了解基本的绘制调用,然后处理着色器。您可能还需要了解 X。
我想直接在屏幕上添加特定效果(首先在 ubuntu 12.04 上),例如,我想编写一个能够(例如)实时模糊我的所有屏幕的 c++ 守护程序。一个人应该能够移动他的鼠标、阅读文本、浏览互联网,但一切仍然是模糊的。
这称为合成效果,通常作为合成器的插件实现
我读过任务应该是访问和修改屏幕缓冲区。
在现代操作系统上,您无法直接访问屏幕缓冲区。所以这行不通。
真的吗?
不,或者实际上非常不准确。
我是不是用 OpenGL 找错了方向?
不,你正在寻找正确的方向。
让我解释一下:在过去,您的屏幕由一个大型帧缓冲区组成,所有应用程序都共享该缓冲区。但是为了保护应用程序免受彼此的影响,它们不能直接访问该帧缓冲区。相反,他们使用图形/窗口系统,在 Linux 的情况下,传统上是 X11(现在还有另一个系统正在开发中,但坦率地说,我非常讨厌它的设计)、Windows 上的 GDI 和 MacOS X 上的 Quartz。
图形系统注意窗口的绘制操作最终会在屏幕缓冲区的正确位置结束,并且会被窗口几何图形和屏幕上的其他窗口正确裁剪和遮挡。每当调整窗口大小或之前被遮挡的部分暴露时,都会发送一条消息以重绘这些部分。只需移动一个窗口就可以通过缓冲区内位传输来实现。
随着现代 GPU 及其本地帧缓冲内存模型的出现,这种管理窗口的旧方式已不合时宜。现在您可以为每个窗口提供其自己的独立帧缓冲区。只有在调整窗口大小时才需要强制重绘;不再有会损坏 Windows 内容的遮挡。
但是要使这个模型工作,您需要一些程序来获取包含窗口内容的那些单独的、单独的帧缓冲区,并将它们合成到屏幕缓冲区上的单个图像中,呈现给用户。这是由合成器完成的。而且因为合成可能发生在任何可用的绘图 API 上,你也可以使用 OpenGL 并在这样做的同时应用疯狂的效果。