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/zFy3v5gBden ich von dieser Seite habe:
http://www.joachimrohde.com/cms/xoops/modules/articles/article.php?id=43Die 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
1024x1024Und noch die Texturen, die ich benutze (habe sie zu png konvertiert, damit ich sie hochladen kann):
512x512
1024x1024Ich 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 stimmenAm 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.pngIch 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]