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

Aktuelle Zeit: So Jul 06, 2025 20:41

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



Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Antialisasing bei Bitmap-Fonts
BeitragVerfasst: Mi Apr 25, 2007 16:13 
Offline
DGL Member

Registriert: Mi Mär 28, 2007 17:45
Beiträge: 131
Hallo,

ich habe gerade meine ersten Gehversuche mit Bitmapfonts unter OpenGL gemacht. Funktioniert im Prinzip ganz gut, vorausgesetzt, man positioniert die Texturausschnitte sorgfältig. Die Textur habe ich im PNG-Format mit transparentem Hintergrund erstellt. Nun mein (kleines) Problem: Die Schrift kommt gestochen scharf, aber eben mit den Treppeneffekten. Wenn ich die Textur-Bitmap mit Antialiasing herstelle, dann sieht es zwar schön aus, aber nur, wenn ich die Schrift auf ähnlicher Hintergrundfarbe darstelle wie bei der Erstellung der Textur, andernfalls gibt es hässliche Farbränder, was ja auch logisch ist. Gibt es da eine Lösung?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Apr 25, 2007 16:45 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2068
Programmiersprache: C++
Wie zeichnest du denn die Schrift?
Per Alphatest oder Blending?

_________________
Steppity,steppity,step,step,step! :twisted:
❆ ❄ ❄ ❄ ❅ ❄ ❆ ❄ ❅ ❄ ❅ ❄ ❅ ❄ ❄
❄ ❄ ❄ ❅ ❄ ❄ ❄ ❅ ❄ ❄ ❆ ❄ ❄


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Apr 25, 2007 17:36 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Du musst dafür sorgen, dass du beim Erstellen der Textur den Alphakanal sinnvoll benutzt. Wenn du Antialiasing auf einen roten Hintergrund anwendest, dann wird das ja schon alles fertig berechnet. Das muss du aber mittels Blending von der Grafikkarte machen lassen. Und dann kommst du um einen Alphakanal nicht drumherum.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Apr 26, 2007 11:51 
Offline
DGL Member

Registriert: Mi Mär 28, 2007 17:45
Beiträge: 131
Oh je, ich bin noch totaler Anfänger in OpenGL und habe die Einstellungen von einem anderen Programm übernommen. Hier die Einstellungen, die eine Rolle spielen könnten (von verschiedenen Stellen zusammengesucht):
Code:
  1. glEnable (GL_TEXTURE_2D );
  2. glDisable (GL_DEPTH_TEST );
  3. glDisable (GL_ALPHA_TEST );
  4. glEnable (GL_BLEND );
  5. glDepthMask (GL_TRUE );
  6. glShadeModel (GL_SMOOTH );
  7. glDepthFunc (GL_LESS );
  8.        
  9. glBlendFunc     (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  10. glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
  11. glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );

Die Textur wird mit
Code:
  1. gluBuild2DMipmaps

geladen. Aber was den Alphakanal betrifft: Wird der denn nicht schon dadurch benutzt, dass ich im Grafikprogramm den Hintergrund auf transparent setze? Dass an dieser Stelle das Antialiasing gegen einen Farbhintergrund keinen Sinn macht, ist mir nun klar. Doch wie erreiche ich ein gewisses Weichzeichnen der Ränder in OpenGL?


// Edit Lossy: Code durch Pascaltags ersetzt.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Apr 26, 2007 12:48 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Also als erstes mal der Code. Etwas sortiert und kommentiert was was ist.

Code:
  1. // Tiefentest
  2. glDisable (GL_DEPTH_TEST );
  3. glDepthFunc (GL_LESS );
  4. glDepthMask (GL_TRUE );
  5.  
  6. glShadeModel (GL_SMOOTH );  // Shademodel.
  7.  
  8. glDisable (GL_ALPHA_TEST ); // Alphatest deaktivieren
  9.  
  10. // Blending aktivieren und blendfunc setzen.
  11. glEnable (GL_BLEND );
  12. glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  13.  
  14. // Einstellungen für eine Textur. Wobei sie TexParameter auf die
  15. // aktuelle Textur bezieht. Ich weiß jetzt nicht was passiert, wenn
  16. // man sie ohne aktive Textur setzt.
  17. glEnable (GL_TEXTURE_2D );
  18. glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
  19. glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );


So weit sieht der Code in ordnung aus. Zu näheren Angaben zu den Befehlen kann ich dich gerade nur an unser Wiki weiterleiten.

Textur: Es gibt unzähliche Wege wie dein Alphakanal verlohren gehen kann. Im Grafikprogramm muss es transparent sein. Also das typische Kästchenmuster. Dann musst du es auch in einem Format abspeichern was transparenzen kann. TGA, DDS oder PNG können es. BMP und JPEG können es nicht. Und bei der übergabe an gluBuild2DMipmaps muss als Format RGBA ausgewählt sein. Bei RGB würde dir OpenGL das eben so wegschmeißen.

Falls du dir nicht sicher bist, dann hänge mal bitte das Bild an. Falls es kein png sein sollte, dann bitte als zip. jpeg und bmp brauchst du auch nicht anhängen, weil die eh kein Alpha können. ;)

PS: gluBuild2DMipmaps würde ich dir nicht empfehlen. 1. Du brauchst für Texte keine MipMaps. Und dafür gibt es hardwarebeschleunigte Alternativen. 2. Ist es langsam. 3. Kann es passieren, dass er mal eben die Maße deiner Textur anpasst, wenn sie nicht ganz stimmt.
Als Alternative empfehle ich glTexImage2D. Die Parameter sind recht gleich nur für den Level musst du 0 angeben. Wenn die Größe deiner Textur jetzt noch eine Potenz von 2 ist dann passt das.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Apr 26, 2007 16:43 
Offline
DGL Member

Registriert: Mi Mär 28, 2007 17:45
Beiträge: 131
Allmählich dämmert es, wo das Problem und die mögliche Lösung liegt. Der Alphakanal ist wohl nicht verloren gegangen, sondern nicht richtig ausgenutzt worden. Ich hab mal eine Fonttextur von einem anderen Programm geladen. Die Metrix passt zwar nicht, aber die Textur kommt (mit denselben GL-Einstellungen wie oben) sauber, scharf und doch weich. Ich habe sie mit einem Grafikprogramm untersucht und festgestellt, dass sich das Antialiasing verschiedenen Hintergründen anpasst. Das kann doch nur bedeuten, dass die Objektränder nicht mit der Hintergrundfarbe gemischt werden, sondern eine abgestufte Transparenz erhalten. Das ist wohl mit einem "echten" Alphakanal gemeint. Bei meiner Textur gab es nur völlige Transparenz oder keine. Das PNG-Format war schon ok.

Wie man diesen Effekt mit einem Grafikprogramm hinbekommt, ist mir noch schleierhaft. Die Auswahl ist groß (Photo Impact, Photoshop, Corel Photo Paint, Gimp), aber die Teile sind ja so überaus intuitiv zu bedienen. :(
Nun gut, das ist wohl keine Thematik mehr für dieses Forum. Ich danke für die Unterstützung.

Reinhard


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Apr 26, 2007 20:08 
Offline
DGL Member

Registriert: Mi Mär 28, 2007 17:45
Beiträge: 131
Pardon, hatte ein dickes Brett vor'm Kopf. Ist ganz einfach: Im Grafikprogramm (ich hab's mit Photo Impact gemacht) ein neues Bild mit transparentem Hintergrund anlegen. Dann ist der Alphakanal da, und das Antialiasing wird gegen den Hintergrund, also im Alphakanal angelegt. Sieht nun verdammt sauber aus.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Mai 04, 2007 22:32 
Offline
DGL Member

Registriert: Mo Jul 17, 2006 13:16
Beiträge: 69
Für die Nachwelt, die Schrift als Bitmap zur Laufzeit generiert, folgende Tips:

* Kantenglättung für Schriften muss in Windows generell aktiviert sein! ClearType oder vgl.

Code:
  1.  
  2. procedure GeneriereTextBlaBlubb(EinPaarParameter wie _Font oder _Char)
  3. var
  4.   bmp: Graphics.TBitmap;
  5.   r, g, b: Byte;
  6. begin
  7.   try
  8.     // Benötigte Breite und Höhe für die Textur errechnen
  9.     FFontHeight := Font_TextHeight(_Font, _Char);
  10.     FFontWidth := Font_TextWidth(_Font, _Char);
  11.  
  12.     // Die Textur MUSS Schwarz/Weiss sein, die Schrift kann dann später mit GLColor eingefärbt werden.
  13.    
  14.     // Textur auf ein Bitmap zeichnen
  15.     bmp := Graphics.TBitmap.Create;
  16.     bmp.PixelFormat := pf32bit;
  17.     bmp.Canvas.Font.Assign(_Font); // Schrift anpassen
  18.     bmp.Canvas.Font.Color := clWhite;
  19.     bmp.Width := Power_Of_2(FFontWidth);
  20.     bmp.Height := Power_Of_2(FFontHeight);
  21.     bmp.Canvas.Brush.Color := clBlack;
  22.     bmp.Canvas.FillRect(Rect(0,0,bmp.width,bmp.height));
  23.     bmp.Canvas.TextOut(0, 0, _Char); // Text auf dem Bitmap ausgeben
  24.  
  25.     FintBreiteDesBildes := bmp.Width;
  26.     FintHoeheDesBildes := bmp.Height;
  27.  
  28.     FTextur.Bind;
  29.     FTextur.AssignFromBitmap(bmp); // vom Bitmap auf die Textur übertragen
  30.  
  31.     fTextur.ConvertTo(ifLuminance);
  32.     fTextur.InternalFormat := ifAlpha;
  33.     FTextur.GenTexture; // an OpenGL übergeben
  34.   finally
  35.     FreeAndNil(bmp);
  36.   end;
  37. end;
  38.  


Achtung: meine Komponente speichert sich FFontHeight und FFontWidth ab, damit der Renderer später weiß, wie viel er darstellen muss, denn FFontHeight ist meist immer kleiner als bmp.Height!

Code:
  1. Rendern:
  2.  
  3.       // Tiefentest
  4.       glDisable (GL_DEPTH_TEST );
  5.       glDepthFunc (GL_LESS );
  6.       //      glDepthMask (GL_TRUE ); // <-- geht bei mir nicht
  7.       glShadeModel (GL_SMOOTH ); // Shademodel.
  8.       glDisable (GL_ALPHA_TEST ); // Alphatest deaktivieren
  9.       // Blending aktivieren und blendfunc setzen.
  10.       glEnable (GL_BLEND );
  11.       glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  12.       // Einstellungen für eine Textur. Wobei sie TexParameter auf die
  13.       // aktuelle Textur bezieht. Ich weiß jetzt nicht was passiert, wenn
  14.       // man sie ohne aktive Textur setzt.
  15.       glEnable (GL_TEXTURE_2D );
  16.       glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
  17.       glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
  18.  
  19.      TColor2RGB(FFont.Color, r, g, b);
  20.      glColor3ub(r, g, b);
  21.      FTextur.Bind;
  22.      // und dann normal rendern...
  23.  


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


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:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.012s | 14 Queries | GZIP : On ]