Czcionki i tekst(ury)

2007-07-30 9:08

Żadna porządna biblioteka do grafiki 2D nie może obyć się bez narzędzi służących do wypisywania tekstu. Kiedy jednak mamy na uwadze głównie programowanie gier (lub pokrewnych aplikacji), sprawa wygląda nieco inaczej niż w bardziej “ogólnych” zastosowaniach. Nie trzeba na przykład rozkładać tekstu na czynniki pierwsze:

Linie pisma

Pozwalałoby to oczywiście w razie potrzeby dodać kursywę, pod-, nad- i przekreślenie. Zazwyczaj jednak nie jest to potrzebne.

Tak więc chociaż wygląda to na krok wstecz, stosuje się najczęściej czcionki bitmapowe. Pomysł polega na tym, że cały używany zestaw znaków danego kroju i danej wielkości jest rysowany na jednej teksturze w taki sposób, by łatwo można było obliczyć pozycję każdego znaku:

Tekstura czcionki Arial stworzona programem Bitmap Font Builder Tekstura czcionki Verdana stworzona programem Bitmap Font Generator

Wyświetlanie napisu polega wtedy na renderowaniu oteksturowanych prostokątów – po jednym dla każdego znaku. Jest to bardzo wydajne, bo chociaż trójkątów może być bardzo dużo, to ich tekstura jest zawsze taka sama. Można zatem wyrzucić całe połacie tekstu na ekran tylko jednym wywołaniem Draw[Indexed]Primitive.

Tylko skąd wziąć taką sprytną teksturę? Można rzecz jasna generować ją samemu przy pomocy funkcji GDI; choć jest to wolne, byłoby wykonywane tylko raz, więc nie stanowiłoby problemu. Lepszym rozwiązaniem jest użycie odpowiednich programów, z których najlepszym jest chyba Bitmap Font Generator. Potrafi on w sprytny sposób upakować w jednym obrazku sporą ilość znaków, zaś ich parametry opisuje w łatwym do odczytania formacie tekstowym przypominającym szczątkowy INI.

Obecnie używam więc właśnie jego i dzięki temu mogłem w końcu dodać do swojego silnika podstawowy i zupełnie niezbędny element: licznik FPSów :)

Tags: , , ,
Author: Xion, posted under Programming »


4 comments for post “Czcionki i tekst(ury)”.
  1. novo:
    August 2nd, 2007 o 20:41

    “Lepszym rozwiązaniem jest użycie odpowiednich programów” – nie zgadzam sie :). Wprowadzasz w ten sposob niepotrzebne ograniczenia. Troszke wiecej posiedzisz przy projektowaniu i generujac czcionke masz duzo bardziej elastyczny system.

  2. Xion:
    August 2nd, 2007 o 21:53

    Naturalnie najlepiej mieć obie opcje – zresztą drugą zawsze mogę dodać :) Ale pytanie brzmi: jak często pojawiają się sytuacje wymagające generowania czcionki, czyli np. dynamiczna zmiana wielkości znaków.

  3. SirMike:
    August 2nd, 2007 o 22:36

    Pytanie brzmi, jak czesto pojawiaja sie sytuacje gdzie potrzebujemy tak upchane fonty :) Ja generuje czcionke z wykorzystaniem freetype’a i caly potrzebny zestaw znakow miesci sie z grubym zapasem.

  4. novo:
    August 3rd, 2007 o 2:09

    SirMike: m.in. Do tego umozliwiasz pisanie w wzasadzie kazdym jezyku zerowym kosztem i jak np chinczyk bedzie gral z kumplami w twoja gre to moga sobie pisac krzaczkami itp. A w dodatku wykorzystujesz tylke te litery ktore naprawde potrzebujesz i nie marnujesz miejsca na caly pozostaly syf(jak napisal SirMike).

Comments are disabled.
 


© 2018 Karol Kuczmarski "Xion". Layout by Urszulka. Powered by WordPress with QuickLaTeX.com.