窗口更改时,渲染器会更改。就像在窗口的简单调整大小。这是我的假设。我错了。
我问这不是关于一般的纹理,而是更具体地说是用两个不同的SDL_TextureAccess标志创建的纹理 - SDL_TextureAccess_Target和SDL_TextureAccess_Static。我没有使用SDL_TextureAccess_Streaming所以我对那个没有兴趣,但为了完整起见,我们也不要忘记它。目标纹理由我用SDL_CreateTexture创建,而静态纹理来自SDL_CreateTextureFromSurface。
我遇到的问题是,在调整窗口大小时,目标纹理消失并且不再被渲染,直到我调用我的更新方法并重新创建它们,而静态纹理不关心它并继续渲染,无论如何。 / p>
我不确定哪种行为是预期的,因为我只使用静态纹理开始,目标纹理消失似乎对我来说是异常的,但是我有可能倒退而静态纹理是异常或者“特殊”案例。
粘贴代码几乎没有任何用处,因为它确实没有问题......据我所知。我只对窗帘后面发生的事情感兴趣,以及是什么导致一个人与渲染器更改的另一个表现不同。为什么一个人不受渲染器变化的影响?有人能以一种不太复杂和/或技术的方式向我解释这个问题吗?
我正在使用Delphi,不能说我有机会在c ++代码中测试它。
修改
我有所纠正,有一个我不明白的错误:CreateTexture() INVALIDCALL
为了确保在我的程序中隐藏起来并不是一个错误,我只写了一个最小的新测试程序。我可以像那样简单地重现错误......
这是一些代码。
SDL_Init(SDL_INIT_EVERYTHING);
TTF_Init;
window := SDL_CreateWindow('test', 100, 100, 600, 600, SDL_WINDOW_RESIZABLE);
renderer := SDL_CreateRenderer(window, -1, SDL_RENDERER_TARGETTEXTURE);
font := TTF_OpenFont(PAnsiChar('C:\arial.ttf'), 20);
new(color);
color.r := 255;
color.g := 255;
color.b := 255;
color.a := 255;
这很好,没问题:
surface := TTF_RenderText_Blended(font, PAnsiChar('WTF!?'), color^);
texture := SDL_CreateTextureFromSurface(renderer, surface)
然后我在循环中调用它
SDL_RenderClear(renderer);
SDL_RenderCopy(renderer, texture, nil, nil);
SDL_RenderPresent(renderer);
然而,只要我这样做:
surface := TTF_RenderText_Blended(font, PAnsiChar('WTF!?'), color^);
texture := SDL_CreateTextureFromSurface(renderer, surface);
target_texture := SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET, 50, 50);
SDL_SetRenderTarget(renderer, target_texture);
SDL_RenderCopy(renderer, texture, nil, nil);
SDL_SetRenderTarget(renderer, nil);
和相同的循环
SDL_RenderClear(renderer);
SDL_RenderCopy(renderer, target_texture, nil, nil);
SDL_RenderPresent(renderer);
一切似乎都工作得很好,直到我调整窗口大小,不再渲染文本,SDL_GetError为我提供了上面提到的错误。