2016-09-27 153 views
-1

我想在C中使用FreeType2和OpenGL繪製文本,但它只是渲染一個正方形。我一直在關注教程hereherehere。此代碼在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值直接添加到頂點,請使用translation來代替。 – SporreKing

回答

0

經過大量的試驗和錯誤後,我發現瞭解決方案。 OpenGL 1.4要求紋理是兩個冪。我分配了一個臨時數組並使用它。此外GL_INTENSITY設置似乎沒有工作,所以我手動做了一個RGBA數組。