SDL2全屏并渲染到纹理

时间:2013-12-07 16:17:39

标签: c++ sdl fullscreen

我正在使用一个名为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 );
}

1 个答案:

答案 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);
        }
}

这种切换全屏的方法对我有用,并且不会一直涉及创建和销毁渲染器(切换时)。如果这还没有完全解决问题我提前道歉,但如果没有其他的话,这应该是朝着正确方向迈出的一步。