gpt4 book ai didi

c++ - SDL2 全屏和渲染到纹理

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:25:12 32 4
gpt4 key购买 nike

我正在使用一个名为 UICanvas 的类,该类具有供子对象渲染的纹理。

我使用 SDL_SetRenderTarget 来实现这一点,它工作得很好,但是当我切换到全屏时,出于某种原因整个屏幕使用 Canvas 纹理作为屏幕纹理。这是一个错误,还是我做错了什么?

这是 Canvas 类的绘制函数,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 );
}

最佳答案

我对 SDL 还是很陌生(不要在意 SDL 1.2 和 SDL 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);
}
}

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

关于c++ - SDL2 全屏和渲染到纹理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20443563/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com