TTF Rendermode: Unterschied zwischen den Versionen
I0n0s (Diskussion | Beiträge) |
I0n0s (Diskussion | Beiträge) (→Blended: Bitte Diskussion anschauen) |
||
Zeile 27: | Zeile 27: | ||
[[Bild:TTF blended.png|framed|center]] | [[Bild:TTF blended.png|framed|center]] | ||
+ | |||
+ | == Anwendung in OpenGL == | ||
+ | Dieser Modus ''Blended'' liefert direkt die passende Textur um eine schöne Schrift zu erzeugen. | ||
+ | |||
+ | <pascal> | ||
+ | var surface : PSDL_Surface; | ||
+ | tex : GLUint; | ||
+ | begin | ||
+ | surface :=TTF_RenderText_Blended(font,'Fischer''s Frase fischt frische Forellen', color); | ||
+ | //lädt die Daten aus der Surface in den Speicher: | ||
+ | tex :=SDL_GL_LoadTexture(surface); | ||
+ | </pascal> | ||
+ | |||
+ | |||
+ | === Zeichnen per Alphatest === | ||
+ | Doch wie zeichnet man die Schrift den jetzt? | ||
+ | Ich habe es bisher immer wie bei Sascha's [[Tutorial_Bomberman2#Texturenfonts|BombermanFontUnit]] gemacht: | ||
+ | <pascal> | ||
+ | glEnable(GL_ALPHA_TEST); | ||
+ | glAlphaFunc(GL_GREATER, 0.1); | ||
+ | //Zeichnen der Textur | ||
+ | glDisable(GL_ALPHA_TEST); | ||
+ | </pascal> | ||
+ | |||
+ | Das Resultat sieht dann so aus: | ||
+ | [[Bild:TTF Alpha.png|thumb|center|Anklicken für grosse Darstellung]] | ||
+ | |||
+ | Im Prinzip also wie [[TTF_RenderText_Solid]], was auch klar ist, wenn man sich anschaut was der Alphatest genau macht. | ||
+ | |||
+ | |||
+ | === Zeichnen per Blenden === | ||
+ | Eine Alternative ist das Blenden: | ||
+ | <pascal> | ||
+ | glBlendFunc(GL_SRC_ALPHA, GL_ONE); | ||
+ | glEnable(GL_BLEND); | ||
+ | //Zeichnen der Textur | ||
+ | glDisable(GL_BLEND); | ||
+ | </pascal> | ||
+ | |||
+ | Ergebnis: | ||
+ | [[Bild:TTF Blending.png|thumb|center|Anklicken für grosse Darstellung]] | ||
+ | Die Schrift ist glätter, leider stimmen die Farben aber nicht mehr. Der Grund liegt natürlich auf der Hand, beim angewendeten Blenden entsteht der Farbwerte aus dem vorherigen Farbwerte addiert mit (Alpha der Textur)*(Farbwert der Textur). | ||
+ | |||
+ | |||
+ | === Zeichnen per Alphatest '''und''' Blenden === | ||
+ | Als Lösung bietet sich ein kombiniertes Verfahren an: | ||
+ | Mit dem Alphatest erzeugen wir eine schwarze Schablone auf die wir dann per Blenden die Textur nochmal draufzeichnen. | ||
+ | Ist insgesamt ein Durchlauf mehr, dass Ergebnis spricht aber für sich. | ||
+ | <pascal> | ||
+ | //Alphatest | ||
+ | glEnable(GL_ALPHA_TEST); | ||
+ | glAlphaFunc(GL_GREATER, 0.4); | ||
+ | //der Wert 0.4 kann soweit angepasst werden, dass ausreichend schwarz, aber nicht zuviel schwarz wird. | ||
+ | //hängt teilweise auch von den verwendeten Schriftarten ab | ||
+ | glColor3ub(0,0,0); | ||
+ | //Zeichnen der Textur | ||
+ | glDisable(GL_ALPHA_TEST); | ||
+ | //Blenden | ||
+ | glBlendFunc(GL_SRC_ALPHA, GL_ONE); | ||
+ | glEnable(GL_BLEND); | ||
+ | glColor3ub( {Farbe in der gezeichnet werden soll} ); | ||
+ | //Zeichnen der Textur | ||
+ | glDisable(GL_BLEND); | ||
+ | </pascal> | ||
+ | |||
+ | [[Bild:TTF Alpha-Blend.png|thumb|center|Anklicken für grosse Darstellung]] | ||
+ | |||
+ | |||
+ | === Hinweis === | ||
+ | Eine Demo-Anwendung zu SDL_TTF kann man im [[DGLSDK]]-[[SVN]] finden. | ||
== Siehe auch == | == Siehe auch == |
Version vom 19. März 2006, 18:26 Uhr
Inhaltsverzeichnis
TTF_Rendermode
SDL_TTF kennt drei verschiedene Rendermodi:
Solid
Quick and Dirty
Erstellt eine 8-Bit palettierte Surface und rendert den gegebenen Text in schneller Qualität mit der gegebenen Schrift und Farbe. Der Pixelwert 0 ist der Colorkey, der den transparenten Hintergrund vorgibt, wenn es kopiert wird. Pixel- und Colormapwert 1 wird für die Vordergrundfarbe des Textes gesetzt. Dies erlaubt die Textfarbe zu ändern ohne den Text neuzurendern. Der Palettenindex 0 wird natürlich nicht gezeichnet, wenn es auf eine andere Surface kopiert wird, seitdem es ein Colorkey und somit die Transparenz ist, da die aktuelle Farbe 255 minus jeden der RGB Komponenten der Vordergrundfarbe ist.
Dies ist der schnellste Rendermodus von allen. Das Resultat hat keine Box um den Text, dafür ist der Text nicht glatt. Dieser Modus ist für FPS und andere schnell aktualisierende Textanzeigen geeignet.
Shaded
Slow and Nice, but with a Solid Box
Erstellt eine 8-Bit palettierte Surface und rendert den gegebenen Text in hoher Qualität mit der gegebenen Schrift und Farbe. Der 0 Pixelwert ist der Hintergrund, während die anderen Pixel variirende Farben zwischen der Vordergrundfarbe und Hintergrundfarbe sind. Dies resultiert in eine Box mit der Farbe des Hintergrundes um den Text in der Vordergrundfarbe. Der Text ist antialiased. Das Rendern ist langsamer als Solid, aber in ungefähr der selben Zeit wie Blended. Die resultierende Surface sollte sich so schnell wie eine 'Solid-Surface' kopieren lassen. Geeignet für netten Text wenn man zeitgleich mit der Box leben kann.
Blended
Slow Slow Slow, but Ultra Nice over another image
Erstellt eine 32-Bit ARGB Surface und rendert den gegebenen Text in hoher Qualität unter Benutzung von Alpha Blending. Dies resultiert in eine Surface mit Alpha Transparenz, sodass man keine solide farbige Box um den Text hat. Der Text ist antialiased. Das Render ist langsamer als Solid, aber in der selben Zeit wie im Shaded Modus. Die resultierende Surface lässt sich langsamer kopieren als bei Solid oder Shaded. Zu benutzen, wenn man hohe Qualität haben will und der Text sich nicht zu oft ändert.
Anwendung in OpenGL
Dieser Modus Blended liefert direkt die passende Textur um eine schöne Schrift zu erzeugen.
var surface : PSDL_Surface; tex : GLUint; begin surface :=TTF_RenderText_Blended(font,'Fischer''s Frase fischt frische Forellen', color); //lädt die Daten aus der Surface in den Speicher: tex :=SDL_GL_LoadTexture(surface);
Zeichnen per Alphatest
Doch wie zeichnet man die Schrift den jetzt? Ich habe es bisher immer wie bei Sascha's BombermanFontUnit gemacht:
glEnable(GL_ALPHA_TEST); glAlphaFunc(GL_GREATER, 0.1); //Zeichnen der Textur glDisable(GL_ALPHA_TEST);
Das Resultat sieht dann so aus:
Im Prinzip also wie TTF_RenderText_Solid, was auch klar ist, wenn man sich anschaut was der Alphatest genau macht.
Zeichnen per Blenden
Eine Alternative ist das Blenden:
glBlendFunc(GL_SRC_ALPHA, GL_ONE); glEnable(GL_BLEND); //Zeichnen der Textur glDisable(GL_BLEND);
Ergebnis:
Die Schrift ist glätter, leider stimmen die Farben aber nicht mehr. Der Grund liegt natürlich auf der Hand, beim angewendeten Blenden entsteht der Farbwerte aus dem vorherigen Farbwerte addiert mit (Alpha der Textur)*(Farbwert der Textur).
Zeichnen per Alphatest und Blenden
Als Lösung bietet sich ein kombiniertes Verfahren an: Mit dem Alphatest erzeugen wir eine schwarze Schablone auf die wir dann per Blenden die Textur nochmal draufzeichnen. Ist insgesamt ein Durchlauf mehr, dass Ergebnis spricht aber für sich.
//Alphatest glEnable(GL_ALPHA_TEST); glAlphaFunc(GL_GREATER, 0.4); //der Wert 0.4 kann soweit angepasst werden, dass ausreichend schwarz, aber nicht zuviel schwarz wird. //hängt teilweise auch von den verwendeten Schriftarten ab glColor3ub(0,0,0); //Zeichnen der Textur glDisable(GL_ALPHA_TEST); //Blenden glBlendFunc(GL_SRC_ALPHA, GL_ONE); glEnable(GL_BLEND); glColor3ub( {Farbe in der gezeichnet werden soll} ); //Zeichnen der Textur glDisable(GL_BLEND);
Hinweis
Eine Demo-Anwendung zu SDL_TTF kann man im DGLSDK-SVN finden.
Siehe auch
TTF_RenderText_Solid, TTF_RenderText_Shaded, TTF_RenderText_Blended