C++ TTF_RenderText_Blended()生成的文本的奇怪阴影?

C++ TTF_RenderText_Blended()生成的文本的奇怪阴影?,c++,sdl-2,sdl-ttf,C++,Sdl 2,Sdl Ttf,我尝试从TTF_RenderText_Blended返回的曲面创建纹理。 我分几步来做: 创建文本纹理 仅通过SDL\U CreateTextureFromSurface创建“临时文本纹理” 通过SDL_CreateTexture传递SDL_TEXTUREACCESS_目标标志,以及TTF_RenderText_结果的格式、宽度和高度,创建“文本纹理” 在“文本纹理”上设置渲染器目标,并将整个“临时文本纹理”复制到整个“文本纹理”中 我终于可以摧毁temp了 创建背景纹理 这是相似的,但我从I

我尝试从TTF_RenderText_Blended返回的曲面创建纹理。 我分几步来做:

  • 创建文本纹理

  • 仅通过SDL\U CreateTextureFromSurface创建“临时文本纹理”
  • 通过SDL_CreateTexture传递SDL_TEXTUREACCESS_目标标志,以及TTF_RenderText_结果的格式、宽度和高度,创建“文本纹理”
  • 在“文本纹理”上设置渲染器目标,并将整个“临时文本纹理”复制到整个“文本纹理”中
  • 我终于可以摧毁temp了
  • 创建背景纹理

    这是相似的,但我从IMG_载荷函数得到曲面

  • 我这样做是因为我需要所有的纹理SDL_TEXTUREACCESS_TARGET(甚至文本也会保存在类对象中,比如纹理)

    当我想显示第二个纹理时,我会得到带有奇怪阴影的文本,就像在SDL_CreateTexture之后第二个纹理不是完全透明的一样(顺便说一句,我尝试在复制之前设置渲染器绘制颜色并清除整个第二个纹理,但结果是一样的)

    我意识到,当我跳过此解决方法以获取SDL_TEXTUREACCESS_目标“文本纹理”时,只需复制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_目标,或在开始时使纹理完全透明。

    使用渲染纹理的特定原因?您可以预先混合黑色,这可能不是您想要做的-使用
    SDL\u SetTextureBlendMode(textTexture,SDL\u BLENDMODE\u NONE)在渲染复制之前。它现在似乎可以工作了。我现在使用渲染纹理而不是纹理流,因为我认为它更抽象,更容易在开始时使用。我听说流式纹理速度更快,所以在将来我会添加模块,使用这种类型的纹理。我不能将您的答案标记为最佳答案,因为这是评论,但谢谢:)使用渲染纹理有什么特别的原因吗?您可以预先混合黑色,这可能不是您想要做的-使用
    SDL\u SetTextureBlendMode(textTexture,SDL\u BLENDMODE\u NONE)在渲染复制之前。它现在似乎可以工作了。我现在使用渲染纹理而不是纹理流,因为我认为它更抽象,更容易在开始时使用。我听说流式纹理速度更快,所以在将来我会添加模块,使用这种类型的纹理。我不能把你的答案评为最佳答案,因为这是评论,但谢谢:)
    
      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;