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

时间:2016-08-24 07:07:01

标签: c++ opengl sfml

我有关于SFML窗口,上下文和OpenGl绘图的问题,如下所示:

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

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

我使用SFMLContents(SFMLHandler)的包装器并隐藏类(图形)中的所有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);
}

这段代码工作正常,旧窗口被破坏,新的窗口出现。 但是当我开始在apploop中渲染时,程序在glBindVertexArray(0);

的调用时崩溃了

如果我遗漏了额外的行,我的渲染当然可以。

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

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

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

此代码也适用,以后不会崩溃。

我感谢你清理这个!

1 个答案:

答案 0 :(得分:2)

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

然而,OpenGL对象之间无法共享OpenGL对象。顶点数组对象也属于AFAIK帧缓冲对象。在开始在新环境中绘图之前,您必须重新创建这些。

另见this page