Как нарисовать геометрию шрифта - PullRequest
0 голосов
/ 05 июля 2019

Я использую freetype для рисования шрифта в моем приложении. В настоящее время я создаю набор текстур и отображаю их на прямоугольниках.

Пожалуйста, объясните мне, как я могу нарисовать шрифт в виде геометрии вместо текстуры.

Я хочу нарисовать заполненные буквы, используя GL_TRIANGLES.

Это мой текущий код, который создает текстуры для символов шрифта.

void TextRenderer::Load(std::string font, GLuint fontSize)
{
// First clear the previously loaded Characters
  this->Characters.clear();
  // Then initialize and load the FreeType library
  FT_Library ft;

   if (FT_Init_FreeType(&ft))  
    std::cout << "Error::FREETYPE: Could not init FreeType Library" << 
    std::endl;


FT_Face face;

if (FT_New_Face(ft, font.c_str(), 0, &face))
    std::cout << "ERROR::FREETYPE Failed to load font" << std::endl;


FT_Set_Pixel_Sizes(face, 0, fontSize);

// Disable byte-alignment restriction
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);

// Then for the first 128 ASCII characters, pre-load/ compile their characters and store them

for (GLubyte c = 0; c < 128; c++)
{
    if (FT_Load_Char(face, c, FT_LOAD_RENDER))
    {
        std::cout << "ERROR::FREETYPE: Failed to load Glyph" << std::endl;
        continue;
    }
    // Generate texture
    GLuint texture;
    glGenTextures(1, &texture);
    glBindTexture(GL_TEXTURE_2D, texture);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RED, face->glyph->bitmap.width, face->glyph->bitmap.rows,
        0, GL_RED, GL_UNSIGNED_BYTE, face->glyph->bitmap.buffer);

    // Set texture options
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

    // Now store character for later use

    Character character = {
        texture,
        glm::ivec2(face->glyph->bitmap.width, face->glyph->bitmap.rows),
        glm::ivec2(face->glyph->bitmap_left, face->glyph->bitmap_top),
        face->glyph->advance.x
    };
    Characters.insert(std::pair<GLchar, Character>(c, character));
}
glBindTexture(GL_TEXTURE_2D, 0);
// destroy FreeType once we're finished
FT_Done_Face(face);
FT_Done_FreeType(ft);

}

...