创建跨平台的OpenGL离屏上下文

8
我有一个任务,需要在C++中实现Window和Linux的离屏OpenGL渲染器。我已经使用LWJGL库在Java中编写了这样的版本。在那里,我使用PBuffer对象,在底层创建基于所使用的操作系统的Pbuffers。起初,我考虑重新实现完整的PBuffer创建逻辑,就像在LWJGL本地源代码中所做的那样。然后我阅读了this StackOverflow.com上的帖子,建议使用标准的上下文创建,比如使用GLFW(跨平台),但不要创建实际的窗口。这是正确的方法吗?在这种情况下使用Pbuffer的优缺点是什么?
更新: 我只想强调一下,我使用FBO来渲染帧,因此我的问题不是如何在离屏模式下进行渲染,而是如何在Windows和Linux操作系统中创建没有窗口的上下文。
3个回答

6

1
没错,我确实假设使用FBOs。但是FBOs不会创建GL上下文,这就是我提出这个问题的原因。 - Michael IV
如果您想要硬件加速,至少在Windows上,您不能在创建OpenGL上下文之前不先创建(隐藏的)窗口。这是因为wglCreateContext需要一个设备上下文(DC),只有窗口的DC才能分配硬件加速像素格式。特别地,您不能使用硬件加速的OpenGL渲染到内存DC中 - sschuberth
那么你的意思是LWJGL的Windows版本会创建窗口,然后再将其删除吗? - Michael IV
我的意思是,在Windows上,任何硬件加速的OpenGL应用程序都会创建一个(可能是隐藏的)窗口,无论它是否使用PBuffers、FBOs或根本不进行离屏渲染。 - sschuberth
1
@MichaelIV:OpenGL上下文创建始终依赖于平台,无论是在窗口上还是不在窗口上。有EGL API,但它尚未得到广泛支持。 - datenwolf
显示剩余3条评论

2
简单直观的媒体层(SDL)库值得一试。它简化了跨平台OpenGL上下文创建,具有使用内存表面进行离屏渲染的能力。
唯一需要额外做的事情是根据您的平台从不同位置包含您的OpenGL和SDL头文件。这可以通过简单的预处理器指令来完成。

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);
}

在这种情况下,我主要对Linux设置感兴趣。 - Michael IV

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接