Почему мои шрифты SDL_ttf такие неровные и пиксельные? Есть ли лучшие способы рендеринга шрифтов?
Вот пример:
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 ответ
TTF_RenderText_Blended
и другие функции рендеринга шрифта SDL_ttf создают поверхность на основе размера шрифта, указанного при открытии шрифта (вместе с самим стилем шрифта и символами в текстовой строке). Вы масштабируете полученный результат до прямоугольника 500x500, что вызывает искажение пропорций и более яркое изображение, поскольку исходное изображение имеет разные размеры.
Чтобы избежать этого, вы должны избегать масштабирования в первую очередь - используйте surfaceMessage->w
а также surfaceMessage->h
(или же SDL_QueryTexture
на Message
), чтобы получить исходные размеры, затем RenderCopy в прямоугольник того же размера.
Конечно, если текст статичен и не локализован, предварительная визуализация этого статического изображения в каком-либо графическом редакторе также является хорошим вариантом.
Как примечание, это может быть упрощенное копирование-вставка, но кажется, что вы открываете шрифт и воссоздаете целевую текстуру в каждом кадре. Это очень медленно и не дает практически никаких преимуществ.