Delphi 当渲染器更改时,SDL2纹理会发生什么变化?

Delphi 当渲染器更改时,SDL2纹理会发生什么变化?,delphi,sdl-2,delphi-10-seattle,Delphi,Sdl 2,Delphi 10 Seattle,当窗口更改时,渲染器也会更改。就像简单地调整窗口大小一样。这是我的假设。我可能错了 我问的不是一般的纹理,而是更具体的关于使用两个不同的SDL_TextureAccess标志创建的纹理-SDL_TextureAccess_Target和SDL_TextureAccess_Static。我没有使用SDL_TextureAccess_流媒体,所以我对它不太感兴趣,但为了完整起见,让我们也不要忘记它。目标纹理由我使用SDL_CreateTexture创建,而静态纹理来自SDL_CreateTextur

当窗口更改时,渲染器也会更改。就像简单地调整窗口大小一样。这是我的假设。我可能错了

我问的不是一般的纹理,而是更具体的关于使用两个不同的SDL_TextureAccess标志创建的纹理-SDL_TextureAccess_Target和SDL_TextureAccess_Static。我没有使用SDL_TextureAccess_流媒体,所以我对它不太感兴趣,但为了完整起见,让我们也不要忘记它。目标纹理由我使用SDL_CreateTexture创建,而静态纹理来自SDL_CreateTextureFromSurface

我遇到的问题是,在调整窗口目标纹理的大小时,它们会消失,并且在调用更新方法并重新创建它们之前不会再被渲染,而静态纹理并不真正关心这一点,并且会一直被渲染

我不确定预期的行为是什么,因为我刚开始只使用静态纹理,目标纹理消失对我来说似乎是异常的,但我很有可能发现,反向和静态纹理是异常或“特殊”情况

粘贴代码几乎没有任何用处,因为它确实没有问题。。。据我所知。我只是对窗帘后面发生的事情感兴趣,以及当渲染器发生变化时,是什么导致一个窗帘的行为与另一个不同。为什么不受渲染器更改的影响?有人能以一种不太复杂和/或技术性的方式向我解释一下吗

<>我使用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向我提供上述错误。

如果没有手动重新创建渲染器,它应该保持不变。SDL_DestroyRenderer的文档说明“销毁窗口的渲染上下文并释放相关纹理”,因此任何纹理都不应在该操作后继续存在。是否生成任何SDL错误?不同的渲染后端(d3d,opengl)是否有相同的结果?@keltar我自己并没有破坏渲染器,我唯一要做的就是退出程序。SDL_错误不会在我调整窗口大小和纹理停止渲染时产生任何结果。然而,它确实在另一个地方给我带来了一个无效的纹理错误-我倾向于认为这是一个单独的问题,特别是因为,尽管有错误,调用Update会带回纹理。我还没有尝试过不同的渲染后端,因为我上次尝试时甚至无法让opengl在delphi中工作,但我也对更高级的东西不感兴趣。@keltar,只是更新:无效纹理错误已经解决,现在一切似乎都没有错误,但我的目标纹理问题仍然存在。