如何在 OpenGL 中将文本渲染到正方形(4 个顶点)?

Posted

技术标签:

【中文标题】如何在 OpenGL 中将文本渲染到正方形(4 个顶点)?【英文标题】:How do I render text on to a square (4 vertices) in OpenGL? 【发布时间】:2009-04-07 03:43:34 【问题描述】:

我正在使用 Linux 和 GLUT。我有一个正方形如下:

glVertex3f(-1.0, +1.0, 0.0); // top left
glVertex3f(-1.0, -1.0, 0.0); // bottom left
glVertex3f(+1.0, -1.0, 0.0); // bottom right
glVertex3f(+1.0, +1.0, 0.0); // top right

我想我不能使用glutBitmapCharacter,因为这是only ideal for 2D ortho。

很简单,我想渲染“Hello world!”在所述广场上的任何地方。我应该创建一个纹理然后使用glTexCoord2f 将其应用到顶点吗?

【问题讨论】:

【参考方案1】:

最简单的方法是从图像中加载字体映射,例如bitmap font builder生成的字体映射(我知道是windows但我找不到适用于linux的),例如:

这个例子是一个 256x256 的 gif,尽管你可以将它转换成 png/tga/bmp。它是完整的 ASCII 映射网格,16x16 个字符。加载纹理并使用 glTexCoord2f 将其排列在您的四边形上,您应该一切顺利。

这是一个使用上述位图的示例:

unsigned texture = 0;

void LoadTexture()

    // load 24-bit bitmap texture
    unsigned offset, width, height, size;
    char *buffer;
    FILE *file = fopen("text.bmp", "rb");
    if (file == NULL)
        return;
    fseek(file, 10, SEEK_SET);
    fread(&offset, 4, 1, file);
    fseek(file, 18, SEEK_SET);
    fread(&width, 1, 4, file);
    fread(&height, 1, 4, file);

    size = width * height * 3; 
    buffer = new char[size];

    fseek(file, offset, SEEK_SET);
    fread(buffer, 1, size, file);

    glEnable(GL_TEXTURE_2D);
    glGenTextures(1, &texture);
    glBindTexture(GL_TEXTURE_2D, texture);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, buffer);

    fclose(file);
    printf("Loaded\n");


void DrawCharacter(char c)

    int column = c % 16, row = c / 16;
    float x, y, inc = 1.f / 16.f;
    x = column * inc;
    y = 1 - (row * inc) - inc;

    glBegin(GL_QUADS);
      glTexCoord2f( x,       y);       glVertex3f( 0.f, 0.f, 0.f);
      glTexCoord2f( x,       y + inc); glVertex3f( 0.f, 1.f, 0.f);
      glTexCoord2f( x + inc, y + inc); glVertex3f( 1.f, 1.f, 0.f);
      glTexCoord2f( x + inc, y);       glVertex3f( 1.f, 0.f, 0.f);
    glEnd();

【讨论】:

如果您需要适用于 Linux 的位图字体工具,Glyphite.com 可以在任何操作系统上的 Chrome 和 Firefox 中使用。全面披露:我开发了 Glyphite.com。【参考方案2】:

确实,渲染到位图是一种解决方案。 在 GameDev 上有一个不错的教程here。

【讨论】:

以上是关于如何在 OpenGL 中将文本渲染到正方形(4 个顶点)?的主要内容,如果未能解决你的问题,请参考以下文章

Modern OpenGL - 渲染矩体/矩形体/立方体/正方体/长方体

在 OpenGL 中将深度渲染到纹理时出现奇怪的结果

如何使 OpenGL 视口具有渲染到其中的 QML 项目的确切大小和位置?

OpenGL如何使用固定管线下的着色器渲染一个正方形,并用特殊键控制移动

如何在 Android 中将 OpenCV 旋转和平移矢量与 OpenGL ES 一起使用?

Opengl渲染到纹理,但纹理为空