我有关于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();
此代码也适用,以后不会崩溃。
我感谢你清理这个!
答案 0 :(得分:2)
创建新窗口时,会创建一个新的OpenGL上下文。 SFML使它成为这个上下文与旧(或任何其他)上下文共享其资源。这意味着您的纹理,缓冲区和着色器仍然有效。
然而,OpenGL对象之间无法共享OpenGL对象。顶点数组对象也属于AFAIK帧缓冲对象。在开始在新环境中绘图之前,您必须重新创建这些。
另见this page。