在SDL2中使用OpenGL实现窗口全屏化

3
我的程序在编译着色器、加载纹理等过程中会出现加载窗口。然后我想要能够启动一个全屏应用程序并使用这些资源。我的理解是,在此之前和之后,openGL上下文必须是相同的。我尝试了两种方法:首先,我尝试创建一个全屏的第二个窗口,并在该窗口上使用SDL_GL_makecurrent命令来“传输”上下文(找不到我在哪里读到这种方法),其次尝试将加载窗口设置为全屏。这两种方法都导致加载屏幕移到屏幕左上角。但是在全屏模式下OpenGL命令无法正常运行,包括清除缓冲区,这意味着窗口包含了我的桌面/背景应用程序的内容。
有没有正确的做法?还是这是sdl/opengl驱动程序中的奇怪bug?
将原始窗口设置为全屏的代码:
//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+f1进入终端,然后再按ctrl+f7来恢复。

1个回答

0

我不确定这是否是一个错误。我在使用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);

现在全屏看起来没有问题了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接