SFML 和 OpenGL(glew) 为什么我的程序在绘制到新 window 时失败?

SFML & OpenGL(glew) Why does my program fail when drawing to new window?

我有一个关于 SFML windows、上下文和 OpenGl 绘图的问题如下:

当我创建一个新的 Window 来绘制时(因为我需要它全屏或在运行时更改任何微妙的上下文设置)我使用 sf::Window::create(args...) 创建一个新的 window,旧的消失。 据我了解,这不会影响我的 OpenGl 调用,因为 windows 保持的上下文的 "active" 状态将自动设置(因此新的 window 将处于活动状态)。

那么为什么 OpenGl 无法在新 window 上绘制任何内容或停止工作?

我使用 SFMLContents(SFMLHandler) 的包装器并在 class(graphics) 中隐藏所有 OpenGl 调用。 这是代码: MainApp 的构造函数:

MainApp::MainApp()
{
    IMediaHandle::ContextSettings settings;
    settings.depth = 24;
    settings.stencil = 8;
    settings.antialiasing = 0;
    settings.openglmajor = 3;
    settings.openglminor = 3;
    SFMLHandle.createWindow("Test", 800, 600, settings);
    graphics.init();
    //I want to be able to do the following line
    SFMLHandle.createWindow("Test", 200, 400, settings);
}

这段代码工作得很好,旧的 window 被破坏了,新的出现了。 但是当我稍后开始在 apploop 中渲染时,程序在调用 glBindVertexArray(0);

时崩溃

如果我省略额外的行,我的渲染当然可以。

我需要做什么才能将旧绘图机制应用到新 Window? 我总是可以再次初始化我的图形,但我必须这样做吗?这不是设置上下文活动或非活动的重点吗?:

SFMLHandle.createWindow("Test", 800, 600, settings);
graphics.init();

SFMLHandle.createWindow("Test", 200, 400, settings);
// unnecessary ? 
graphics.init();

这段代码也能正常工作,以后不会崩溃。

谢谢你清理这个!

当您创建新的 window 时,会创建一个新的 OpenGL 上下文。 SFML 使此上下文与旧的(或任何其他)上下文共享其资源。这意味着您的纹理、缓冲区和着色器仍然有效。

但是,有些 OpenGL 对象不能在 OpenGL 上下文之间共享。顶点数组对象也在其中,AFAIK 帧缓冲区对象也在其中。在开始在新上下文中绘图之前,您必须重新创建这些。

另见 this page