【发布时间】:2023-12-12 05:56:01
【问题描述】:
我正在使用一个名为 UICanvas 的类,该类有一个纹理供子对象用于渲染。
我使用 SDL_SetRenderTarget 来实现这一点,并且效果很好,但是当我切换到全屏时,由于某种原因,整个屏幕都使用画布纹理作为屏幕纹理。 这是一个错误,还是我做错了什么?
这是画布类的绘制函数,m_canvas 是用于子对象绘制的纹理。
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 );
}
【问题讨论】:
-
我找到了一个稍微令人满意的解决方案来解决我的问题。在阅读了这个论坛讨论link 之后,我通过 SDL_SetHint(SDL_HINT_RENDER_DRIVER, "opengl"); 强制 SDL 使用 OpenGL;在创建窗口和渲染器之前。
标签: c++ sdl fullscreen