使用openGL在SDL2中全屏显示一个窗口

时间:2014-05-24 00:44:01

标签: c++ opengl fullscreen sdl-2 openglcontext

我的程序在加载窗口时开始编译着色器,加载纹理等。然后,我希望能够启动全屏应用程序并使用这些资源。我的理解是openGL上下文之前和之后必须相同。我尝试了两种方法:首先我尝试制作一个全屏的第二个窗口,并在此窗口上使用SDL_GL_makecurrent命令来“传输”上下文(找不到我读到的关于此方法的位置),其次尝试只是全屏加载窗口。这两种方法都导致加载屏幕移动到屏幕的左上角。但是,opengl命令不再在全屏中正常运行,包括清除缓冲区,这意味着该窗口包含我的桌面/后台应用程序的内容。

有没有正确的方法呢?或者这是sdl / opengl驱动程序中的一个奇怪的错误?

代码到全屏原始窗口:

//opengl commands work fine up to here
//now to fullscreen

SDL_SetWindowFullscreen(window, SDL_WINDOW_FULLSCREEN_DESKTOP);
SDL_SetWindowSize(window, 1366, 768); //tried this on either side of line above and without either line

glViewport(0, 0, 1366, 768); //update viewport

glClearColor(1, 1, 1, 1);
glClear(GL_COLOR_BUFFER_BIT);

//window should be whited, other draw commands tried and all fail or distort

SDL_GL_SwapWindow(window);

创建一个新窗口并使用以前的上下文:

//Fine up to here

window2 = SDL_CreateWindow("Window", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 1366, 768, SDL_WINDOW_OPENGL | SDL_WINDOW_FULLSCREEN_DESKTOP | SDL_WINDOW_SHOWN);

SDL_GL_MakeCurrent(window2, glContext); //created with SDL_GL_CreateContext(oldwindow);

//draw commands dont work

PS:运行ubuntu

更新:在第二个代码中,重新使用新窗口中的上下文,它会在失败时返回错误“无效窗口”,这大部分时间都是如此,但并非总是如此。当它失败时,屏幕最终完全损坏(黑色带有奇怪的白色方块和图案),结束程序将不会清除此屏幕(尽管截图完全正常?),但它可以通过 ctrl <恢复/ kbd> + f1 到终点然后 ctrl + f7 返回

1 个答案:

答案 0 :(得分:0)

我真的不知道它是不是一个bug。我在sdl2和opengl上遇到了同样的问题。

  • 创建常规窗口
  • 附加到opengl上下文。
  • 全屏
  • BOOM。黑屏和坠毁的窗户。

我在ubuntu中只注意到了这个问题。

进行了一些测试后,我发现了一种快速修复方法:

Uint32 flags = 0; 
flags |= SDL_WINDOW_RESIZABLE;
//bla bla bla your tags
flags |= SDL_WINDOW_OPENGL;   
m_window = SDL_CreateWindow( "hello gl", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, m_screen.x, m_screen.y,flags);
m_glContext = SDL_GL_CreateContext(m_window);
//Set right the way the screen to fullscrene false
SDL_SetWindowFullscreen(m_window, SDL_FALSE);

现在全屏似乎没有问题。