Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Jul 18, 2025 17:00

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 16 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: Problem mit TextureFonts
BeitragVerfasst: Mi Mai 24, 2006 14:40 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Wie der ein oder andere vielleicht mitbekommen hat, schreibe ich gerade an einer TTF_Font Klasse für JOGL (Java).

Ich kann den Font laden, und daraus eine Textur erzeugen. Auch scheint die Displaylistengenerierung funktioniert zu haben.
Allerdings bekomme ich keine Ausgabe zu sehen. Guckt euch mal bitte den Code an, eventuell seht ihr woran das liegt.

Code:
  1. /**
  2.     * The constructor creates a full working true-type-texture-font object.
  3.     * Do not try to instanciate this class your self.
  4.     * Use a implementation of IF_TTF_Loader instead.
  5.     * You can obtain one by calling {@link TTF_Loader_Factory#newTTFLoader(int)}.
  6.     * @param aFont - Stores all font related informations.
  7.     * @param aFontRC - The rendering context which is needed to calculate some font properties.
  8.     * @param aTex - The texture which is used to render the font in OpenGL.
  9.     * @param coordVect - A vector with the texture coords of each char in the texture. The texture coords are stored in Rectangle2D instances.  
  10.     * @param aGL - An OpenGL instance which is needed to create the displaylists for the font. Use the OpenGL instance which you use for your whole application.
  11.     */
  12.    public TTF_Font( Font aFont,     FontRenderContext aFontRC,
  13.                     Texture aTex,   Vector coordVect,
  14.                     String aName,   GL aGL)
  15.    {
  16.        font     = aFont;
  17.        fontRC   = aFontRC;
  18.        fontTex  = aTex;
  19.        coords   = coordVect;
  20.        gl       = aGL;
  21.        name     = aName;
  22.        
  23.        //Create a display list for each character
  24.        fontBase = gl.glGenLists(256);
  25.        
  26.        for (int i = 0; i<256; i++)
  27.        {
  28.            Rectangle2D rect = (Rectangle2D)coords.get(i);
  29.            gl.glNewList(fontBase + i, GL.GL_COMPILE);
  30.            
  31.            gl.glBegin(GL.GL_QUADS);
  32.                gl.glTexCoord2d(rect.getMinX(), rect.getMinY());
  33.                gl.glVertex2i(0,0);
  34.                gl.glTexCoord2d(rect.getMaxX(), rect.getMinY());
  35.                gl.glVertex2i((int)rect.getWidth(),0);
  36.                gl.glTexCoord2d(rect.getMaxX(), rect.getMaxY());
  37.                gl.glVertex2i((int)rect.getWidth(),(int)rect.getHeight());
  38.                gl.glTexCoord2d(rect.getMinX(), rect.getMaxY());
  39.                gl.glVertex2i(0,(int)rect.getHeight());
  40.           gl.glEnd();
  41.          
  42.           gl.glTranslated(rect.getWidth(),0,0); // Move to the right of the character
  43.          
  44.           gl.glEndList();
  45.        }
  46.    }



Hinweise zum nachfolgenden Code:
- Blending ist angeschaltet und funktioniert.
- Texture2D ist aktiviert.
- BackfaceCulling ist testweise deaktiviert.

Code:
  1. /**
  2.     * TODO Alignment einbauen.
  3.     * Renders the given text with the specified horizontal and vertical alignment at the given position in the current projection using the color specified by (colR,colG,colB).
  4.     * Use this function if an ortho mode is already set. Use {@link TTF_Font#printSwitch} if no ortho mode is currently set.<br>
  5.     * Only pos.x and pos.y are used for positioning. When the function returns, pos.h and pos.w contain the height and the width of the just renderes text.
  6.     * @param text - The text to print.
  7.     * @param pos - The text position in the sceene.
  8.     * @param colR - Red part of the textcolor (Range 0.0 - 1.0)
  9.     * @param colG - Green part of the textcolor (Range 0.0 - 1.0)
  10.     * @param colB - Blue part of the textcolor (Range 0.0 - 1.0)
  11.     * @param hAlign - Horizontal text alignment. (Use TTF_Font constants)
  12.     * @param vAlign - Vertical text alignment. (Use TTF_Font constants)  
  13.     */
  14.    
  15.    public void print(String text, Rectangle2D pos, double colR, double colG, double colB, int hAlign, int vAlign)
  16.    {
  17.        //put the string into a char buffer
  18.        CharBuffer cb = CharBuffer.allocate(text.length());
  19.        try
  20.        {
  21.            cb.put(text);  
  22.        }catch(BufferOverflowException e)
  23.        {
  24.           System.out.println("TTF_Font: CharBuffer overflow in TTF_Font.print()!");
  25.        };
  26.        
  27.        
  28.        gl.glPushAttrib(GL.GL_ENABLE_BIT);
  29.        
  30.        gl.glMatrixMode(GL.GL_MODELVIEW);
  31.        gl.glPushMatrix();
  32.        gl.glLoadIdentity();
  33.        
  34.        gl.glDisable(GL.GL_DEPTH_TEST);
  35.        gl.glColor3d(colR,colG,colB);
  36.        fontTex.bind();
  37.        gl.glTranslated(pos.getX(),pos.getY(),0);
  38.        
  39.        gl.glListBase(fontBase);
  40.        gl.glCallLists(cb.length(),GL.GL_UNSIGNED_BYTE,cb);
  41.        
  42.        gl.glPopMatrix();
  43.        gl.glPopAttrib();
  44.        
  45.    }

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mai 24, 2006 16:31 
Offline
DGL Member
Benutzeravatar

Registriert: Di Sep 06, 2005 18:34
Beiträge: 362
Wohnort: Hamburg
Hi ...

das ist nur eine vage Vermutung. Aber evtl sind deine Texturkoordinaten falsch.
Ich denke als Test würde es da reichen Texturen auszuschalten und einfach mal nur mit Farbe zu zeichnen.

Ansonsten konnte ich jetzt aber auch nichts entdecken.

Gruß
Shai

_________________
Der Mensch hat neben dem Trieb der Fortpflanzung und dem zu essen und zu trinken zwei Leidenschaften: Krach zu machen und nicht zuzuhören. (Kurt Tucholsky)
Schwabbeldiwapp, hier kommt die Grütze. (Der Quästor)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mai 24, 2006 19:28 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 27, 2005 12:44
Beiträge: 393
Wohnort: Berlin
Programmiersprache: Java, C++, Groovy
Hallo Flash,

Rufe vor der Übergabe an gl.GenLists mal
Code:
  1. cb.rewind()
auf.

habe im Jogl-Forum irgendwo gelesen, dass übergebene Buffer-Objekte vorher 'zurückgespult' werden müssen.

Viele Grüße
dj3hut1


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mai 24, 2006 19:35 
Offline
DGL Member
Benutzeravatar

Registriert: Di Sep 06, 2005 18:34
Beiträge: 362
Wohnort: Hamburg
Mal ne evtl dumme Frage, aber wozu ein extra Buffer-Objekt statt nem char[] ?
Braucht glCallLists das ???

_________________
Der Mensch hat neben dem Trieb der Fortpflanzung und dem zu essen und zu trinken zwei Leidenschaften: Krach zu machen und nicht zuzuhören. (Kurt Tucholsky)
Schwabbeldiwapp, hier kommt die Grütze. (Der Quästor)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mai 24, 2006 20:14 
Offline
DGL Member

Registriert: Mi Dez 15, 2004 20:36
Beiträge: 454
Wohnort: Wien, Österreich
Zitat:
Auch scheint die Displaylistengenerierung funktioniert zu haben.
Das habe ich auch einmal erlebt. Ich wollte bei meinem Ballonkiller Font- und Explosion-Koordinaten in DL packen, und siehe da, Font hat es noch geschafft, aber die Explosionen nicht. Es wird nichts angezeigt.
Seitdem zeichnet BallonKiller die Explosionen "manuell".

_________________
"Meine Mutter sagt : 'Dumm ist der, der Dummes tut'." - Forrest Gump


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mai 25, 2006 00:26 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Am rewind lags nicht. Und Texturierung hab ich auch mal ausgeschaltet -> ohne Effekt.

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mai 25, 2006 02:21 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Es lag doch am rewind. Ich hatte es nur and er falschen Stelle eingefügt. Hinzu kam ein ein Texturcoordinatenproblem. Beides ist behoben.

Jetzt ist das Problem aber ein anderes. Ich seh zwar Text. Nur nicht den, den ich eigentlich sehen möchte.

Statt "Das ist ein Text" sehe ich irgend ein löchriges Ding von einem String. Soll heißen, viele Buchstaben fehlen. Und mehr noch. Die Buchstaben stimmen noch nicht einmal überein.
Ich hab daraufhin mir mal die Ränder der Buchstaben mit zeichnen lassen. Das ergebnis seht ihr im Anhang.

Habt ihr ne Idee an was das liegen könnte? Verwunderlich ist auch, dass statt 16 Buchstaben nur 14 Ausgegeben werden. Da die Ränder die Buchstaben sehr genau umschließen, denke ich es liegt nocht an den Texturkoordinaten. Ich hab schon versucht bei glCallLists andere Typen zu verwenden. Aber abgesehen von GL_UNSIGNED_SHORT bringen die alle keine sinnvollen ergebnisse. UNd bei letzteren sinds sogar nur 13 Buchstaben.

Gibts bei dem Buffer noch irgend was zu beachten?


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mai 25, 2006 11:16 
Offline
DGL Member
Benutzeravatar

Registriert: Di Sep 06, 2005 18:34
Beiträge: 362
Wohnort: Hamburg
Hi ...

Ich glaube du hast ein Problem mit den Datentypen.

Und zwar sagst du OGL, dass du unsigned bytes übergibst. Soweit ich weiß haben Chars aber 16Bit in Java und nicht 8 wie bytes. Wenn du einen ByteBuffer benutzt sollte es eigentlich funktionieren. Bytes können zwar auch negativ sein, aber das sollte OGL nicht stören wenn du sagst die sind unsigned ...
Oder du müsstest eine entsprechende Konstante übergeben (was du aber anscheinend schon versucht hast) ...

Gruß
Shai

[edit]
Ich hab mal bei NeHe geschaut. Die benutzen da entweder GLUT-Methoden oder eine GLF-Methode (was ist GLF ?) statt glCallLists.
http://nehe.gamedev.net/lesson.asp?index=03
auf der Seite gibts 3 text-tuts. zu den ersten beiden JOGL Ports und zu dem 3. nur nen Java Port (wo ist da der Unterschied ?)
[/edit]

_________________
Der Mensch hat neben dem Trieb der Fortpflanzung und dem zu essen und zu trinken zwei Leidenschaften: Krach zu machen und nicht zuzuhören. (Kurt Tucholsky)
Schwabbeldiwapp, hier kommt die Grütze. (Der Quästor)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mai 25, 2006 11:32 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Ich hab das gerade im Netz gefunden. Das scheint mir aber ziemlich umständlich zu sein. Und vermutlich auch nicht sehr performant.

Code:
  1. void drawText(String string) {
  2.         char[] stringChars = string.toCharArray();
  3.         int[] text = new int[stringChars.length];
  4.         for (int i = 0; i < text.length; i++) {
  5.             text[i] = (int) stringChars[i];
  6.         }
  7.         // pushes the display list bits
  8.         GL.glPushAttrib(GL.GL_LIST_BIT);
  9.         // sets the base character to 32
  10.         GL.glListBase(listIndexBase - 32);
  11.         GL.glCallLists(text.length, GL.GL_UNSIGNED_INT, text);
  12.         // pops the display list bits
  13.         GL.glPopAttrib();
  14.     }


16 Bit Chars. Das heißt, ich müsste eigentlich GL_UNSIGNED_SHORT nehmen, oder GL_2_BYTES. Wobei letzteres irgendwie komisch ist. Muss es mal ausprobieren.



Der Code stammt von hier: http://www.koders.com/java/fidE51BB1E72DBC0935BB94BD00F7DE05F292D4CEBE.aspx
Falls ihr Bitmap-Fonts gebrauchen könnt, ist es sicherlich ein Blick wert.

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mai 25, 2006 12:09 
Offline
DGL Member
Benutzeravatar

Registriert: Di Sep 06, 2005 18:34
Beiträge: 362
Wohnort: Hamburg
Hi ...

Also der Code Schnipsel sieht sehr übel aus auf den ersten Blick.
Ich verstehe nicht, warum die ints benutzen, man könnte doch gleich bei den chars bleiben.
Aber ich verstehe auch nicht, warum ein einfaches Array benutzt wird. Ich dachte glCallLists braucht nen Buffer ... ?

_________________
Der Mensch hat neben dem Trieb der Fortpflanzung und dem zu essen und zu trinken zwei Leidenschaften: Krach zu machen und nicht zuzuhören. (Kurt Tucholsky)
Schwabbeldiwapp, hier kommt die Grütze. (Der Quästor)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mai 25, 2006 20:01 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
GL_2_Bytes ging auch nicht. Da kam gar nichts raus. Vermutlich waren die resultierenden Werte alle jenseits von Gut&Böse (Jedenfalls wenn ich die Berechnung richtig verstanden habe).

Hat von euch noch einer ne Idee. Ich hab echt keine Ahnung wieso das nicht geht.

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Mai 26, 2006 17:50 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 27, 2005 12:44
Beiträge: 393
Wohnort: Berlin
Programmiersprache: Java, C++, Groovy
Hallo Flash,

hast du es schon mit einem ByteBuffer probiert?
Die gewünschten Bytes am besten mit
Code:
  1. string.getBytes("Windows-1252")
besorgen (falls das Encoding bei dir unterstützt wird).

Viele Grüße
dj3hut1


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Mai 30, 2006 00:17 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Hab ich ausprobiert, und es sah genauso aus wie mit dem CharBuffer.

Dann habe ich was anderes ausprobiert. Statt Leerzeichen habe ich "_" verwendet. Und siehe da, plötzlich konnte man zumindest erahnen wo die Wörter sind. Die Textur scheint verkehrt herum erstellt zu werden.

Durch Manipulation der Texturmatrix könnte ich vermutlich das rückgängig machen. Besser wäre es hingegen, wenn man die Textur direkt "flippen" könnte. Geht das? Vorallem: WIE?

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Mai 30, 2006 16:44 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 27, 2005 12:44
Beiträge: 393
Wohnort: Berlin
Programmiersprache: Java, C++, Groovy
Hallo Flash,

statt eine neue Textur mit
Code:
  1. TextureIO.newTexture
zu erzeugen, probier mal
Code:
  1. TextureIO.newTextureData
.

Du bekommst dann ein TextureData-Objekt bei dem du mit
Code:
  1. setMustFlipVertically(true)
die Textur flippen kannst.

Entweder du arbeitest dann mit dem TextureData-Objekt weiter oder du erzeugst dir wieder eine Textur mit
Code:
  1. TextureIO.newTexture(textureData)


Viele Grüße
dj3hut1


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Mai 30, 2006 17:54 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Oh...das klinkt interessant.
Werds mal testen.
Danke!

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 16 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.011s | 16 Queries | GZIP : On ]