2013-03-21 85 views

回答

0

我编程该C代码来捕捉的Mac的屏幕,并通过功能glDrawPixels到它显示了在OpenGL窗口:

OpenGL的的capture.c

http://pastebin.com/pMH2rDNH

编码的Haskell的FFI是相当微不足道的。我会很快做到的。

2

如何捕获屏幕...和OpenGL?

只有一些运气。 OpenGL主要是一个绘图API,主帧缓冲区的内容是未定义的,除非它是由OpenGL函数自己绘制的。 OpenGL可能会被滥用是由于图形系统管理其屏幕窗口的帧缓冲区的方式:在没有预定义背景颜色/画笔的窗口被创建之后,其初始帧缓冲区内容就是窗口之前屏幕上的所有内容创建。如果在此之上创建了OpenGL上下文,则可以使用glReadPixels读取帧缓冲区,这样就可以创建屏幕截图。

今天窗口合成已经成为滥用OpenGL截图几乎不可能的常态。通过合成,每个窗口都有自己的屏幕外帧缓冲区,屏幕内容仅在最后合成。如果您在合成窗口系统上使用了上述依赖于包含所需内容的未初始化内存的方法,则结果将在固体清晰颜色,严重扭曲的垃圾碎片与数据噪声之间变化很大。

由于可靠地截图必须考虑到这种情况发生的系统特性,因此实际上不可能编写出真正的便携式屏幕截图程序。

而OpenGL绝对是它的错误工具,无论人们(包括我自己)在过去能否滥用它。

+0

那么,OpenGL会返回与GTK一样的黑屏吗?你在Mac上测试过一些代码吗? – 2013-03-21 15:44:51

+0

@JuanCarlosKuriPinto:Macs是棘手的怪兽,因为OpenGL深深扎根于操作系统,依靠未定义的OpenGL行为意味着依赖于未定义的操作系统。此外,GTK +示例返回黑色屏幕的原因与OpenGL的未定义行为相同:使用WM合成窗口DC的内容(无论是DC还是DC),将不包含屏幕上可见的图像。 – datenwolf 2013-03-21 23:53:44

-2

这可能是有用的,发现在C解决方案:

讷河制作 - 使用gluUnProject
http://nehe.gamedev.net/article/using_gluunproject/16013/

苹果邮件列表 - 回复:屏幕快照示例代码发布
http://lists.apple.com/archives/cocoa-dev/2005/Aug/msg00901.html

编译Windows,Linux和OS X上的OpenGL程序
http://goanna.cs.rmit.edu.au/~gl/teaching/Interactive3D/2012/compiling.html

Grab Mac OS Screen using GL_RGB format

+0

gluUnProject是如何帮助抓取* screenshot *的。这不是一个好的答案,即使它是错误的问题。 – datenwolf 2013-03-21 17:37:10

+0

该链接解释了如何以正确的方式使用glReadPixels来捕获特定位置上单个像素的颜色。例如:鼠标的位置。 – 2013-03-21 22:24:08

+0

但这不是OP要求的。 OP想要使用OpenGL来制作屏幕截图,即不是只读回使用OpenGL渲染的内容,而是在整个显示器上看到的内容。不需要重新计划某个位置,也不能解决OP的问题。也就是说,OpenGL不是这方面的正确工具。并且您发布的最后一个链接描述了一种技术,该技术依赖于未定义的行为,这会破坏其在合成窗口管理器系统上的运行。 – datenwolf 2013-03-21 23:49:25