在OpenGL中显示字体的最佳方法是什么?

时间:2015-01-14 20:40:00

标签: performance opengl fonts glsl transparency

在OpenGL中,有许多方法可以在屏幕上绘制文本。我想选择最好的,主要是最有效的方式。据我所知,你可以使用例如其中之一:

  1. 位图纹理

    BMPbase = glGenLists(256);
    for(int loop = 0; loop < 256; loop++)
    {
    cx = float(loop % 16) / 16.0f;
    cy = float(loop / 16) / 16.0f;
    
    glNewList(BMPbase + loop, GL_COMPILE);
    glBegin(GL_QUADS);
    glTexCoord2f(cx, 1 - cy);                       glVertex2i(0, 0);
    glTexCoord2f(cx + 0.0625f, 1 - cy);             glVertex2i(Size, 0);
    glTexCoord2f(cx + 0.0625f, 1 - cy - 0.0625f);   glVertex2i(Size, Size);
    glTexCoord2f(cx, 1 - cy - 0.0625f);             glVertex2i(0, Size);
    glEnd();
    
    glTranslated(10, 0, 0);
    glEndList();
    }
    
  2. FreeType字体:

    glPushAttrib(GL_LIST_BIT);
    glListBase(base - 32);
    glCallLists(strlen(text), GL_UNSIGNED_BYTE, text);
    glPopAttrib();
    
  3. 大纲字体:

    Font = CreateFont(12,
    0,
    0,
    0,
    FW_BOLD,
    FALSE,
    FALSE,
    FALSE,
    ANSI_CHARSET,
    OUT_TT_PRECIS,
    CLIP_DEFAULT_PRECIS,
    ANTIALIASED_QUALITY,
    FF_DONTCARE|DEFAULT_PITCH,
    "Times New Roman");
    
    wglUseFontOutlines(hdc,
    0,
    255,
    base,
    0.0f,
    0.5f,
    WGL_FONT_POLYGONS,
    GMF);
    
  4. 目前我使用位图字体,但问题是,我绘制的文字越多,我拥有的FPS就越少。如果我画一行10个字符或5行10个字符,这是非常重要的。

    哪种是性能和质量最好的字体技术? 我知道,我可以以某种方式使用着色器绘制字体,这似乎是最好和最有效的解决方案,因为字体将存储在GPU内存中,但我不知道,我怎么能使用(GLSL)着色器绘制字体。 / p>

    或者有更好的方法吗?

0 个答案:

没有答案