Hlavní navigace

GLUT (8): rozhraní pro vykreslování znaků

Pavel Tišnovský 17. 6. 2003

Jak již bylo napsáno v prvních dílech tohoto seriálu, v knihovně OpenGL neexistuje přímá možnost, jak vykreslovat znaky, protože jde o systémově závislou funkci. Na různých platformách a operačních systémech se používají rozdílné způsoby reprezentace a vykreslování znaků ve znakových sadách (bitmapové, vektorové, splajnové, úsekové apod.), různá kódování (EBCDIC, ASCII, Unicode) a způsoby výběru znakové sady. Knihovna GLUT poskytuje velmi jednoduché (jak z hlediska funkčnosti, tak z hlediska použití) funkční rozhraní pro vykreslování znaků.

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í: glutBitmapCha­racter(void *font, int character) a glutBitmapWid­th(void *font, int character). Funkce glutBitmapCha­racter() 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_BY13

neproporcioná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_TI­MES_ROMAN10 proporcionální font z rodiny Times o velikosti deseti bodů.
GLUT_BITMAP_TI­MES_ROMAN24 proporcionální font z rodiny Times o velikosti 24 bodů.
GLUT_BITMAP_HEL­VETICA10 proporcionální font z rodiny Helvetica o velikosti deseti bodů.
GLUT_BITMAP_HEL­VETICA12 proporcionální font z rodiny Helvetica o velikosti dvanácti bodů.
GLUT_BITMAP_HEL­VETICA18 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ázka čtrnáctého příkladu

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 neproporcio­ná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 glutBitmapCha­racter(). 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ázka patnáctého příkladu

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 (printStringU­singGlutVector­Font()), 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í: glutStrokeCha­racter() a glutStrokeWidth(). FunkceglutStro­keCharacter(vo­id *font, int character) (podobně jako glutBitmapCha­racter()) 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_ROMAN

proporcioná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_MO­NO_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 printStringUsin­gGlutVectorFon­t() 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ázka šestnáctého příkladu

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 glutStrokeCha­racter().

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í.

ukázka sedmnáctého příkladu

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.

Našli jste v článku chybu?

24. 6. 2003 18:18

Bilbo (neregistrovaný)

No, to je pravda, sice se tam vykresluje textura, ale zase misto X trojuhelniku (treba takovy kulaty "O" jich bude mit hodne) se vykresli akorat 1 ctverec (2 trojuhelniky)
Perspektivni korekce neni treba, pismena jsou obvykle zobrazeny "rovne", navic u bilinearniho filtrovani nemam pocit, ze by nejak zdrzovalo (to az trilinearni nebo anisotropni). Mozna u nejakych predpotopnich s3 deceleratoru, ale to byly stejne sunty .....

A mulitexturing obvykle neni taky potreba, pokud se s fonty nedelaj…


18. 6. 2003 16:12

Pavel Tišnovský (neregistrovaný)

To je samozrejme mozne a taky se to casto dela. Ale vykreslovani pismen pres textury ma i sve problemy - pri zvetsovani/zmensovani se musi zapnout bilinearni filtrace, ktera na nekterych starsich kartach docela zdrzuje. Dale je zapotrebi zapnout perspektivni korekci (mapovani textury per pixel a ne per vertex), coz prinasi dalsi zpomaleni a nekdy neni podporovano ani multitexturovani.

Ale na dnesnich akceleratorech vyse zminene nevyhody odpadaji, tykaly se spis starsich karet, kde bylo vykres…

Podnikatel.cz: Přehledná titulka, průvodci, responzivita

Přehledná titulka, průvodci, responzivita

Vitalia.cz: Jak koupit Mikuláše a nenaletět

Jak koupit Mikuláše a nenaletět

Vitalia.cz: I církev dnes vyrábí potraviny

I církev dnes vyrábí potraviny

Vitalia.cz: Žloutenka v Brně: Nakaženo bylo 400 lidí

Žloutenka v Brně: Nakaženo bylo 400 lidí

Lupa.cz: E-shopy: jen sleva už nestačí

E-shopy: jen sleva už nestačí

Podnikatel.cz: Dárky v podnikání. Jak je uplatnit v daních?

Dárky v podnikání. Jak je uplatnit v daních?

Podnikatel.cz: Na poslední chvíli šokuje vyjímkami v EET

Na poslední chvíli šokuje vyjímkami v EET

Vitalia.cz: Paštiky plné masa ho zatím neuživí

Paštiky plné masa ho zatím neuživí

DigiZone.cz: Sony KD-55XD8005 s Android 6.0

Sony KD-55XD8005 s Android 6.0

DigiZone.cz: Recenze Westworld: zavraždit a...

Recenze Westworld: zavraždit a...

120na80.cz: Rakovina oka. Jak ji poznáte?

Rakovina oka. Jak ji poznáte?

Podnikatel.cz: Víme první výsledky doby odezvy #EET

Víme první výsledky doby odezvy #EET

DigiZone.cz: Flix TV má set-top box s HEVC

Flix TV má set-top box s HEVC

Vitalia.cz: „Připluly“ z Německa a možná obsahují jed

„Připluly“ z Německa a možná obsahují jed

Podnikatel.cz: Prodává přes internet. Kdy platí zdravotko?

Prodává přes internet. Kdy platí zdravotko?

Měšec.cz: Kdy vám stát dá na stěhování 50 000 Kč?

Kdy vám stát dá na stěhování 50 000 Kč?

Lupa.cz: Proč firmy málo chrání data? Chovají se logicky

Proč firmy málo chrání data? Chovají se logicky

Vitalia.cz: Chtějí si léčit kvasinky. Lék je jen v Německu

Chtějí si léčit kvasinky. Lék je jen v Německu

Lupa.cz: UX přestává pro firmy být magie

UX přestává pro firmy být magie

Lupa.cz: Propustili je z Avastu, už po nich sahá ESET

Propustili je z Avastu, už po nich sahá ESET