创建跨平台OpenGL屏幕外上下文

时间:2013-01-10 08:16:09

标签: c++ opengl

我有一个任务是在C ++中为Window和Linux实现屏幕外OpenGL渲染器。我已经使用LWJGL lib用Java编写了这样的版本。我使用了PBuffer对象,它根据引擎创建了Pbuffers使用过的OS.First我想重新实现完整的PBuffer创建逻辑,就像我在LWJGL的原生源中一样。然后我在StackOverflow.com上阅读this帖子,建议使用标准上下文创建,假设使用GLFW(跨平台)而不是创建实际窗口。这是正确的方法吗?在这种情况下使用Pbuffer的利弊是什么?

更新 我只想强调我使用FBO渲染帧,所以我的问题不在于如何在屏幕外模式下渲染,而是如何在Windows和Linux操作系统中创建没有窗口的上下文。

3 个答案:

答案 0 :(得分:6)

我强烈建议您不要再使用PBuffers,而是使用Frame Buffer Objects (FBOs)。 FBO提供了更好的性能,因为使用它们不需要上下文切换,并且它们具有several other advantages

LWJGL supports FBOs,但GLFW仅适用于OpenGL和not for rendering的跨平台设置。为方便跨平台的FBO使用,我建议在GLFW之上使用OGLplus之类的库。有关渲染到纹理的示例,请参阅here

答案 1 :(得分:2)

Simple DirectMedia Layer(SDL)库值得一试。它简化了跨平台的OpenGL上下文创建,并能够使用内存表面进行屏幕外渲染。

您唯一需要做的就是根据您的平台包含来自不同位置的OpenGL和SDL标头。这可以通过简单的预处理器指令来完成。

答案 2 :(得分: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);
}