我正在使用一个名为UICanvas的类,这个类有一个子对象用来渲染的纹理。
我使用SDL_SetRenderTarget来实现这一点,并且效果很好,但是当我切换到全屏时,整个屏幕出于某种原因使用画布纹理作为屏幕纹理。 这是一个错误,还是我做错了什么?
这是canvas类的draw-function,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 :(得分:1)
我还是SDL的新手(不要忘记SDL 1.2和SDL 2之间的任何细微差别),但如果我错了,我确定有人会(最终)纠正我。
从您发布的代码中,每次使用&#34;全屏桌面&#34;全屏切换全屏时,您似乎都在摧毁和创建渲染器。模式。这肯定是对的。你不应该强迫一个特定的驱动程序(根据你的评论强迫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);
}
}
这种切换全屏的方法对我有用,并且不会一直涉及创建和销毁渲染器(切换时)。如果这还没有完全解决问题我提前道歉,但如果没有其他的话,这应该是朝着正确方向迈出的一步。