8

我的任务是在 C++ 中为 Window 和 Linux 实现屏幕外 OpenGL 渲染器。我已经使用LWJGL lib 用 Ja​​va 编写了这样一个版本。我使用了 PBuffer 对象,它在引擎盖下根据使用的操作系统创建 Pbuffers。首先我想重新实现完整的 PBuffer 创建逻辑,就像我在 LWJGL 的本机源代码中所做的那样。然后我在 StackOverflow.com 上阅读了这篇文章,建议使用标准上下文创建,假设使用GLFW(它是跨平台的)但是不创建实际的窗口。这是正确的方法吗?在这种情况下,与使用 Pbuffer 相比有什么优缺点?

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

4

3 回答 3

6

我强烈建议不要再使用PBuffers,而是使用Frame Buffer Objects (FBO)。FBO 提供了更好的性能,因为使用它们不需要上下文切换,而且它们还有其他几个优点

LWJGL 支持 FBO,但GLFW “仅”用于 OpenGL 的跨平台设置,而不用于渲染。为了方便的跨平台 FBO 使用,我建议在GLFW之上使用像OGLplus这样的库。有关渲染到纹理的示例,请参见此处

于 2013-01-10T08:51:51.903 回答
2

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

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

于 2013-01-10T10:27:35.040 回答
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);
}
于 2013-01-10T10:03:45.213 回答