Полноэкранный режим окна в SDL2 с помощью openGL

Моя программа начинается с окна загрузки во время компиляции шейдеров, загрузки текстур и т. д. Затем я хочу иметь возможность запускать полноэкранное приложение и использовать эти ресурсы. Насколько я понимаю, контекст 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: работает убунту

Обновление: во втором коде повторное использование контекста в новом окне возвращает ошибку "недействительное окно" в случае сбоя, что происходит в большинстве случаев, но не всегда. Когда это не удается, экран становится полностью поврежденным (черный со странными белыми квадратами и узорами), завершение программы не очистит экран от этого (хотя скриншоты в порядке?), но его можно восстановить с помощью ctrl< /kbd>+f1 в терминал, затем ctrl+f7 назад


person George Broughton    schedule 24.05.2014    source источник


Ответы (1)


Я действительно не знаю, если это ошибка. У меня была такая же проблема с 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);

Теперь полноэкранный режим работает без проблем.

person Matheus Braga Almeida    schedule 27.10.2017