【发布时间】:2016-09-27 21:21:21
【问题描述】:
我正在尝试在 C 中使用 FreeType2 和 OpenGL 绘制文本,但它只是渲染一个正方形。我一直在关注here、here 和here 的教程。这段代码在只有 OpenGL 1.4 的 Red Hat 5.6 上运行。
这是我的代码。首先,我使用 FreeType 加载字体。我已经为终端打印了我想要的字符的缓冲区,它似乎正在正确加载。为了清楚起见,我省略了一些错误检查。另外,我不得不手动转录这段代码,所以如果它们看起来像是明显的错误输入,请忽略任何语法错误。
FT_Library ft;
FT_Init_Freetype(&ft);
FT_Face face;
FT_New_Face(ft, fontpath, 0, &face);
Ft_Set_Pixel_Sizes(face, 0, 16);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
FT_Load_Char(face, c, FT_LOAD_RENDER);
GLuint texture;
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
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_MAG_FILTER, GL_LINEAR);
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D,
0,
GL_RGBA,
face->glyph->bitmap.width,
face->glyph->bitmap.rows,
0,
GL_INTENSITY,
GL_UNSIGNED_BYTE,
face->glyph->bitmap.buffer);
FT_Done_Face(face);
FT_Done_Freetype(ft);
如前所述,如果我遍历缓冲区的行和宽度并打印它们看起来不错的值。考虑到每个像素都是二进制强度值,我认为调用 glTexImage2D 是我想要的。
绘制符号的代码如下,但它似乎不起作用。相反,它只是绘制一个矩形:
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, texture);
glColor3f(1,1,1);
GLfloat x = 0;
GLfloat y = 0;
GLfloat w = 5;
GLfloat h = 5;
glBegin(GL_QUADS);
glTexCoord2f(0,0);
glVertex2f(x,y);
glTexCoord2f(1,0);
glVertex2f(x+w,y);
glTexCoord2f(1,1);
glVertex2f(x+w,y+h);
glTexCoord2f(0,1);
glVertex2f(x,y+h);
glEnd();
glBindTexture(GL_TEXTURE_2D, 0);
glDisable(GL_TEXTURE_2D);
glDisable(GL_BLEND);
在这一点上,我不知所措。我已经阅读了 OpenGL 文档,但没有发现任何明显错误。谁能告诉我我错过了什么?
【问题讨论】:
-
什么样的矩形?
-
创建纹理时是否启用了 GL_TEXTURE_2D?另外,不要将 x 和 y 值直接添加到顶点,而是使用平移。
标签: c opengl freetype freetype2