Почему мои шрифты SDL_ttf такие пиксельные и некрасивые? Есть ли лучшие способы рендеринга шрифтов? - PullRequest
0 голосов
/ 10 ноября 2018

Вот пример:

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 голосов
/ 11 ноября 2018

TTF_RenderText_Blended и другие функции рендеринга шрифта SDL_ttf создают поверхность на основе размера шрифта, указанного при открытии шрифта (вместе с самим стилем шрифта и символами в текстовой строке). Вы масштабируете полученный результат до прямоугольника 500x500, что вызывает искажение пропорций и более яркое изображение, поскольку исходное изображение имеет разные размеры.

Во избежание необходимости сначала изменять масштабирование - используйте surfaceMessage->w и surfaceMessage->h (или SDL_QueryTexture для Message), чтобы получить исходные размеры, затем RenderCopy в прямоугольник того же размера.

Конечно, если текст статический и не локализован, предварительная визуализация этого статического изображения в каком-либо графическом редакторе также является хорошим вариантом.

Как примечание, это может быть упрощенное копирование-вставка, но кажется, что вы открываете шрифт и воссоздаете целевую текстуру в каждом кадре. Это очень медленно и не дает практически никаких преимуществ.

...