2014-02-24 186 views
1

Mac OS X中有任何方法可以在進程之間共享OpenGL幀緩衝區嗎?也就是說,我想在一個進程中渲染到屏幕外的目標,並將其顯示在另一個進程中。在Mac OS X的進程之間共享OpenGL幀緩衝區

你可以通過在共享模式下創建一個表面(一個OpenGL framebuffer的DXGI等效物),獲取該表面的不透明句柄,通過任何方式將它傳遞給另一個進程,從而在Windows中使用DirectX(實際上是DXGI)就像在另一個進程中創建一個表面,但是傳入現有的句柄。您可以在一個進程中將該表面用作渲染目標,然後將其用作另一個進程中的紋理以根據需要進行消耗。事實上,整個合成窗口系統從Vista開始就是這樣工作的。

如果這是不可能的,我當然可以獲取framebuffer的內容到系統內存中,並使用跨進程共享內存將其傳送到目標進程,然後再從那裏上傳它,但這是不必要的慢。

回答

2

取決於你真正想要做此示例代碼項目可能是你想要什麼: MultiGPUIOSurface sample code

+0

看起來就像票。我沒有意識到IOSurface API,但它看起來就像我想要的一樣(在進程之間共享GPU內存中的圖像)。順便說一句,因爲花了一分多鐘才發現,API文檔在這裏https://developer.apple.com/library/mac/documentation/Miscellaneous/Reference/IOSurfaceAPI_header_reference/Reference/reference.html#//apple_ref/doc/UID/TP40011198 – U62

0

它真的取決於你如何使用它的上下文。可以在上下文之間共享

對象包括(除了紋理對象 名爲零)緩衝器對象, 程序和着色的目的,渲染對象,取樣目的, 同步對象,紋理對象。

其中一些對象可能包含 部分或全部另一個對象的數據存儲的視圖(備用解釋)。示例是緩衝區對象,其中包含緩衝區對象的數據存儲的視圖, 和紋理視圖,其中包含另一個紋理對象的 數據存儲的視圖。視圖充當其數據存儲爲 的對象的參考。

包含對其他對象的引用的對象包括framebuffer, 程序管道,查詢,變換反饋和頂點數組對象。 這種對象稱爲容器對象,不共享。

Chapter 5/OpenGL-4.4 core specification

你可以做在Windows上的東西,而不是原因OS X是顯卡顯然利用了API,允許DirectX的環境對那些在進程間共享。如果OS X在OpenGL API中沒有能力,那麼你將不得不提出你自己的解決方案。看看OpenGL Programming Guide for Mac,有一小部分描述了使用多個OpenGL上下文。

enter image description here

+0

葉,我看到了有關在不同的線程上下文之間共享對象的文檔同樣的過程。我只是希望有一些記錄不完善的方法可以在整個流程中進行。 AFAIK,OS X的窗口合成系統的工作方式與Windows相同,所以希望在OpenGL的某個層次上,至少有一種方法可以將GPU設備內存寫入存儲器副本,而不必將圖像帶回系統記憶。 – U62

相關問題