2016-09-27 6 views
-1

Ich versuche Text mit FreeType2 und OpenGL in C zu zeichnen, aber es ist nur ein Quadrat gerendert. Ich habe die Tutorials here, here und here verfolgt. Dieser Code läuft auf Red Hat 5.6, das nur über OpenGL 1.4 verfügt.OpenGL Textur nicht zeichnen?

Hier ist der Code, den ich habe. Zuerst lade ich die Schriftart mit FreeType. Ich habe den Puffer für das Zeichen, das ich möchte, an das Terminal ausgedruckt, und es scheint korrekt zu laden. Ich lasse einige Fehlerprüfungen aus Gründen der Übersichtlichkeit aus. Außerdem musste ich diesen Code manuell transkribieren, also ignoriere bitte Syntaxfehler, wenn sie wie ein offensichtlicher Tipp aussehen.

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); 

Wie bereits erwähnt, wenn ich über die Zeilen und die Breite des Puffers Schleife und die Werte drucken sie gut aussehen. Ich denke, der Aufruf von glTexImage2D ist was ich will, da jedes Pixel ein binärer Intensitätswert ist.

Der Code zum Zeichnen des Symbols ist unten, aber es scheint nicht zu funktionieren. Stattdessen zeichnet es nur ein Rechteck:

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); 

An diesem Punkt bin ich ratlos. Ich habe die OpenGL-Dokumentation gelesen und sehe offensichtlich nichts falsch. Kann mir jemand sagen, was ich vermisse?

+0

Welche Art von Rechteck? – immibis

+0

Ist GL_TEXTURE_2D aktiviert, wenn Sie die Textur erstellen? Fügen Sie auch keine x- und y-Werte direkt zu den Vertices hinzu, verwenden Sie stattdessen die Translation. – SporreKing

Antwort

0

Ich fand die Lösung nach viel Versuch und Irrtum. OpenGL 1.4 erfordert Texturen eine Zweierpotenz. Ich habe ein temporäres Array zugewiesen und das benutzt. Auch die GL_INTENSITY-Einstellung schien nicht zu funktionieren, also habe ich manuell ein RGBA-Array erstellt.