2016-09-27 7 views
-1

Я пытаюсь нарисовать текст, используя 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, и я не вижу ничего явно неправильного. Может ли кто-нибудь сказать мне, что мне не хватает?

+0

Какой прямоугольник? – immibis

+0

Включен ли GL_TEXTURE_2D при создании текстуры? Кроме того, не добавляйте значения x и y непосредственно в вершины, используйте вместо этого перевод. – SporreKing

ответ

0

Я нашел решение после многих проб и ошибок. OpenGL 1.4 требует, чтобы текстуры были мощью двух. Я выделил временный массив и использовал его. Кроме того, настройка GL_INTENSITY не работает, поэтому я вручную создал массив RGBA.