TTF Rendermode: Unterschied zwischen den Versionen
I0n0s (Diskussion | Beiträge) |
DGLBot (Diskussion | Beiträge) K (Der Ausdruck ''<pascal>(.*?)</pascal>'' wurde ersetzt mit ''<source lang="pascal">$1</source>''.) |
||
(7 dazwischenliegende Versionen von 3 Benutzern werden nicht angezeigt) | |||
Zeile 17: | Zeile 17: | ||
'''Slow and Nice, but with a Solid Box''' | '''Slow and Nice, but with a Solid Box''' | ||
− | Erstellt eine | + | Erstellt eine [[SDL_Surface|Surface]] mit einer 8-Bit Farbpalette 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. |
[[Bild:TTF blended.png|framed|center]] | [[Bild:TTF blended.png|framed|center]] | ||
Zeile 27: | Zeile 27: | ||
[[Bild:TTF blended.png|framed|center]] | [[Bild:TTF blended.png|framed|center]] | ||
+ | |||
+ | == Anwendung in OpenGL == | ||
+ | Der Modus "Blended" liefert direkt die passende Textur, um eine schöne Schrift zu erzeugen. | ||
+ | |||
+ | <source lang="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); | ||
+ | </source> | ||
+ | |||
+ | |||
+ | === 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: | ||
+ | <source lang="pascal"> | ||
+ | glEnable(GL_ALPHA_TEST); | ||
+ | glAlphaFunc(GL_GREATER, 0.1); | ||
+ | //Zeichnen der Textur | ||
+ | glDisable(GL_ALPHA_TEST); | ||
+ | </source> | ||
+ | |||
+ | 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: | ||
+ | <source lang="pascal"> | ||
+ | glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); | ||
+ | glEnable(GL_BLEND); | ||
+ | //Zeichnen der Textur | ||
+ | glDisable(GL_BLEND); | ||
+ | </source> | ||
+ | |||
+ | Ergebnis: | ||
+ | [[Bild:TTF Blending.png|thumb|center|Anklicken für grosse Darstellung]] | ||
+ | Die Schrift wird an den Kanten leicht mit dem Hintergrund vermischt. Dadurch wirkt sie wesentlich ruhiger und lässt sich besser lesen. | ||
+ | |||
+ | === Hinweis === | ||
+ | Eine Demo-Anwendung zu SDL_TTF kann man im [[DGLSDK]]-[[SVN]] finden. | ||
== Siehe auch == | == Siehe auch == |
Aktuelle Version vom 10. März 2009, 19:11 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 Surface mit einer 8-Bit Farbpalette 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
Der 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_MINUS_SRC_ALPHA);
glEnable(GL_BLEND);
//Zeichnen der Textur
glDisable(GL_BLEND);
Ergebnis:
Die Schrift wird an den Kanten leicht mit dem Hintergrund vermischt. Dadurch wirkt sie wesentlich ruhiger und lässt sich besser lesen.
Hinweis
Eine Demo-Anwendung zu SDL_TTF kann man im DGLSDK-SVN finden.
Siehe auch
TTF_RenderText_Solid, TTF_RenderText_Shaded, TTF_RenderText_Blended