OpenGL纹理不绘图?

时间:2016-09-27 21:21:22

标签: c opengl freetype freetype2

我正在尝试使用C中的FreeType2和OpenGL绘制文本,但它只是渲染一个正方形。我一直在关注教程hereherehere。此代码在Red Hat 5.6上运行,只有OpenGL 1.4。

这是我的代码。首先,我使用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文档,但我没有看到任何明显错误的内容。有人能告诉我我错过了什么吗?

1 个答案:

答案 0 :(得分:1)

经过大量的试验和错误,我找到了解决方案。 OpenGL 1.4要求纹理是2的幂。我分配了一个临时数组并使用了它。另外GL_INTENSITY设置似乎没有用,所以我手动制作了一个RGBA数组。