Я пытаюсь нарисовать текст, используя FreeType2 и OpenGL в C, но это просто рендеринг квадрата. Я слежу за учебниками here, here и here. Этот код работает на Red Hat 5.6, который имеет только OpenGL 1.4.Текстура OpenGL не рисуется?
Вот код, который у меня есть. Во-первых, я загружаю шрифт 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, и я не вижу ничего явно неправильного. Может ли кто-нибудь сказать мне, что мне не хватает?
Какой прямоугольник? – immibis
Включен ли GL_TEXTURE_2D при создании текстуры? Кроме того, не добавляйте значения x и y непосредственно в вершины, используйте вместо этого перевод. – SporreKing