TTF Rendermode: Unterschied zwischen den Versionen

Aus DGL Wiki
Wechseln zu: Navigation, Suche
(Zeichnen per Alphatest)
K (Der Ausdruck ''<pascal>(.*?)</pascal>'' wurde ersetzt mit ''<source lang="pascal">$1</source>''.)
 
Zeile 31: Zeile 31:
 
Der Modus "Blended" liefert direkt die passende Textur, um eine schöne Schrift zu erzeugen.
 
Der Modus "Blended" liefert direkt die passende Textur, um eine schöne Schrift zu erzeugen.
  
<pascal>
+
<source lang="pascal">
 
var surface : PSDL_Surface;
 
var surface : PSDL_Surface;
 
     tex    : GLUint;
 
     tex    : GLUint;
Zeile 38: Zeile 38:
 
   //lädt die Daten aus der Surface in den Speicher:
 
   //lädt die Daten aus der Surface in den Speicher:
 
   tex    :=SDL_GL_LoadTexture(surface);
 
   tex    :=SDL_GL_LoadTexture(surface);
</pascal>
+
</source>
  
  
Zeile 44: Zeile 44:
 
Doch wie zeichnet man die Schrift den jetzt?
 
Doch wie zeichnet man die Schrift den jetzt?
 
Ich habe es bisher immer wie bei Sascha's [[Tutorial_Bomberman2#Texturenfonts|BombermanFontUnit]] gemacht:
 
Ich habe es bisher immer wie bei Sascha's [[Tutorial_Bomberman2#Texturenfonts|BombermanFontUnit]] gemacht:
<pascal>   
+
<source lang="pascal">   
 
   glEnable(GL_ALPHA_TEST);
 
   glEnable(GL_ALPHA_TEST);
 
   glAlphaFunc(GL_GREATER, 0.1);
 
   glAlphaFunc(GL_GREATER, 0.1);
 
   //Zeichnen der Textur
 
   //Zeichnen der Textur
 
   glDisable(GL_ALPHA_TEST);
 
   glDisable(GL_ALPHA_TEST);
</pascal>
+
</source>
  
 
Das Resultat sieht dann so aus:
 
Das Resultat sieht dann so aus:
Zeile 58: Zeile 58:
 
=== Zeichnen per Blenden ===
 
=== Zeichnen per Blenden ===
 
Eine Alternative ist das Blenden:
 
Eine Alternative ist das Blenden:
<pascal>
+
<source lang="pascal">
 
   glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
 
   glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
 
   glEnable(GL_BLEND);
 
   glEnable(GL_BLEND);
 
   //Zeichnen der Textur
 
   //Zeichnen der Textur
 
   glDisable(GL_BLEND);
 
   glDisable(GL_BLEND);
</pascal>
+
</source>
  
 
Ergebnis:
 
Ergebnis:

Aktuelle Version vom 10. März 2009, 19:11 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 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.

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

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:

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_MINUS_SRC_ALPHA);
  glEnable(GL_BLEND);
  //Zeichnen der Textur
  glDisable(GL_BLEND);

Ergebnis:

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

TTF_RenderText_Solid, TTF_RenderText_Shaded, TTF_RenderText_Blended