2013-03-21 96 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

相關問題