Přímo v knihovně GLUT jsou uloženy znaky z několika znakových sad a dvou reprezentací (bitmapové a vektorové), které lze v aplikacích využívajících OpenGL a GLUT použít.
Vykreslování znaků
Programátora vytvářejícího lokalizované programy je nutné upozornit na to, že znaky v použitých znakových sadách neobsahují českou diakritiku. Některé fonty v knihovně GLUT obsahují pouze 96 znaků, protože je využito spodních sedm bitů ASCII kódování a obsaženy jsou znaky z ASCII kódem 32–127, tedy všechny zobrazitelné znaky bez znaků řídících a Del. Další fonty pak obsahují všech 256 znaků, ale pouze v kódování IBM.
V aplikaci lze použít dvou typů fontů – bitmapové a vektorové. U bitmapových fontů jsou jednotlivé znaky reprezentovány pomocí bitových map, tj. rastrových obrázků s bitovou hloubkou jeden bit na pixel. Výhodou bitmapových fontů je rychlost zobrazování a vizuální kvalita znaků, nevýhodou složité zvětšování a zmenšování písma. Znaky ve vektorových fontech jsou reprezentovány pomocí množiny krátkých úseček. Rychlost zobrazování je nižší než u bitmapových znaků, na druhou stranu lze vektorové znaky jednoduše zobrazit v různém zvětšení a náklonu.
Ukázkový příklad číslo 14
V tomto příkladu je ukázáno vykreslování bitmapových znaků z různých znakových sad. Jsou vykresleny znaky ze všech bitmapových znakových sad, které jsou v knihovně GLUT uloženy. Také je ukázána možnost vytvoření funkce, která vypíše obsah celého řetězce, což knihovna GLUT přímo neumožňuje.
Pro podporu vykreslování bitmapových znaků lze využít dvou funkcí: glutBitmapCharacter(void *font, int character) a glutBitmapWidth(void *font, int character). Funkce glutBitmapCharacter() slouží pro vykreslení jednoho bitmapového znaku z vybraného fontu. Prvním parametrem této funkce je ukazatel na font, druhým parametrem ASCII kód vykreslovaného znaku. Podporovány jsou následující fonty (znakové sady):
GLUT_BITMAP8_BY13neproporcionální font, kde každý znak je zobrazen v rastru 8×13 pixelů.
GLUT_BITMAP9_BY15 neproporcionální font, kde každý znak je zobrazen v rastru 9×15 pixelů.
GLUT_BITMAP_TIMES_ROMAN10 proporcionální font z rodiny Times o velikosti deseti bodů.
GLUT_BITMAP_TIMES_ROMAN24 proporcionální font z rodiny Times o velikosti 24 bodů.
GLUT_BITMAP_HELVETICA10 proporcionální font z rodiny Helvetica o velikosti deseti bodů.
GLUT_BITMAP_HELVETICA12 proporcionální font z rodiny Helvetica o velikosti dvanácti bodů.
GLUT_BITMAP_HELVETICA18 proporcionální font z rodiny Helvetica o velikosti osmnácti bodů.
Každý znak je vnitřně vykreslen voláním funkce z knihovny OpenGLglBitmap(), jedná se tedy o jednobarevnou bitmapu (nastavený bit reprezentuje barvu, vynulovaný bit reprezentuje „prázdno“, kde se nic nevykreslí). Pozice na obrazovce pro vykreslení znaku se nastaví funkcí glPosition2i(x, y). Funkcí glColor*() lze nastavit barvu vykreslovaných znaků. Po vykreslení každého znaku je automaticky proveden posun vykreslovací pozice o šířku daného znaku, takže je možné jednoduše vypisovat celé řetězce.
K dispozici je zdrojový kód čtrnáctého příkladu a zdrojový kód se zvýrazněnou syntaxí.
Ukázkový příklad číslo 15
Tento příklad demonstruje možnost zobrazení všech znaků z dané znakové sady. Po spuštění programu je možné pomocí kontextového pop-up menu vybrat některou znakovou sadu obsahující bitmapové znaky. Všechny tyto znaky jsou posléze zobrazeny. V neproporcionálních fontech je pro postupné zobrazení znaků za sebou nutné zjistit šířku znaků.
Pro získání šířky vykreslovaného znaku, která se v proporcionálních písmech mění, lze použít funkci glutBitmapWidth(), která má stejné parametry jako funkce glutBitmapCharacter(). Tato funkce vrátí šířku zadaného znaku v pixelech. Výška znaku (resp. maximální výška mezi akcentem a dolní dotažnicí) se pro jednu znakovou sadu nemění, proto také neexistuje funkce pro její zjištění.
Při spuštění příkladu si lze všimnout, že ne všechny znakové sady obsahují celou sadu s kódy 0 až 255. Některé znakové sady dokonce obsahují pouze znaky sedmibitové ASCII, tj. ty, jež mají kód v rozmezí 0 až 127.
K dispozici je zdrojový kód patnáctého příkladu azdrojový kód se zvýrazněnou syntaxí.
Ukázkový příklad číslo 16
V tomto příkladu je ukázáno vykreslování vektorových znaků z různých znakových sad. Jsou vykresleny znaky ze všech vektorových znakových sad, které jsou v knihovně GLUT uloženy. Také je ukázána možnost vytvoření funkce (printStringUsingGlutVectorFont()), která vypíše obsah celého řetězce, což knihovna GLUT (podobně jako u bitmapových znakových sad) přímo neumožňuje.
Pro podporu vykreslování vektorových znaků lze využít dvou funkcí: glutStrokeCharacter() a glutStrokeWidth(). FunkceglutStrokeCharacter(void *font, int character) (podobně jako glutBitmapCharacter()) slouží pro vykreslení jednoho vektorového znaku z vybraného fontu. Prvním parametrem font této funkce je ukazatel na font, druhým parametrem character je ASCII kód vykreslovaného znaku. Podporovány jsou pouze dvě následující znakové sady (fonty):
GLUT_STROKE_ROMANproporcionální vektorové písmo obsahující pouze znaky s ASCII hodnotou 32–127. Maximální výška těchto znaků je 119.05 bodů, dolní dotažnice má výšku 33.33 bodů.
GLUT_STROKE_MONO_ROMAN neproporcionální vektorové písmo obsahující pouze znaky s ASCII hodnotou 32–127. Maximální výška znaků je 119.05 bodů, dolní dotažnice má výšku 33.33 bodů. Všechny znaky mají stejnou šířku 104.76 bodů.
Ve funkci printStringUsingGlutVectorFont() je naznačeno, jakým způsobem lze nastavit počátek vykreslování znaků a velikost písma. Jelikož se vektorové písmo skládá z krátkých úseček vykreslovaných pomocí funkcí OpenGL, lze použít funkce pro změnu Modelview matice, tj. – glTranslatef(), glRotatef() a glScalef(). Tyto funkce potom ovlivňují umístění znaků a jejich velikost a orientaci.
K dispozici je zdrojový kód šestnáctého příkladu a zdrojový kód se zvýrazněnou syntaxí.
Ukázkový příklad číslo 17
Tento příklad demonstruje možnost zobrazení všech znaků z dané znakové sady vektorového písma. Po spuštění programu je možné pomocí kontextového pop-up menu vybrat některou znakovou sadu obsahující vektorové znaky. Každou znakovou sadu lze zobrazit ve více velikostech. Všechny znaky vybrané znakové sady jsou posléze zobrazeny. V neproporcionálním písmu GLUT_STROKE_ROMAN je pro postupné zobrazení znaků za sebou nutné zjistit šířku znaků. To lze zajistit voláním funkce glutStrokeWidth(), která má stejné parametry jako funkce glutStrokeCharacter().
Vlastní vykreslení znaků provádí funkce printAllChars(), ve které je pro přechod na nový řádek použito volání glTranslatef().
K dispozici je zdrojový kód sedmnáctého příkladu a zdrojový kód se zvýrazněnou syntaxí.
V další části seriálu bude ukázána tvorba a vykreslení základních trojrozměrných těles, které můžeme vytvořit pomocí knihovny GLUT.