簡體   English   中英

SDL_Texture 在調整大小后呈現黑色,除非重新繪制

[英]SDL_Texture renders black after resize unless it is redrawn

我有一個討厭的錯誤給你們。 (是的,這可能是我的錯誤,而不是 SDL 的錯誤。)我一直在為 SDL 編寫現代 C++ 包裝器,一切似乎都按預期工作。 但是,我的紋理 class 有一個奇怪的錯誤:如果在調整大小后重繪它,它看起來很好,但如果不是,它就會變成全黑。 看起來是這樣的:

調整大小之前

調整大小后

我不能在這里只發布一部分代碼,所以這里是整個文件夾(托管在 GitLab 上): SDL wrapper

這是一個使用此庫重現錯誤的小程序:

#include "sdl_wrapper/context.hh"
#include "sdl_wrapper/video/context.hh"
#include "sdl_wrapper/render/renderer.hh"
#include "sdl_wrapper/render/texture.hh"
#include "sdl_wrapper/colors.hh"
#include "SDL2/SDL_events.h"

int main()
{
    sdl::Context sdlContext;
    sdl::video::Context videoContext = sdlContext.initVideo();
    sdl::video::Window window = videoContext.createWindow("test", 0, 0, 800, 600).resizable().build();
    int width = 800;
    int height = 600;
    sdl::render::Renderer renderer = window.createRenderer().targetTexture().build();
    sdl::render::Texture example(renderer, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET, 400, 300);
    renderer.setTarget(example);
    renderer.setDrawColor(sdl::colors::Blue);
    renderer.clear();
    renderer.resetTarget();
    bool run = true;
    while (run)
    {
        SDL_Event e;
        while (SDL_PollEvent(&e) != 0)
        {
            if (e.type == SDL_QUIT)
            {
                run = false;
                break;
            }
        }
        renderer.setDrawColor({0x44, 0x44, 0x44, 0xff});
        renderer.clear();
        renderer.copy(example, std::nullopt, {{width / 4, height / 4, example.getWidth(), example.getHeight()}});
        renderer.present();
    }
}

要重現,只需運行此程序並調整 window 的大小。 調整大小后會有一個藍色方塊變成黑色。

如果有人能在這里指出正確的方向,我將不勝感激。 我真的很想避免在每次調整大小時重新繪制(如果我被誤導了,請隨時與我爭論)。

SDL 不會 promise 保留目標紋理數據。 在某些情況下,尤其是使用 d3d 或移動設備時,由於 state 的一些大變化而導致數據丟失。 更改 window 大小可能聽起來沒那么大,但在某些硬件/驅動程序配置上會導致問題,我想這就是 SDL 檢測調整大小並丟棄所有渲染器數據的原因。 當您需要更新渲染紋理時,您會收到SDL_RENDER_TARGETS_RESET事件。

這不應該發生在例如 opengl 渲染器實現中(這可能聽起來不錯,但背后的原因並不是那么好); 在 windows 上,SDL2 默認為 direct3d,可以通過發出SDL_SetHint或設置 envvars 進行修改。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM