2011-06-18 55 views
2

所以我需要的是簡單的:想象一下,我們根本沒有gui - ssh訪問我們要構建和託管我們的應用的一些linux。該應用會生成視頻流。我們有一些SDL應用程序和OpenGL着色器。我們所需要的就是像char *(大小爲W * H * 3)那樣得到渲染(就像我們通常在SDL窗口中看到的那樣)如何做這樣的事情?如何使SDL不會將其渲染到gui窗口中,而是放入可交換的指針中?SDL 1.3:如何渲染視頻而不顯示它?

回答

2

您不能直接渲染到OpenGL中的字節數組。

有兩種方法來處理這個問題。第一種方法最簡單,不需要上下文噱頭,第二種方法。

首先,簡單的方法。

爲了使OpenGL正常工作,您需要有一個窗口。這並不意味着該窗口需要可見,但您需要創建一個才能獲得有效的OpenGL上下文。因此第1步:創建一個窗口並將其最小化。

現在,爲了獲得有效的渲染,幀緩衝區中的像素必須通過「像素所有權測試」。渲染到保存屏幕本身的幀緩衝區時,屏幕上實際看不到的像素會使像素所有權測試失敗。因此,如果您使用glReadPixels,那麼這些像素的值是不確定的。

但是,這隻適用於與窗口關聯的默認幀緩衝區。幀緩衝區對象總是通過像素所有權測試。因此,第2步:根據需要創建幀緩衝區對象和相關的渲染緩衝區。

從那裏,它非常簡單。只需正常渲染,然後在想要獲取數據時執行glReadPixels。 Pixel buffer objects可用於異步傳輸像素數據,如果性能是一個問題。 第3步:渲染並使用glReadPixels獲取數據。


第二種方法是更廣泛地提供(宗教組織需要擴展支持或OpenGL 3.0),但特定於平臺的更多。

而不是在步驟2中創建一個FBO,而是你有步驟2:使用glXCreatePbuffer創建一個pbuffer。 pbuffer是一個屏幕渲染目標,其行爲與默認幀緩衝區相同。您glXMakeContextCurrent告訴OpenGL渲染到pbuffer而不是默認的幀緩衝區。

步驟1和3與上面相同。

3

任何使用OpenGL都應該是硬件加速的,所以首先檢查你的服務器是否有符合你的要求的GPU。如果您在租用的虛擬服務器或某個標準的根服務器上,那麼您很可能沒有GPU。

如果你有一個GPU,則有兩種可能的方法:


方法1 - 簡單的一個

你會(很遺憾)必須配置和啓動X它的服務器這個X服務器也必須是當前的虛擬終端(即它必須是顯卡上的主動事物)。然後,您將讓正在運行該視頻生成器的用戶訪問該X顯示器(請參閱man xauth及其參考內容)

下一步是獨立於SDL,它是OpenGL認爲的:創建一個Framebuffer對象,呈現期望的圖形;一個PBuffer也會工作,實際上我更喜歡這種情況,但是我發現Framebuffer Objects比當前Linux及其驅動程序上的PBuffers更可靠。

然後渲染此幀緩衝區對象或p緩衝器和往常一樣和檢索使用內容glReadPixels


方法2 - 靈活的一個

在較低水平,這是非常相似的方法1,但事情會爲你抽象:獲取VirtualGLhttp://www.virtualgl.org/在GPU上執行實際的OpenGL渲染。您不必在輔助X服務器上啓動應用程序,而是直接使用提供的發送GLX流並獲取JPEG圖像流的VirtualGL服務器。您也可以使用運行虛擬幀緩衝區的輔助X服務器並持續捕捉該幀。或者可能是最優雅的:編寫自己的X.Org視頻驅動程序,將視頻直接傳送到視頻流。