用openGL在SDL2中全面筛选窗口

Fullscreening a window in SDL2 with openGL

本文关键字:筛选 窗口 openGL SDL2      更新时间:2023-10-16

我的程序在编译着色器,加载纹理等时开始加载窗口。然后,我希望能够启动一个全屏应用程序并使用这些资源。我的理解是,openGL上下文必须是相同的之前和之后。我为此尝试了两种方法:首先,我尝试制作一个全屏的第二个窗口,并在这个窗口上使用sdl_gl_makeccurrent命令来"转移"上下文(找不到我在哪里读到这个方法),其次尝试完全筛选加载窗口。这两种方法都会导致加载屏幕移到屏幕的左上角。然而,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: running ubuntu

Update:在第二个代码中,在新窗口中重用上下文,当它失败时返回一个错误说'无效窗口',这是大多数时间,但并非总是如此。当它失败时,屏幕最终完全损坏(黑色与奇怪的白色方块和图案),结束程序不会清除屏幕上的这一点(虽然截图是完美的?),但它可以通过ctrl+f1到终端然后ctrl+f7返回

我真的不知道这是不是一个bug。我在使用sdl2和opengl时也遇到了同样的问题。

  • 创建一个常规窗口
  • 附加到opengl上下文。
  • 全屏
  • 繁荣。黑屏和死机。

我只在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);

现在全屏工作似乎没有问题。