2013-12-07 6 views
2

Я использую класс под названием UICanvas, этот класс имеет текстуру, которая используется дочерними объектами для рендеринга.SDL2 полноэкранный режим и рендеринг для текстуры

Для этого я использую SDL_SetRenderTarget, и он работает очень хорошо, но когда я переключаюсь на полноэкранный режим, весь экран по какой-то причине использует холст-текстуру как текстуру экрана. Это ошибка, или я сделал что-то не так?

Это функция draw для класса canvas, m_canvas - это текстура, используемая для объектов childobjects для рисования.

void UICanvas::draw(SDL_Renderer* onWhat, Uint32 deltaTime) 
{ 
     /* Change rendering target to the canvas. */ 
     SDL_SetRenderTarget(onWhat, m_canvas); 

     /* Fill with background color */ 
     Color old; 
     SDL_GetRenderDrawColor(onWhat, &old.r, &old.g, &old.b, &old.a); 
     SDL_SetRenderDrawColor(onWhat, m_color.r, m_color.g, m_color.b, m_color.a); 
     SDL_RenderFillRect(onWhat, NULL); 
     SDL_SetRenderDrawColor(onWhat, old.r, old.g, old.b, old.a); 

     /* Draw child textures on the canvas. */ 
     drawChildren(onWhat, deltaTime); 

     /* Reset to default rendering target */ 
     SDL_SetRenderTarget(onWhat, NULL); 

     /* Position and render canvas */ 
     Point2Df abs(getAbsolutePosition()); 
     Rectangle dest(static_cast<Sint32>(abs.x), static_cast<Sint32>(abs.y), m_width, m_height); 
     SDL_RenderCopy(onWhat, m_canvas, NULL, &dest); 
    } 

Всякий раз, когда я переключаю полноэкранный режим, весь экран становится белым. Это функция я использую, чтобы перейти в полноэкранный режим:

void Application::toggleFullscreen() 
{ 
     Uint32 flags(SDL_GetWindowFlags(GE_SYS.window)); 
     flags ^= SDL_WINDOW_FULLSCREEN_DESKTOP; 
     SDL_SetWindowFullscreen(GE_SYS.window, flags); 

     SDL_DestroyRenderer(GE_SYS.renderer); 
     GE_SYS.renderer = SDL_CreateRenderer(GE_SYS.window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_TARGETTEXTURE); 
     //SDL_SetRenderTarget(GE_SYS.renderer, NULL); 
} 
+0

Я нашел несколько удовлетворительное решение моей проблемы. Прочитав эту дискуссию на форуме [link] (https://forums.libsdl.org/viewtopic.php?t=8787), я заставил SDL использовать OpenGL через SDL_SetHint (SDL_HINT_RENDER_DRIVER, «opengl»); перед созданием окна и средства визуализации. – user3077883

ответ

1

Я еще новичок в SDL (Nevermind любые нюансы между SDL 1.2 и СВД 2), но я уверен, что кто-то будет вокруг, чтобы исправить меня (в конце концов), если я ошибаюсь.

Из кода, который вы опубликовали, похоже, что вы уничтожаете и создаете средства визуализации при каждом переключении полноэкранного режима при использовании режима «полноэкранный рабочий стол». Это определенно не может быть прав. Вы также не должны форсировать определенный драйвер (согласно вашему комментарию, который заставил драйвер OpenGL, по-видимому, исправлять).

Вместо этого мне кажется, что все, что вам нужно сделать, это обновление окна и/или размера логического рендеринга.

void Application::toggleFullscreen() 
{ 
     Uint32 flags(SDL_GetWindowFlags(GE_SYS.window)); 
     flags ^= SDL_WINDOW_FULLSCREEN_DESKTOP; 
     SDL_SetWindowFullscreen(GE_SYS.window, flags); 
     int w = 640, h = 480; // TODO: UPDATE ME! ;) 
     if ((flags & SDL_WINDOW_FULLSCREEN_DESKTOP) != 0) 
     { 
       SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "linear"); 
       SDL_RenderSetLogicalSize(GE_SYS.renderer, w, h); 
     } 
     else 
     { 
       SDL_SetWindowSize(GE_SYS.window, w, h); 
     } 
} 

Этот метод переключаясь на весь экран работает для меня, и не включает в себя создание и уничтожение Renderers все время (при переключении). Если это не полностью решает проблему, я заранее извиняюсь, но если ничего больше, это должен быть шаг в правильном направлении.

Смежные вопросы