为什么我的 SDL_ttf 字体如此像素化和丑陋?有没有更好的渲染字体的方法?
Why are my SDL_ttf fonts so pixelated and ugly? Are there better ways of rendering fonts?
这是一个例子:
下面是对应的代码:
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_);
}
(是的,我稍后释放表面)
TTF_RenderText_Blended
和其他 SDL_ttf 字体渲染函数根据打开字体时指定的字体大小生成表面(连同字体样式本身和文本行中的符号)。您将该结果重新缩放为 500x500 矩形,这会导致比例失真和图像模糊,因为源图像具有不同的尺寸。
为避免这种情况,您应首先避免重新缩放 - 使用 surfaceMessage->w
和 surfaceMessage->h
(或 Message
上的 SDL_QueryTexture
)获取原始尺寸,然后渲染复制到相同尺寸大小的矩形。
当然,如果文本是静态的且未本地化,则在某些图形编辑器中预渲染此静态图像也是一个不错的选择。
附带说明一下,这可能是复制粘贴过度简化,但您似乎打开了字体并在每一帧上重新创建了目标纹理。这非常慢,几乎没有任何好处。
这是一个例子:
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_);
}
(是的,我稍后释放表面)
TTF_RenderText_Blended
和其他 SDL_ttf 字体渲染函数根据打开字体时指定的字体大小生成表面(连同字体样式本身和文本行中的符号)。您将该结果重新缩放为 500x500 矩形,这会导致比例失真和图像模糊,因为源图像具有不同的尺寸。
为避免这种情况,您应首先避免重新缩放 - 使用 surfaceMessage->w
和 surfaceMessage->h
(或 Message
上的 SDL_QueryTexture
)获取原始尺寸,然后渲染复制到相同尺寸大小的矩形。
当然,如果文本是静态的且未本地化,则在某些图形编辑器中预渲染此静态图像也是一个不错的选择。
附带说明一下,这可能是复制粘贴过度简化,但您似乎打开了字体并在每一帧上重新创建了目标纹理。这非常慢,几乎没有任何好处。