2013-01-10 63 views
6

我有一個任務來實現在C++窗口和Linux的離線OpenGL渲染器。我有這樣一個版本已經用Java編寫,使用LWJGL lib.There我使用了PBuffer對象,首先我想重新實現完整的PBuffer創建邏輯,就像我在LWJGL的本地源代碼中完成的一樣。然後,我在StackOverflow.com上閱讀this文章,其中建議使用標準上下文創建,我們假設使用GLFW(這是跨平臺的),但不是創建實際的窗口。它是正確的路要走嗎?在這種情況下使用Pbuffer有什麼優點和缺點?創建跨平臺OpenGL離屏上下文

更新: 我只是想強調的是,我使用的FBO來渲染幀所以在這裏我的問題不在於如何渲染屏幕外的模式,但沒有如何在Windows和Linux操作系統窗口創建上下文。

回答

5

我強烈建議不要再使用PBuffers,而是使用Frame Buffer Objects (FBOs)代替。 FBO提供更好的性能,因爲使用它們不需要上下文切換,並且它們具有several other advantages

LWJGL supports FBOs,但GLFW對OpenGL和not for rendering的跨平臺設置是「正義」。爲了方便跨平臺的FBO使用,我建議在GLFW之上使用像OGLplus這樣的庫。有關渲染到紋理的示例,請參閱here

+0

這是對的,我假設使用FBO。但FBO不會創建GL環境,這就是爲什麼我問這個問題。 –

+0

如果您想要硬件加速,至少在Windows上,您不能創建一個OpenGL上下文,而無需先創建(隱藏)窗口。這是因爲[wglCreateContext](http://msdn.microsoft.com/en-us/library/windows/desktop/dd374379(v = vs.85).aspx)需要Device Context(DC),並且只有一個窗口的DC可以分配硬件加速像素格式。尤其是,[無法使用硬件加速OpenGL將其渲染到內存DC中](http://www.opengl.org/discussion_boards/showthread.php/161374-Why-can-ti-write-to-a-memory-device -context p = 1143832&viewfull = 1#post1143832)。 – sschuberth

+0

那麼你是說LWJGL中的Windows版本的PBuffer會創建窗口,然後刪除它? –

0

據我所知,沒有跨平臺的方式來創建上下文,您將不得不創建自己的抽象,然後爲每個平臺實現它。

在Windows下我用下面的代碼來創建第二個方面做的內容加載在後臺線程(使用GLFW這個計劃,但認爲不應該的問題):

void Program::someFunction() 
{ 
    HDC hdc = wglGetCurrentDC(); 
    HGLRC hglrc = wglGetCurrentContext(); 
    HGLRC hglrc_new = wglCreateContext(hdc); 
    wglShareLists(hglrc, hglrc_new); 
    loadThread = boost::thread(&Program::loadFunc, this, hdc, hglrc_new); 
} 

/** 
* Imports all our assets. Supposed to run in its own thread with its own OpenGL context. 
* @param hdc The current device context. 
* @param hglrc A OpenGL context thats shares its display list with the main rendering context. 
*/ 
void Program::loadFunc(HDC hdc, HGLRC hglrc) 
{ 
    wglMakeCurrent(hdc, hglrc); 

     //Do stuff... 

    wglMakeCurrent(NULL, NULL); 
    wglDeleteContext(hglrc); 
} 
+0

在這種情況下,我最感興趣的是Linux設置。 –

2

簡單直接層( SDL)庫是值得一試的。它簡化了跨平臺OpenGL上下文的創建,並能夠使用內存表面進行離屏渲染。

您必須額外做的唯一事情就是根據您的平臺在不同位置包含OpenGL和SDL標頭。這可以通過簡單的預處理器指令來完成。