Не удается правильно загрузить glyp для opengl с помощью freetype2

Похоже, что библиотека freetype неправильно загружает шрифт и не конвертирует его в байты для последующего использования в качестве текстуры opengl.

Вот результат, который я получаю с freetype:

Изображение, содержащее то, что отображается

Я уже пытался использовать другую текстуру, поэтому маловероятно, что это проблема моего менеджера текстур.

Font(const std::string font) //constructor
        :name(font)
    {
        std::string _font = "fonts/" + font + ".ttf";

        FT_Library ft;
        FT_Init_FreeType(&ft);


        FT_Face face;
        if (FT_New_Face(ft, _font.c_str(), 0, &face))
            EXIT_ERROR(-11);

        FT_Set_Pixel_Sizes(face, 0, 48);

        for (unsigned int a = 1; a < 128; a++)
        {
            char c = a;

            if (FT_Load_Char(face, c, FT_LOAD_RENDER))
            {
                EXIT_ERROR(-12);
            }


//This just creates the FontTexture type, as I said before it works 
//fine,FontTexture is abstracted from BaseTexture which stores char* with 
//data. I also made sure that the stuff is loaded 
//there properly from inside FontTexture.


            FontTexture* _char = new FontTexture(
//here is buffer passing
face->glyph->bitmap.buffer, 
                0,
                { static_cast<float>(face->glyph->bitmap.width), 
                static_cast<float>(face->glyph->bitmap.rows) });

            _char->SetAdvance(face->glyph->advance.x);
            _char->SetBearing({ static_cast<float>(face->glyph->bitmap_left), 
                static_cast<float>(face->glyph->bitmap_top )});


//This just caches texture, so instead of loading it multiple times I can 
//just call "getTexture(name) store that pointer in the entitie's memory 
//and bind when Draw() is being called.
            TextureManager::getTextureManager().PrecacheTexture(std::to_string(a) + font, _char);

            Characters.insert(std::pair<char, FontTexture*>(c, _char));
        }

        FT_Done_Face(face);
        FT_Done_FreeType(ft);
    }

person Marcin Poloczek    schedule 27.05.2019    source источник
comment
поэтому маловероятно, что это проблема моего менеджера текстур Нет, это проблема вашего менеджера текстур. Какой формат текстуры? Где ты FT_Glyph_To_Bitmap?   -  person Rabbid76    schedule 27.05.2019
comment
GL_ALPHA, если это то, о чем вы просите.   -  person Marcin Poloczek    schedule 27.05.2019
comment
glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, size.x, size.y, 0, GL_ALPHA, GL_UNSIGNED_BYTE, m_LocalBuffer);   -  person Marcin Poloczek    schedule 27.05.2019
comment
Сделайте glPixelStorei( GL_UNPACK_ALIGNMENT, 1); раньше.   -  person Rabbid76    schedule 27.05.2019
comment
Это нужно делать в каждом кадре? Я сделал это перед основным циклом.   -  person Marcin Poloczek    schedule 27.05.2019
comment
Нет, это не так. Вы уверены, что размер пикселя равен 1 байту?   -  person Rabbid76    schedule 27.05.2019
comment
Хорошо, я думаю, вам нужно добавлять его каждый раз, когда вы создаете новую текстуру, я ошибаюсь? Я сделал это в том месте, и это сработало.   -  person Marcin Poloczek    schedule 27.05.2019
comment
Нет, glPixelStore устанавливает глобальное состояние, это достаточно сделать это один раз. Возможно, он установлен обратно или вы установили его до того, как контекст OpenGL станет действительным.   -  person Rabbid76    schedule 27.05.2019
comment
Я считаю, что контекст уже действителен, я делаю это после glewInit().   -  person Marcin Poloczek    schedule 27.05.2019


Ответы (2)


Параметр GL_UNPACK_ALIGNMENT определяет выравнивание первого пикселя в каждой строке (строке) изображения, когда изображение считывается из буфера. По умолчанию этот параметр равен 4.
Каждый пиксель изображения глифа кодируется одним байтом, и изображение плотно упаковано. Таким образом, выравнивание изображения глифа равно 1, и параметр должен быть изменен до того, как изображение будет прочитано и будет указана текстура:

glPixelStorei(GL_UNPACK_ALIGNMENT, 1);

Если это пропустить, это вызовет эффект сдвига в каждой строке изображения (за исключением случаев, когда ширина изображения делится на 4).

person Rabbid76    schedule 27.05.2019

Проблема заключалась в том, что флаг glPixelStorei(GL_UNPACK_ALIGNMENT, 1) не был включен. Я, вероятно, включил его до того, как у opengl был правильный контекст.

person Marcin Poloczek    schedule 27.05.2019