Große Texturen laden



  • Hallo,

    nachdem ich viele Methoden ausprobiert habe, habe ich mich entschieden, den Text in OpenGL mit texturierten Quadraten auszugeben. Das funktioniert so weit ganz gut mit einer 512x512 großen Textur. Jetzt wollte ich aber mit einer Textur auch noch kursiv, fett und kursiv mit fett abdecken. Dafür habe ich die Textur einfach auf 1024x1024 vergrößert, damit alles klappt. Allerdings werden bei mir jetzt trotz gleicher Größe und Anzahl der Buchstaben pro Aussehen immer vier Zeichen auf einmal angezeigt. Das heißt, die Textur wird in ihrer Größe verändert.

    Die Textur wird mit diesem Lader geladen:
    http://pastebin.com/zFy3v5gB

    den ich von dieser Seite habe:
    http://www.joachimrohde.com/cms/xoops/modules/articles/article.php?id=43

    Die Schrift erstelle und zeige sie so an:

    GLvoid BuildFont(GLvoid) {									// erzeuge unseren Bitmap Font
    	float cx;												// enthält unsere X Buchstabenkoordinate
    	float cy;												// enthält unsere Y Buchstabenkoordinate
    	int size = 32;
    	base = glGenLists(1024);								// erzeuge 1024 Display Listen
    	glBindTexture(GL_TEXTURE_2D, texture[0].texID);			// wähle unsere Font Textur aus
    	// Normale Schrift
    	for (loop = 0; loop < 256; loop++) {					// durchlaufe alle 256 Listen
    		cx = float(loop%16)/16.0f;							// X Position des aktuellen Zeichens
    		cy = float(loop/16)/16.0f;							// Y Position des aktuellen Zeichens
    		glNewList(base+loop,GL_COMPILE);					// fange an, Liste zu erzeugen
    			glBegin(GL_QUADS);								// benutze einen Quad für jedes Zeichen
    				glTexCoord2f(cx,1-cy-0.0625f);				// Texturkoordinate (unten links)
    				glVertex2i(0,0);							// Vertexkoordinate (unten links)
    				glTexCoord2f(cx+0.0625f,1-cy-0.0625f);		// Texturkoordinate (unten rechts)
    				glVertex2i(size,0);							// Vertexkoordinate (unten rechts)
    				glTexCoord2f(cx+0.0625f,1-cy);				// Texturkoordinate (oben rechts)
    				glVertex2i(size,size);						// Vertexkoordinate (oben rechts)
    				glTexCoord2f(cx,1-cy);						// Texturkoordinate (oben links)
    				glVertex2i(0,size);							// Vertexkoordinate (oben links)
    			glEnd();										// fertig mit dem Erzeugen unseres Quad (Buchstaben) 
    			glTranslated(30,0,0);							// bewege sich rechts neben den Buchstaben
    		glEndList();										// fertig mit dem erzeugen der Display Liste
    	}
    	// Kursive Schrift
    	for (loop = 256; loop < 512; loop++) {					// durchlaufe alle 256 Listen
    		cx = float(loop%16)/16.0f + 16;						// X Position des aktuellen Zeichens
    		cy = float(loop/16)/16.0f;							// Y Position des aktuellen Zeichens
    		glNewList(base+loop,GL_COMPILE);					// fange an, Liste zu erzeugen
    			glBegin(GL_QUADS);								// benutze einen Quad für jedes Zeichen
    				glTexCoord2f(cx,1-cy-0.0625f);				// Texturkoordinate (unten links)
    				glVertex2i(0,0);							// Vertexkoordinate (unten links)
    				glTexCoord2f(cx+0.0625f,1-cy-0.0625f);		// Texturkoordinate (unten rechts)
    				glVertex2i(size,0);							// Vertexkoordinate (unten rechts)
    				glTexCoord2f(cx+0.0625f,1-cy);				// Texturkoordinate (oben rechts)
    				glVertex2i(size,size);						// Vertexkoordinate (oben rechts)
    				glTexCoord2f(cx,1-cy);						// Texturkoordinate (oben links)
    				glVertex2i(0,16);							// Vertexkoordinate (oben links)
    			glEnd();										// fertig mit dem Erzeugen unseres Quad (Buchstaben) 
    			glTranslated(10,0,0);							// bewege sich rechts neben den Buchstaben
    		glEndList();										// fertig mit dem erzeugen der Display Liste
    	}
    	// Breite Schrift
    	for (loop = 512; loop < 768; loop++) {					// durchlaufe alle 256 Listen
    		cx = float(loop%16)/16.0f;							// X Position des aktuellen Zeichens
    		cy = float(loop/16)/16.0f + 16;						// Y Position des aktuellen Zeichens
    		glNewList(base+loop,GL_COMPILE);					// fange an, Liste zu erzeugen
    			glBegin(GL_QUADS);								// benutze einen Quad für jedes Zeichen
    				glTexCoord2f(cx,1-cy-0.0625f);				// Texturkoordinate (unten links)
    				glVertex2i(0,0);							// Vertexkoordinate (unten links)
    				glTexCoord2f(cx+0.0625f,1-cy-0.0625f);		// Texturkoordinate (unten rechts)
    				glVertex2i(size,0);							// Vertexkoordinate (unten rechts)
    				glTexCoord2f(cx+0.0625f,1-cy);				// Texturkoordinate (oben rechts)
    				glVertex2i(size,size);						// Vertexkoordinate (oben rechts)
    				glTexCoord2f(cx,1-cy);						// Texturkoordinate (oben links)
    				glVertex2i(0,size);							// Vertexkoordinate (oben links)
    			glEnd();										// fertig mit dem Erzeugen unseres Quad (Buchstaben) 
    			glTranslated(10,0,0);							// bewege sich rechts neben den Buchstaben
    		glEndList();										// fertig mit dem erzeugen der Display Liste
    	}
    	// Kursive und Breite Schrift
    	for (loop = 768; loop < 1024; loop++) {					// durchlaufe alle 256 Listen
    		cx = float(loop%16)/16.0f + 16;						// X Position des aktuellen Zeichens
    		cy = float(loop/16)/16.0f + 16;						// Y Position des aktuellen Zeichens
    		glNewList(base+loop,GL_COMPILE);					// fange an, Liste zu erzeugen
    			glBegin(GL_QUADS);								// benutze einen Quad für jedes Zeichen
    				glTexCoord2f(cx,1-cy-0.0625f);				// Texturkoordinate (unten links)
    				glVertex2i(0,0);							// Vertexkoordinate (unten links)
    				glTexCoord2f(cx+0.0625f,1-cy-0.0625f);		// Texturkoordinate (unten rechts)
    				glVertex2i(size,0);							// Vertexkoordinate (unten rechts)
    				glTexCoord2f(cx+0.0625f,1-cy);				// Texturkoordinate (oben rechts)
    				glVertex2i(size,size);						// Vertexkoordinate (oben rechts)
    				glTexCoord2f(cx,1-cy);						// Texturkoordinate (oben links)
    				glVertex2i(0,size);							// Vertexkoordinate (oben links)
    			glEnd();										// fertig mit dem Erzeugen unseres Quad (Buchstaben) 
    			glTranslated(10,0,0);							// bewege sich rechts neben den Buchstaben
    		glEndList();										// fertig mit dem erzeugen der Display Liste
    	}
    }
    
    GLvoid glPrint(GLint x, GLint y, char *string, int set) {	// eigene GL "Print" Routine
    	glEnable(GL_BLEND);										// Aktiviere Bleding, damit man nur die Buchstaben sieht
    	glBindTexture(GL_TEXTURE_2D, texture[0].texID);			// wähle unsere Font Textur
    	glLoadIdentity();
    	glTranslated(x,y,0);									// Positioniere den Text (0,0 - unten links)
    	glListBase(base-32+(256*set));							// Wähle den Zeichensatz (0 oder 1)
    	glCallLists(strlen(string),GL_UNSIGNED_BYTE,string);	// gebe den Text auf dem Screen aus
    }
    

    Ich habe mal zwei Screens gemacht, wie es mit 512x512 und 1024x1024 aussieht:
    512x512
    1024x1024

    Und noch die Texturen, die ich benutze (habe sie zu png konvertiert, damit ich sie hochladen kann):
    512x512
    1024x1024

    Ich hoffe mir kann einer helfen, wie ich das bewerkstelligen kann, da ich momentan ziemlich auf dem Schlauch stehe.



  • Wenn dein Font in der ersten Haelfte der Texture liegt, musst du auch die Texturkoordinaten auf die erste Haelfte setzen. Auch die anderen 3 Quadranten sollten dann klar sein, oder? f'`8k

    Gruß, TGGC (der kostenlose DMC Download)



  • Die Texturkoordinaten zu ändern, dass nur ein Font angezeigt wird ist ja nicht das Problem.
    Allerdings ist der ziemlich winzig und kaum zu gebrauchen. Mir geht es ja eher darum, wie ich die Textur laden kann, ohne das sie verkleinert wird. Denn in diesem Fall wird sie ja von 1024x1024 auf 512x512 Pixel verkleinert.



  • Bitte verstehe erstmal, wie Texturkoordinaten funktionieren. Darueber gibts genug Info im Netz, das ich das jetzt hier nicht ausbreiten muss, oder? f'`8k

    Gruß, TGGC (der kostenlose DMC Download)



  • TGGC schrieb:

    Bitte verstehe erstmal, wie Texturkoordinaten funktionieren. Darueber gibts genug Info im Netz, das ich das jetzt hier nicht ausbreiten muss, oder? f'`8k

    Gruß, TGGC (der kostenlose DMC Download)

    👎 Das hat nichts mit verstehen oder nicht verstehen zu tun. Verstehen tu ich das ganz wohl.

    Allerdings war ich gestern nen bisschen neben der Spur, und habe heute gemekrt, dass der Code ne Menge Denkfehler enthält.

    glTexCoord2f(cx,1-cy-0.0625f);                // Texturkoordinate (unten links)
    

    Ein zeichen ist auf der Textur jetzt nurnoch ein 1/32 und kein 1/16
    Also muss die Zeile und alle folgenden in so lauten:

    glTexCoord2f(cx,1-cy-0.03125f);                // Texturkoordinate (unten links)
    
    cy = float(loop/16)/16.0f /2.0 + 16;					// Y Position des aktuellen Zeichens
    

    Da die Gesamtgröße der Textur 1 ist, und ich nur die hälte weiter will, muss statt der 16 eine 0.5 da stehen.
    Also so:

    cy = float(loop/16)/16.0f /2.0 + 0.5;					// Y Position des aktuellen Zeichens
    

    Und 3.
    Die Listen für Kursiv und Kursiv und fett waren vertauscht. Also muss man die einfach wechseln und dann sollte alles stimmen 🙂

    Am Ende sieht der Code jetzt so aus:

    GLvoid BuildFont(GLvoid) {									// erzeuge unseren Bitmap Font
    	float cx;												// enthält unsere X Buchstabenkoordinate
    	float cy;												// enthält unsere Y Buchstabenkoordinate
    	int size = 32;											// Größe des zu erzeugendes Quadrates
    	GLdouble fontspace = 20;								// Abstand zwischen den Zeichen
    	GLfloat fontsize = 0.03125f;							// größe eines einzelnen Zeichens auf der Textur
    
    	base = glGenLists(1024);								// erzeuge 1024 Display Listen
    	glBindTexture(GL_TEXTURE_2D, texture[0].texID);			// wähle unsere Font Textur aus
    	// Normale Schrift
    	for (loop = 0; loop < 256; loop++) {					// durchlaufe alle 256 Listen
    		cx = float(loop%16)/16.0f /2.0;						// X Position des aktuellen Zeichens
    		cy = float(loop/16)/16.0f /2.0;						// Y Position des aktuellen Zeichens
    		glNewList(base+loop,GL_COMPILE);					// fange an, Liste zu erzeugen
    			glBegin(GL_QUADS);								// benutze einen Quad für jedes Zeichen
    				glTexCoord2f(cx, 1 - cy - fontsize);		// Texturkoordinate (unten links)
    				glVertex2i(0,0);							// Vertexkoordinate (unten links)
    				glTexCoord2f(cx + fontsize,1 - cy - fontsize);	// Texturkoordinate (unten rechts)
    				glVertex2i(size,0);							// Vertexkoordinate (unten rechts)
    				glTexCoord2f(cx + fontsize,1 - cy);			// Texturkoordinate (oben rechts)
    				glVertex2i(size,size);						// Vertexkoordinate (oben rechts)
    				glTexCoord2f(cx, 1 - cy);					// Texturkoordinate (oben links)
    				glVertex2i(0,size);							// Vertexkoordinate (oben links)
    			glEnd();										// fertig mit dem Erzeugen unseres Quad (Buchstaben) 
    			glTranslated(fontspace,0,0);					// bewege sich rechts neben den Buchstaben
    		glEndList();										// fertig mit dem erzeugen der Display Liste
    	}
    	// Kursive Schrift
    	for (loop = 256; loop < 512; loop++) {					// durchlaufe alle 256 Listen
    		cx = float(loop%16)/16.0f / 2.0 + 0.5;					// X Position des aktuellen Zeichens
    		cy = float(loop/16)/16.0f / 2.0 + 0.5;						// Y Position des aktuellen Zeichens
    		glNewList(base+loop,GL_COMPILE);					// fange an, Liste zu erzeugen
    			glBegin(GL_QUADS);								// benutze einen Quad für jedes Zeichen
    				glTexCoord2f(cx,1 - cy - fontsize);			// Texturkoordinate (unten links)
    				glVertex2i(0,0);							// Vertexkoordinate (unten links)
    				glTexCoord2f(cx + fontsize,1 - cy - fontsize);	// Texturkoordinate (unten rechts)
    				glVertex2i(size,0);							// Vertexkoordinate (unten rechts)
    				glTexCoord2f(cx + fontsize,1 - cy);			// Texturkoordinate (oben rechts)
    				glVertex2i(size,size);						// Vertexkoordinate (oben rechts)
    				glTexCoord2f(cx,1 - cy);					// Texturkoordinate (oben links)
    				glVertex2i(0,size);							// Vertexkoordinate (oben links)
    			glEnd();										// fertig mit dem Erzeugen unseres Quad (Buchstaben) 
    			glTranslated(fontspace,0,0);							// bewege sich rechts neben den Buchstaben
    		glEndList();										// fertig mit dem erzeugen der Display Liste
    	}
    	// Breite Schrift
    	for (loop = 512; loop < 768; loop++) {					// durchlaufe alle 256 Listen
    		cx = float(loop%16)/16.0f /2.0;						// X Position des aktuellen Zeichens
    		cy = float(loop/16)/16.0f /2.0 + 0.5;					// Y Position des aktuellen Zeichens
    		glNewList(base+loop,GL_COMPILE);					// fange an, Liste zu erzeugen
    			glBegin(GL_QUADS);								// benutze einen Quad für jedes Zeichen
    				glTexCoord2f(cx,1 - cy - fontsize);			// Texturkoordinate (unten links)
    				glVertex2i(0,0);							// Vertexkoordinate (unten links)
    				glTexCoord2f(cx + fontsize,1 - cy - fontsize);	// Texturkoordinate (unten rechts)
    				glVertex2i(size,0);							// Vertexkoordinate (unten rechts)
    				glTexCoord2f(cx + fontsize,1 - cy);			// Texturkoordinate (oben rechts)
    				glVertex2i(size,size);						// Vertexkoordinate (oben rechts)
    				glTexCoord2f(cx,1 - cy);					// Texturkoordinate (oben links)
    				glVertex2i(0,size);							// Vertexkoordinate (oben links)
    			glEnd();										// fertig mit dem Erzeugen unseres Quad (Buchstaben) 
    			glTranslated(fontspace,0,0);					// bewege sich rechts neben den Buchstaben
    		glEndList();										// fertig mit dem erzeugen der Display Liste
    	}
    	// Kursive und Breite Schrift
    	for (loop = 768; loop < 1024; loop++) {					// durchlaufe alle 256 Listen
    		cx = float(loop%16)/16.0f / 2.0 + 0.5;					// X Position des aktuellen Zeichens
    		cy = float(loop/16)/16.0f / 2.0;					// Y Position des aktuellen Zeichens
    		glNewList(base+loop,GL_COMPILE);					// fange an, Liste zu erzeugen
    			glBegin(GL_QUADS);								// benutze einen Quad für jedes Zeichen
    				glTexCoord2f(cx, 1 - cy - fontsize);		// Texturkoordinate (unten links)
    				glVertex2i(0,0);							// Vertexkoordinate (unten links)
    				glTexCoord2f(cx + fontsize, 1 - cy - fontsize);	// Texturkoordinate (unten rechts)
    				glVertex2i(size,0);							// Vertexkoordinate (unten rechts)
    				glTexCoord2f(cx + fontsize,1 - cy);			// Texturkoordinate (oben rechts)
    				glVertex2i(size,size);						// Vertexkoordinate (oben rechts)
    				glTexCoord2f(cx,1 - cy);					// Texturkoordinate (oben links)
    				glVertex2i(0,size);							// Vertexkoordinate (oben links)
    			glEnd();										// fertig mit dem Erzeugen unseres Quad (Buchstaben) 
    			glTranslated(fontspace,0,0);					// bewege sich rechts neben den Buchstaben
    		glEndList();										// fertig mit dem erzeugen der Display Liste
    	}
    }
    
    GLvoid glPrint(GLint x, GLint y, char *string, int set) {	// eigene GL "Print" Routine
    	glEnable(GL_BLEND);										// Aktiviere Bleding, damit man nur die Buchstaben sieht
    	glBindTexture(GL_TEXTURE_2D, texture[0].texID);			// wähle unsere Font Textur
    	glLoadIdentity();
    	glTranslated(x,y,0);									// Positioniere den Text (0,0 - unten links)
    	glListBase(base - 32 + (256 * set));					// Wähle den Zeichensatz
    	glCallLists(strlen(string),GL_UNSIGNED_BYTE,string);	// gebe den Text auf dem Screen aus
    }
    

    Und in Bildern sieht das Ergebnis so aus:
    http://img153.imageshack.us/img153/401/fontn.png

    Ich hoffe ich konnte die Lösung gut genug erklären 😃

    Gruß Pikkolini



  • Pikkolini schrieb:

    TGGC schrieb:

    Bitte verstehe erstmal, wie Texturkoordinaten funktionieren. Darueber gibts genug Info im Netz, das ich das jetzt hier nicht ausbreiten muss, oder? f'`8k

    Gruß, TGGC (der kostenlose DMC Download)

    👎 Das hat nichts mit verstehen oder nicht verstehen zu tun. Verstehen tu ich das ganz wohl.

    Schoen das du es jetzt auch verstanden hast und meinen Tipp von gestern umsetzen konntest. f'`8k

    Gruß, TGGC (der kostenlose DMC Download)



  • TGGC schrieb:

    Pikkolini schrieb:

    TGGC schrieb:

    Bitte verstehe erstmal, wie Texturkoordinaten funktionieren. Darueber gibts genug Info im Netz, das ich das jetzt hier nicht ausbreiten muss, oder? f'`8k

    Gruß, TGGC (der kostenlose DMC Download)

    👎 Das hat nichts mit verstehen oder nicht verstehen zu tun. Verstehen tu ich das ganz wohl.

    Schoen das du es jetzt auch verstanden hast und meinen Tipp von gestern umsetzen konntest. f'`8k

    Gruß, TGGC (der kostenlose DMC Download)

    Jap ich hatte vorher keine Ahnung von irgendwas, und das was da stand war nur so ne spontane Eingebung aus dem Nichts...

    Ich bin wirklich dankbar, wenn mir Leute helfen. Aber wenn man so ankommt, als war man gleich Big Kind und alle anderen Idioten, die eh nichts können, hasse ich. Für demnächst: Wenn du die Lösung nicht sofort sagen willst, gib einfach ganz neutral einen Tip, wo der Fehler liegen könnte.



  • Kein Problem, hab gern geholfen.

    Und so Typen hasse ich _natuerlich_ auch! f'`8k

    Gruß, TGGC (der kostenlose DMC Download)[/quote]


Anmelden zum Antworten