为什么我的SDL_ttf字体是如此像素化和丑陋?有更好的字体渲染方法吗?

时间:2018-11-10 07:03:47

标签: macos sdl sdl-ttf

这里是一个例子:

example这是相应的代码:

TTF_Font *Sans = TTF_OpenFont("resources/fonts/lato/Lato-Semibold.ttf", 36);

    if( Sans == NULL )
    {
        std::cout << "Failed to load font! SDL_ttf Error: " << TTF_GetError() << std::endl;
    }

    else
    {
        SDL_Color White = {255, 255, 255};

        SDL_Surface *surfaceMessage = TTF_RenderText_Blended(Sans, "GAME OVER", White);

        SDL_Texture *Message = SDL_CreateTextureFromSurface(renderer_, surfaceMessage);

        SDL_Rect Message_rect;
        Message_rect.x = 100;
        Message_rect.y = 100;
        Message_rect.w = 500;
        Message_rect.h = 500;

        SDL_RenderCopy(renderer_, Message, NULL, &Message_rect);
        SDL_RenderPresent(renderer_);

}

(是的,我稍后再释放表面)

1 个答案:

答案 0 :(得分:2)

TTF_RenderText_Blended和其他SDL_ttf字体渲染功能会根据打开字体时指定的字体大小(以及字体样式本身和文本行中的符号)生成表面。您将结果重新缩放为500x500矩形,这会导致比例失真和图像模糊,因为源图像的尺寸不同。

为避免出现这种情况,您应该避免首先重新缩放-使用surfaceMessage->wsurfaceMessage->h(或SDL_QueryTexture上的Message)获取原始尺寸,然后将RenderCopy复制到相同大小的矩形

当然,如果文本是静态的并且没有本地化,则在某些图形编辑器中预渲染该静态图像也是一个不错的选择。

请注意,这可能是复制粘贴过于简单化了,但是您似乎打开字体并在每个帧上重新创建目标纹理。这非常慢,几乎没有任何好处。