LINUX.ORG.RU

TTF_OpenFont отрабатывает без ошибок, но текст не отображается

 ,


0

1
SDL_Surface* renderText(const std::string &message, const std::string &fontFile,
                        SDL_Color color, int fontSize, SDL_Renderer *renderer)
{  
    static TTF_Font *font = TTF_OpenFont(fontFile.c_str(), fontSize);
    SDL_Surface *surf = TTF_RenderText_Blended(font, message.c_str(), color);
    return surf;
}

    static SDL_Surface* texture_text =  //IMG_Load("img.png");
    renderText("Hello world!", "font.ttf", {0x00, 0x00, 0xFF, 0xFF}, 16, nullptr);
    auto Mode = GL_RGB;
    if (texture_text)
    {      
        glGenTextures(1, &texture);
        glBindTexture(GL_TEXTURE_2D, texture);
        if(texture_text->format->BytesPerPixel == 4)
            Mode = GL_RGBA;
     }
 
    // set texture parameters
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
 
   glTexImage2D(GL_TEXTURE_2D, 0, Mode, texture_text->w, texture_text->h, 0, Mode, GL_UNSIGNED_BYTE, texture_text->pixels);

SDL2, пытаюсь грузить в этом коде картинку (IMG_Load) - всё хорошо, но в случае текста отображается сплошной красный текст. Ошибок при загрузке шрифта - нет. Куда копать? Есть подозрение, что шрифт, на самом деле отображается, но метровыми буквами.

Правда, картинка тоже отображается перевёрнутой, ужатой до размеров прямоугольника и растянутой по ширине, но это ожидаемо.

★★★★★

Последнее исправление: next_time (всего исправлений: 3)

если TTF_RenderText_Blended заменить на TTF_RenderText_Solid, на тестовом прямоугольнике отображается «каша» из пикселов вместо текстуры

next_time ★★★★★
() автор топика
Ответ на: комментарий от next_time

Из моего:

void draw-text(int x,int y,my-font font) {
    SDL_Surface* surface = TTF_RenderText_Blended(font->font,
                                                  text,
                                                  font->color);

    texture_t* texture = texture_from_surface(surface);

    SDL_Rect form;
    form.x = x;
    form.y = y;

    TTF_SizeUTF8(font->font,
                 text,
                 &form.w,
                 &form.h);

    render_draw_image(render,
                      texture,
                      NULL,
                      &form);
    
    texture_free(texture);
}

texture_t* texture_from_surface(SDL_Surface* Surface) {
    GLuint TextureID = 0;
    glGenTextures(1, &TextureID);
    glBindTexture(GL_TEXTURE_2D, TextureID);
    
    /* Чую не с проста тут такой костыль */
    int Mode = GL_RGBA;
 
    if(Surface->format->BytesPerPixel == 4) {
        Mode = GL_RGBA;
    }
    
    glTexImage2D(GL_TEXTURE_2D, 0, Mode,
                 Surface->w, Surface->h, 0,
                 Mode, GL_UNSIGNED_BYTE,
                 Surface->pixels);
    
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

    texture_t* texture = malloc(sizeof(texture_t));
    texture->width = Surface->w;
    texture->height = Surface->h;
    texture->id = TextureID;
    
    SDL_FreeSurface(Surface);

    return texture;
}

Заодно включи прозрачность,и GL_BLEND

linuhs_user
()
Ответ на: комментарий от linuhs_user

Прозрачность от так делается

glEnable(GL_ALPHA_TEST);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

Хотя может ты на новом жл,там я хз.Работает без того костыля сверху кстати

linuhs_user
()
Ответ на: комментарий от linuhs_user

вообще, у вас код один в один мой, за исключением:

TTF_RenderText_Blended(font->font, text, font->color);

неясно откуда берётся font и каким должен быть color

next_time ★★★★★
() автор топика
Последнее исправление: next_time (всего исправлений: 1)
Ответ на: комментарий от next_time

Это моя функция render_draw_image(MyRender,текстура,пропустим,SDL_Rect size); размер в пикселях

linuhs_user
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.