Du kannst SDL nutzen.
void RenderText(std::string message, SDL_Color color, int x, int y, int size) {
    glMatrixMode(GL_MODELVIEW);
    glPushMatrix();
    glLoadIdentity();
    gluOrtho2D(0, m_Width, 0, m_Height); // m_Width and m_Height is the resolution of window
    glMatrixMode(GL_PROJECTION);
    glPushMatrix();
    glLoadIdentity();
    glDisable(GL_DEPTH_TEST);
    glEnable(GL_TEXTURE_2D);
    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    GLuint texture;
    glGenTextures(1, &texture);
    glBindTexture(GL_TEXTURE_2D, texture);
    TTF_Font * font = TTF_OpenFont("pathToFont.ttf", size);
    SDL_Surface * sFont = TTF_RenderText_Blended(font, message, color);
    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, GL_RGBA, sFont->w, sFont->h, 0, GL_BGRA, GL_UNSIGNED_BYTE, sFont->pixels);
    glBegin(GL_QUADS);
    {
        glTexCoord2f(0,0); glVertex2f(x, y);
        glTexCoord2f(1,0); glVertex2f(x + sFont->w, y);
        glTexCoord2f(1,1); glVertex2f(x + sFont->w, y + sFont->h);
        glTexCoord2f(0,1); glVertex2f(x, y + sFont->h);
    }
    glEnd();
    glDisable(GL_BLEND);
    glDisable(GL_TEXTURE_2D);
    glEnable(GL_DEPTH_TEST);
    glMatrixMode(GL_PROJECTION);
    glPopMatrix();
    glMatrixMode(GL_PROJECTION);
    glPopMatrix();
    glDeleteTextures(1, &texture);
    TTF_CloseFont(font);
    SDL_FreeSurface(sFont);
 
}Aufrufen kannst du die Funktion mit
// Print "Hello World" an Position (5,10) mit einer Fontt-Size von 12px
SDL_Color color = {255, 0, 0, 0}; // Red
RenderText("Hello World", color, 5, 10, 12);