OpenGL:如何在屏幕上添加效果

时间:2012-07-03 13:49:25

标签: c++ opengl

我想直接在屏幕上添加特效(首先在ubuntu 12.04上),例如我想编写一个能够(例如)实时模糊我所有屏幕的c ++守护进程。一个人应该能够移动他的鼠标,阅读文本,浏览互联网,但一切仍然模糊。我已经读过,任务应该是访问和修改screenbuffer。真的吗 ? 我使用OpenGL看错了吗?

2 个答案:

答案 0 :(得分:2)

您需要使用合成管理器,例如Compiz,它通过OpenGL重新路由所有绘图,并允许您做各种奇特的事情。

例如,随Ubuntu一起提供的雨滴可以使雨滴落在您的屏幕上,可以通过Compiz settings manager开启。

但是,如果您是OpenGL的新手,我不建议深入研究。首先了解基本绘制调用,然后处理着色器。您可能还需要了解X.

答案 1 :(得分:1)

  

我想直接在屏幕上添加特效(首先在ubuntu 12.04上),例如我想编写一个能够(例如)实时模糊我所有屏幕的c ++守护进程。一个人应该能够移动他的鼠标,阅读文本,浏览互联网,但一切仍然模糊。

这称为合成效果,通常作为合成器的插件实现

  

我已经读过,任务应该是访问和修改屏幕缓冲区。

在现代操作系统上,您无法直接访问屏幕缓冲区。所以这不起作用。

  

这是真的吗?

没有。或者实际上非常不准确。

  

我使用OpenGL看错了吗?

不,你正在寻找正确的方向。

让我解释一下:在过去,您的屏幕由一个大型帧缓冲区组成,所有应用程序共享。但是为了保护应用程序彼此无法直接访问该帧缓冲区。相反,他们使用图形/窗口系统,在Linux的情况下,传统上是X11(现在还有另一个正在开发的系统,但坦白地说,我深深地讨厌它的设计),Windows上的GDI和MacOS X上的Quartz。

图形系统注意到对窗口的绘制操作最终会在屏幕缓冲区的正确位置结束,并且会被窗口几何图形和屏幕上的其他窗口正确地剪切和遮挡。每当窗口被调整大小,或者之前被遮挡的部分被暴露时,就会发送一条消息来重绘这些部分。只需移动窗口就可以通过intrabuffer bitblitting实现。

随着现代GPU及其本地帧缓冲存储器模型的出现,这种管理Windows的旧方式变得不合时宜。现在,您可以为每个窗口提供自己独立的帧缓冲区。只有在调整窗口大小时才需要强制重绘;不再有遮挡会损坏窗口内容。

但是要使这个模型起作用,你需要一些程序来获取包含窗口内容的单独的,单独的帧缓冲区,并将它们合成到屏幕缓冲区中的单个图像中,呈现给用户。这是由合成器完成的。并且因为组合可能发生在任何可用的绘图API中,您也可以使用OpenGL并在这样做时应用疯狂的效果。