1

I try to create texture from surface which is returned by TTF_RenderText_Blended. I do it in few steps:

  1. Create text texture.

    1. Create 'temporary text texture' just by SDL_CreateTextureFromSurface.
    2. Create 'text texture' by SDL_CreateTexture passing SDL_TEXTUREACCESS_TARGET flag, and format, width, height from result of TTF_RenderText_Blended.
    3. Set renderer target on 'text texture' and copy entire 'temporary text texture' into entire 'text texture'.
    4. I finally can destroy temp.
  2. Create background texture.

    It's similar but I get surface from IMG_Load function.

I do so because I need all textures SDL_TEXTUREACCESS_TARGET (even Text will be hold in class object like Texture).

When I want to display second texture I get text with strange shades just like second texture is not fully transparent after SDL_CreateTexture (BTW I tried to set renderer draw color and clear entire second texture before copying but result is the same).

    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;

Text with strange shades

I recognised that when I skip doing this workaround to get SDL_TEXTUREACCESS_TARGET 'text texture' just by copying 'temporary text texture' obtained by SDL_CreateTextureFromSurface, then text display normally.

  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;

Good text

Is there any option to set SDL_TEXTUREACCESS_TARGET after creation or to do texture complettly transparent at start.

genpfault
  • 51,148
  • 11
  • 85
  • 139
Njiuchacz
  • 11
  • 1
  • Any particular reason to use render textures? You pre-blend with black, which is probably not what you're trying to do - use `SDL_SetTextureBlendMode(textTexture, SDL_BLENDMODE_NONE);` before rendercopy. – keltar Feb 11 '20 at 06:20
  • It seems to work now. I use render textures instead texture streaming right now because I think it is more abstract and easier to use at begin. I heard that streaming textures are faster so in the future I add module which will use that type of textures. I can't mark you answer as best because it is comment but thank :) – Njiuchacz Feb 12 '20 at 15:54

0 Answers0