Странные оттенки текста, сгенерированные TTF_RenderText_Blended ()? - PullRequest
1 голос
/ 10 февраля 2020

Я пытаюсь создать текстуру из поверхности, которую возвращает TTF_RenderText_Blended. Я делаю это в несколько шагов:

  1. Создание текстовой текстуры.

    1. Создание 'временной текстовой текстуры' просто с помощью SDL_CreateTextureFromSurface.
    2. Создание ' текстурная текстура 'с помощью SDL_CreateTexture, передавая флаг SDL_TEXTUREACCESS_TARGET и формат, ширину и высоту из результата TTF_RenderText_Blended.
    3. Установите цель визуализации на «текстурную текстуру» и скопируйте всю «временную текстурную текстуру» во всю «текстурную текстуру».
    4. Наконец-то я могу уничтожить темп.
  2. Создать текстуру фона.

    Это похоже, но я получаю поверхность из функции IMG_Load.

Я делаю это, потому что мне нужны все текстуры SDL_TEXTUREACCESS_TARGET (даже текст будет удерживаться в объекте класса, как текстура).

Когда я хочу отобразить вторую текстуру, я получаю текст со странными оттенками просто как вторая текстура не полностью прозрачная после SDL_CreateTexture (Кстати, я пытался установить цвет рисования рендерера и очистить всю вторую текстуру перед копированием, но результат то же самое).

    LibraryInitializer::setup();


SDL_Window * window;
SDL_Renderer * renderer;

window = SDL_CreateWindow("TEST", 200, 200, 800, 800, 0);
renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_TARGETTEXTURE | SDL_RENDERER_PRESENTVSYNC | SDL_RENDERER_ACCELERATED);

TTF_Font * font = TTF_OpenFont("C:\\WINDOWS\\Fonts\\Arial.ttf", 40);
SDL_Color color{ 255, 127, 39, 0 };

SDL_Surface * text = TTF_RenderText_Blended(font, "abc", color);
SDL_Texture * textTexture = SDL_CreateTextureFromSurface(renderer, text);

SDL_Texture * finalTextTexture = SDL_CreateTexture(renderer, text->format->format, SDL_TEXTUREACCESS_TARGET, text->w, text->h);
SDL_SetTextureBlendMode(finalTextTexture, SDL_BLENDMODE_BLEND);
SDL_SetRenderTarget(renderer, finalTextTexture);
SDL_RenderCopy(renderer, textTexture, nullptr, nullptr);
SDL_SetRenderTarget(renderer, nullptr);
SDL_DestroyTexture(textTexture);

SDL_Surface * background = IMG_Load("res/onClick.png");
SDL_Texture * backgroundTexture = SDL_CreateTextureFromSurface(renderer, background);

SDL_Texture * finalBackgroundTexture = SDL_CreateTexture(renderer, background->format->format, SDL_TEXTUREACCESS_TARGET, background->w, background->h);
SDL_SetRenderTarget(renderer, finalBackgroundTexture);
SDL_RenderCopy(renderer, backgroundTexture, nullptr, nullptr);
SDL_SetRenderTarget(renderer, nullptr);
SDL_DestroyTexture(backgroundTexture);

SDL_Rect textCoordinates{ 0, 0, 100, 100 };

SDL_SetRenderTarget(renderer, finalBackgroundTexture);
SDL_RenderCopy(renderer, finalTextTexture, nullptr, &textCoordinates);
SDL_SetRenderTarget(renderer, nullptr);

SDL_Event event;

while (true) {

    SDL_RenderClear(renderer);

    while (SDL_PollEvent(&event)) {


    }

    SDL_RenderCopy(renderer, finalBackgroundTexture, nullptr, &textCoordinates);
    SDL_RenderPresent(renderer);
}



LibraryInitializer::shutdown();
return 0;

Текст со странными оттенками

Я понял, что когда я пропускаю этот обходной путь, чтобы получить SDL_TEXTUREACCESS_TARGET 'текстурную текстуру', просто копируя 'временный текст текстура ', полученная с помощью SDL_CreateTextureFromSurface, затем текст отображается нормально.

  LibraryInitializer::setup();

SDL_Window * window;
SDL_Renderer * renderer;

window = SDL_CreateWindow("d", 200, 200, 800, 800, 0);
renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_TARGETTEXTURE | SDL_RENDERER_PRESENTVSYNC | SDL_RENDERER_ACCELERATED);

TTF_Font * font = TTF_OpenFont("C:\\WINDOWS\\Fonts\\Arial.ttf", 40);
SDL_Color color{ 255, 127, 39, 0 };

SDL_Surface * text = TTF_RenderText_Blended(font, "abc", color);
//SDL_Surface * text = TTF_RenderText_Solid(font, "abc", color);
SDL_Texture * textTexture = SDL_CreateTextureFromSurface(renderer, text);

SDL_Surface * background = IMG_Load("res/onClick.png");
SDL_Texture * backgroundTexture = SDL_CreateTextureFromSurface(renderer, background);

SDL_Texture * finalBackgroundTexture = SDL_CreateTexture(renderer, background->format->format, SDL_TEXTUREACCESS_TARGET, background->w, background->h);
SDL_SetTextureBlendMode(finalBackgroundTexture, SDL_BLENDMODE_BLEND);
SDL_SetRenderTarget(renderer, finalBackgroundTexture);
SDL_RenderCopy(renderer, backgroundTexture, nullptr, nullptr);
SDL_SetRenderTarget(renderer, nullptr);
SDL_DestroyTexture(backgroundTexture);

SDL_Rect textCoordinates{ 0, 0, 100, 100 };

SDL_SetRenderTarget(renderer, finalBackgroundTexture);
SDL_RenderCopy(renderer, textTexture, nullptr, &textCoordinates);
SDL_SetRenderTarget(renderer, nullptr);

SDL_Event event;

while (true) {

    SDL_RenderClear(renderer);

    while (SDL_PollEvent(&event)) {


    }

    SDL_RenderCopy(renderer, finalBackgroundTexture, nullptr, &textCoordinates);
    SDL_RenderPresent(renderer);
}



LibraryInitializer::shutdown();
return 0;

Хороший текст

Есть ли возможность установить SDL_TEXTUREACCESS_TARGET после создания или сделать текстуру полностью прозрачной при начать.

...