2013-01-10 29 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标头。这可以通过简单的预处理器指令来完成。