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?
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.
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):
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?
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.
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.
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.
bmp.Canvas.TextOut(0,0, _Char);// Text auf dem Bitmap ausgeben
FintBreiteDesBildes := bmp.Width;
FintHoeheDesBildes := bmp.Height;
FTextur.Bind;
FTextur.AssignFromBitmap(bmp);// vom Bitmap auf die Textur übertragen
fTextur.ConvertTo(ifLuminance);
fTextur.InternalFormat:= ifAlpha;
FTextur.GenTexture;// an OpenGL übergeben
finally
FreeAndNil(bmp);
end;
end;
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:
Rendern:
// Tiefentest
glDisable (GL_DEPTH_TEST );
glDepthFunc (GL_LESS );
// glDepthMask (GL_TRUE ); // <-- geht bei mir nicht
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.