用openGL在SDL2中全面筛选窗口
Fullscreening a window in SDL2 with openGL
我的程序在编译着色器,加载纹理等时开始加载窗口。然后,我希望能够启动一个全屏应用程序并使用这些资源。我的理解是,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);
现在全屏工作似乎没有问题。
相关文章:
- 如何在Qt窗口小部件中使用QStringView(或QStringRef)
- 问:如何使用C++中的按钮从窗口打开窗口
- SDL 窗口不会弹出
- 在createdialog创建的窗口中捕获用于编辑控件的OnMouseMove消息
- 如何在cpp文件之间切换窗口?在Qt中
- QuadTree只在窗口的右上角绘制
- VS Code "command":"make"与终端窗口中的命令行"make"不同
- 如何在C++中找到active directory中禁用和锁定的窗口帐户
- 处理闪烁窗口事件
- 如何通过按下第三个窗口中的按钮,将QString从一个窗口获取到另一个窗口
- C++win32 API创建多个类似视口的窗口
- SFML RenderWindow打开窗口需要很长时间
- 如何将不同的可执行文件合并到一个窗口框架中进行编码?像浏览器一样
- 获取 SFML 窗口的 HWND 和高可用性?
- 如何获取 GLFW 窗口 ID?
- GLEW/GLUT:调用init并创建一个窗口后,取消初始化并重新初始化?
- 用于窗口的 HID 终端
- SFML 文本未绘制在窗口上
- 直接显示筛选器属性窗口
- 用openGL在SDL2中全面筛选窗口