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

Aktuelle Zeit: Di Mai 14, 2024 23:06

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 10 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Textausgabe
BeitragVerfasst: So Dez 11, 2011 21:47 
Offline
DGL Member

Registriert: Fr Nov 11, 2011 20:15
Beiträge: 8
Programmiersprache: Java
Hi!

Ich versuche einen String mit openGL zu schreiben. Ich habe mir gedacht, dass ich für jeden Buchstaben ein Quadrat mit dem entsrechenden Texturkoordinaten (Tutorial_Bomberman2#Texturenfonts) zu mache, und diese dann alle hintereinander zeichne.

Allerdings kriege ich er nicht hin eine Reihe von Quadraten zu zeichnen. Die Quadrate werden entweder Unvollständig angezeigt oder die Echpunkte werden vermischt (meistens wird anstelle der unteren linken Ecke die untere Linke Ecke des zuvorigen Quadrats benutzt)

Code:
  1.  
  2.     public void init(){
  3.         char[] chars = text.toCharArray();
  4.        
  5.         vertices = ByteBuffer              
  6.                 .allocateDirect(4 * (2*4 * chars.length) * 2) //float *(XY*Quad * num) * TexUndVerts
  7.                 .order(ByteOrder.nativeOrder())
  8.                 .asFloatBuffer();
  9.  
  10.         //-----vertices-----//
  11.         for(int buchstabe = 0; buchstabe < chars.length; buchstabe++){
  12.             vertices.put(50*(buchstabe+1).put(0);
  13.             vertices.put(50*(buchstabe+1)).put(50);
  14.             vertices.put(50*buchstabe).put(50);
  15.             vertices.put(50*buchstabe).put(0);
  16.         }
  17.        
  18.         glBindBuffer(GL_ARRAY_BUFFER, fontBuff);
  19.         glBufferData(GL_ARRAY_BUFFER, vertices, GL_STATIC_DRAW);
  20.         count = 2*4*text.length();
  21.     }
  22.  
  23.     @Override
  24.     public void renderGL() {
  25.         glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
  26.        
  27.         glClear(GL_COLOR_BUFFER_BIT);
  28.         glBindBuffer(GL_ARRAY_BUFFER, fontBuff);
  29.        
  30.         glEnableClientState(GL_VERTEX_ARRAY);
  31.         glVertexPointer(2, GL_FLOAT, 0, 2*4*text.length());
  32.        
  33.         glDrawArrays(GL_QUADS, 0, count);
  34.     }
  35.  


Vielen Dank schonmal.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Textausgabe
BeitragVerfasst: So Dez 11, 2011 22:03 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 10, 2011 19:00
Beiträge: 43
Programmiersprache: FreePascal , C++
Ich habe das mit den Bitmap-Fonts sein gelassen weil ich auch immer Probleme mit der Darstellung und dem Skalieren hatte.
Ich sehe den Fehler in deinem Code auch gerade nicht.

Aber wenn du unbedingt bis morgen früh fertig sein müsstest, könntest du dir auch noch FreeType2 oder SDL_TTF anschauen.
Dann hast du alles auf einem Quad.

Chapter


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Textausgabe
BeitragVerfasst: Mo Dez 12, 2011 09:44 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Apr 13, 2011 22:05
Beiträge: 218
Programmiersprache: Lazarus/FPC
Das mit den bitmaps ist die klassische Idee und läuft eigentlich ganz gut. Was du halt brauchst sind Buchstaben die den selben Abstand haben, also Schriftarten wie Courier oder CONSOLAS. Hier ist mal mein code für die Darstellung von Texten, vielleicht hilft es dir dein problem zu lösen, kannst ihn aber auch direkt übernehmen :D
Als Textur hab ich eine 2000x30 Textur mit den Buchstaben verwendet, hier der Link zur Textur (weiße Buchstaben auf transparentem hintergrund, kann sein das du am browser nichts siehst^^)



Code:
  1.  
  2. procedure TMenuDraw.text(x: integer; y: integer; text: string);
  3. var
  4.   i, v, u: integer;
  5.   c: real;
  6. begin
  7.   glbindtexture(Gl_texture_2d, schrift);
  8.   u := 25;  //Breite eines Buchstaben in Pixel
  9.   glpushmatrix;
  10.   gltranslatef(x, y, 0);
  11.   for i := 1 to length(text) do
  12.   begin
  13.     v := ord(text[i]); //ASCII-Zahl der Buchstaben filtern, für alle Buchstaben von a-z und A-Z
  14.     if v = 48 then
  15.       v := 61
  16.     else if v < 58 then
  17.       v := v + 3
  18.     else if (v > 64) and (v < 92) then
  19.       v := v - 65 + 26
  20.     else if v > 96 then
  21.       v := v - 97;
  22.     if text[i] = ' ' then  //Diverse Sonderzeichen!!
  23.       v := 62;
  24.     if text[i] = '-' then
  25.       v := 63;
  26.     if text[i] = '_' then
  27.       v := 64;
  28.     if text[i] = ':' then
  29.       v := 65;
  30.     if text[i] = '.' then
  31.       v := 66;
  32.     if text[i] = ',' then
  33.       v := 67;
  34.     if text[i] = '/' then
  35.       v := 68;
  36.     if text[i] = '=' then
  37.       v := 69;
  38.     if text[i] = '(' then
  39.       v := 70;
  40.     if text[i] = ')' then
  41.       v := 71;
  42.     if text[i] = ';' then
  43.       v := 72;
  44.     c := v * u / 2000;
  45.     glbegin(GL_Quads);
  46.     glTexCoord2f(c, 0);
  47.     glvertex3f(0, 0, 0);
  48.     glTexCoord2f(c + (u / 2000), 0);
  49.     glvertex3f(7, 0, 0);
  50.     glTexCoord2f(c + (u / 2000), 1);
  51.     glvertex3f(7, 16, 0);  //7= Länge vom Buchstaben in Pixel, 16= die Höhe!
  52.     glTexCoord2f(c, 1);
  53.     glvertex3f(0, 16, 0);
  54.     glend;
  55.     gltranslatef(7, 0, 0);
  56.   end;
  57.   glpopmatrix;
  58. end;
  59.  


lg

_________________
Ich teile manchmal heimlich durch Null. - Alber Einstein


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Textausgabe
BeitragVerfasst: Mo Dez 12, 2011 12:29 
Offline
DGL Member
Benutzeravatar

Registriert: So Sep 26, 2010 12:54
Beiträge: 238
Wohnort: wieder in Berlin
Programmiersprache: Englisch
Ida, da könnte noch ein const for den text Parameter und Real würd ich durch Single ersetzen :)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Textausgabe
BeitragVerfasst: Mo Dez 12, 2011 15:06 
Offline
DGL Member

Registriert: Fr Nov 11, 2011 20:15
Beiträge: 8
Programmiersprache: Java
Hi,

vielen Dank für die schnelle Antworten.
Ich habe das ganze jetzt auch mal wie Ida im Imediatemode gemacht und dort scheinen die Quadrate zu funktionieren, obwohl ich (aus meiner Sicht) nichts geändert habe:
Code:
  1.  
  2. glClear(GL_COLOR_BUFFER_BIT);
  3.  
  4. glEnable(GL_TEXTURE_2D);
  5. glBindTexture(GL_TEXTURE_2D, texBuff);
  6. glBegin(GL_QUADS);
  7. byte x,y;
  8. for(int buchstabe = 0; buchstabe < text.length(); buchstabe++){
  9.     x = (byte) (chars[buchstabe]%16);
  10.     y = (byte) (chars[buchstabe]/16);
  11.     glTexCoord2f(1/16 * x, 1/16 * y);
  12.     glVertex2i(50*buchstabe, 0);
  13.     glTexCoord2f(1/16 * (x+1), 1/16 * y);
  14.     glVertex2i(50*(buchstabe+1, 0);
  15.     glTexCoord2f(1/16 * (x+1), 1/16 * (y+1));
  16.     glVertex2i(50*(buchstabe+1, 50);
  17.     glTexCoord2f(1/16 * x, 1/16 * (y+1));
  18.     glVertex2i(50*buchstabe, 50);
  19. }
  20. glEnd();
  21.  

Ich glaube das Problem liegt eher beim erstellen vom VBO, aber die Reihenfolge der Vertices stimmt doch eigentlich.

Edit:
Hab das Problem grad gefunden, verstehe es aber nicht ganz :lol:
Code:
  1.  
  2.     public void init(){
  3.  
  4.         chars = text.toCharArray();
  5.        
  6.         vertices = ByteBuffer              
  7.                 .allocateDirect(4 * (2*4 * chars.length) * 2) //float *(XY*Quad * num) * TexUndVerts
  8.                 .order(ByteOrder.nativeOrder())
  9.                 .asFloatBuffer();
  10.        
  11.         //-----text-----//
  12.         byte x, y;
  13.         for(int buchstabe = 0; buchstabe < chars.length; buchstabe++){
  14.             x = (byte) (chars[buchstabe]%16);
  15.             y = (byte) (chars[buchstabe]/16);
  16.             vertices.put(1/16 * x).put(1/16 * y);
  17.             vertices.put(1/16 * (x+1)).put(1/16 * y);
  18.             vertices.put(1/16 * (x+1)).put(1/16 * (y+1));
  19.             vertices.put(1/16 * x).put(1/16 * (y+1));
  20.         }
  21.         //-----vertices-----//
  22.         for(int buchstabe = 0; buchstabe < chars.length; buchstabe++){
  23.             vertices.put(50*buchstabe+buchstabe*5).put(0);
  24.             vertices.put(50*(buchstabe+1)+buchstabe*5).put(0);
  25.             vertices.put(50*(buchstabe+1)+buchstabe*5).put(50);
  26.             vertices.put(50*buchstabe+buchstabe*5).put(50);
  27.         }
  28.        
  29.         glBindBuffer(GL_ARRAY_BUFFER, fontBuff);
  30.         glBufferData(GL_ARRAY_BUFFER, vertices, GL_STATIC_DRAW);
  31.         count = 2*4*text.length();
  32.     }
  33.  
  34.     @Override
  35.     public void renderGL() {
  36.         glClear(GL_COLOR_BUFFER_BIT);
  37.        
  38.         glBindBuffer(GL_ARRAY_BUFFER, fontBuff);
  39.        
  40.         glEnable(GL_TEXTURE_2D);
  41.         glBindTexture(GL_TEXTURE_2D, texBuff);
  42.        
  43.         glEnableClientState(GL_TEXTURE_COORD_ARRAY);
  44.         glTexCoordPointer(2, GL_FLOAT, 0, 0);
  45.        
  46.         glEnableClientState(GL_VERTEX_ARRAY);
  47.         glVertexPointer(2, GL_FLOAT, 0, 0); // PROBLEM: war 2*4*text.length()
  48.        
  49.         glDrawArrays(GL_QUADS, 0, count);
  50.  
  51.  

Das ganze schein nun soweit zu funktionieren (ob die Textur Koordinaten stimmen hab ich noch nicht getestet).
Der VBO müsste ja jetzt eigentlich so aufgebaut sein: erst alle Texturkoordinaten und dann alle Vertices.
Also müsste es doch eigentlich
Code:
  1. glVertexPointer(2, GL_FLOAT, 0, 2*4*text.length());
sein, da die Vertices erst nach den ganzen Texturkoordinaten kommen (s/t * Quad * anzahl), oder hab ich da jetzt was verdreht?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Textausgabe
BeitragVerfasst: Mo Dez 12, 2011 18:34 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Apr 13, 2011 22:05
Beiträge: 218
Programmiersprache: Lazarus/FPC
Ein kleiner Tipp noch am Rande, nachdem du mit glbindtexture deine Texut übergibst schreib darunter noch
Code:
  1. glTexParameteri(Gl_texture_2d, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

mit dazu. Das lässt OpenGL die Texturen in richtig eckige Pixel rendern anstatt so verschwommene Übergänge wie normal.
Dadurch wird der Text schärfer dargestellt. Für normale Texturen stellst du das einfach wieder danach zurück mit
Code:
  1. glTexParameteri(Gl_texture_2d, GL_TEXTURE_MAG_FILTER, GL_NICEST);


8)

_________________
Ich teile manchmal heimlich durch Null. - Alber Einstein


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Textausgabe
BeitragVerfasst: Mo Dez 12, 2011 20:29 
Offline
DGL Member
Benutzeravatar

Registriert: So Sep 26, 2010 12:54
Beiträge: 238
Wohnort: wieder in Berlin
Programmiersprache: Englisch
GL_NICEST ist kein mag filter :) ..... GL_LINEAR or GL_LINEAR_MIPMAP_LINEAR in dem Fall

GL_NICEST ist für glHint...


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Textausgabe
BeitragVerfasst: Mo Dez 12, 2011 22:57 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Apr 13, 2011 22:05
Beiträge: 218
Programmiersprache: Lazarus/FPC
phlegmatiker hat geschrieben:
GL_NICEST ist kein mag filter :) ..... GL_LINEAR or GL_LINEAR_MIPMAP_LINEAR in dem Fall

GL_NICEST ist für glHint...


Oha, mein fehler, sorry :? Meinte GL_LINEAR
Bei diesem ganzen GL_Zeugs kommt man halt schnell mal durcheinander^^

_________________
Ich teile manchmal heimlich durch Null. - Alber Einstein


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Textausgabe
BeitragVerfasst: Di Dez 13, 2011 02:57 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Aug 18, 2007 18:47
Beiträge: 694
Wohnort: Köln
Programmiersprache: Java
Sollte man nicht bei glXXXXXPointer auch Stride und Offset angeben?

_________________
Es werde Licht.
glEnable(GL_LIGHTING);
Und es ward Licht.


Zitat aus einem Java Buch: "C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do it blows your whole leg off"

on error goto next


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Textausgabe
BeitragVerfasst: Mi Dez 14, 2011 19:46 
Offline
DGL Member

Registriert: Fr Nov 11, 2011 20:15
Beiträge: 8
Programmiersprache: Java
Vielen Dank!

Ich habs hinbekommen und würde es euch ja auch gerne zeigen, aber mein USB-Stick ist heute kaputt gegangen und darauf war das ganze: "Auf den Datenträger befindet sich kein erkanntes Filesystem"... :evil:
Ich hoffe mal das lässt sich noch irgendwie retten


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 10 Beiträge ] 
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 9 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.035s | 17 Queries | GZIP : On ]