TTF Rendermode: Unterschied zwischen den Versionen

Aus DGL Wiki
Wechseln zu: Navigation, Suche
 
(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

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.

TTF solid.png


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.

TTF blended.png

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.

TTF blended.png

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:

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:

  glBlendFunc(GL_SRC_ALPHA, GL_ONE);
  glEnable(GL_BLEND);
  //Zeichnen der Textur
  glDisable(GL_BLEND);

Ergebnis:

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.

  //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);
Anklicken für grosse Darstellung


Hinweis

Eine Demo-Anwendung zu SDL_TTF kann man im DGLSDK-SVN finden.

Siehe auch

TTF_RenderText_Solid, TTF_RenderText_Shaded, TTF_RenderText_Blended