Grafická knihovna OpenGL (27): TGA

6. 1. 2004
Doba čtení: 9 minut

Sdílet

Tento díl seriálu o grafické knihovně OpenGL je zaměřen na popis formátu rastrového souboru typu TGA, který může být použit pro načítání a ukládání textur do externích souborů. Výhodou TGA formátu při práci s texturami je jeho jednoduchost a možnost uložení obrázků v pravých barvách (true color) i s alfa kanálem (tj. průhledností).

Texturování 6

Obsah

Popis formátu rastrového souboru TGA
Použití formátu TGA v počítačové grafice
Interní struktura TGA souboru
Hlavička souboru TGA
Identifikační pole obrázku
Barevná paleta
Rastrová data
Příklady typických souborů TGA
Pokračování
Demonstrační příklad
 

Popis formátu rastrového souboru TGA

Formát pro uložení rastrových obrázků TGA byl vyvinut firmou Truevision Inc., která jej používala pro ukládání snímků z jejích video grabberů Targa. Vzhledem ke své jednoduchosti a současně možnostem ukládání true color obrázků se formát značně rozšířil a byl použit v mnoha aplikacích, zejména těch, které pracovaly s true color grafikou (různé raytracery, skenovací programy apod).

Rastrový obraz může být v souborech typu TGA uložen buď v komprimované, nebo volné (nekomprimované) formě. V dalším textu si oba způsoby ukládání rastrových dat popíšeme. Za zmínku však stojí fakt, že komprimované obrazové soubory typu TGA se dnes již téměř nepoužívají a mnoho převodních programů s nimi ani nedokáže korektně pracovat.

Použití formátu TGA

Formát TGA je také vhodný pro ukládání a načítání textur, protože umožňuje spolu s barevnou informací ukládat i alfa složku (průhlednost), a to dokonce i v obrázcích s barevnou paletou. Pokud stačí ukládat pouze příznak průhlednosti, je možné využít 16bitového formátu pixelů, kdy je pro průhlednost rezervován pouze jeden bit – počet barev dosahuje hodnoty 32 tisíc, což je například pro textury dostatečné množství.

Specialitou formátu TGA je schopnost ukládat obrázky v osmibitové barevné hloubce bez palety. Toho se využívá při práci s obrázky ve stupních šedi (grayscale). Jedná se například o naskenované obrázky nebo textury s luminancí bez barevné informace.

Interní struktura TGA souboru

Data jsou v souboru TGA rozdělena do čtyř sekcí, ale pouze první sekce je povinná. V první sekci na začátku souboru je hlavička, jejíž velikost je vždy 18 byte. V hlavičce jsou uloženy základní informace o obraze, zejména jeho rozlišení, způsob kódování barvy a orientace obrázku.

Za hlavičkou může následovat identifikační pole obrázku, což je textový řetězec o maximální délce 255 znaků. Tato sekce je však nepovinná a málokdy se s ní v obrazových souborech setkáváme.

Ve třetí sekci může být uložena barevná paleta. Tato sekce je, podobně jako sekce předchozí, opět nepovinná. Používá se pouze u některých obrázků s formátem 8 bitů na pixel.

V sekci čtvrté jsou uložena vlastní rastrová data, tj. barvy jednotlivých pixelů. Posloupnost rastrových dat (zejména orientaci vertikální osy) lze ve formátu TGA specifikovat přímo v hlavičce, je například možné obrázky ukládat od prvního řádku do řádku posledního či naopak. Rastrová data mohou být komprimována jednoduchým RLE algoritmem.

Hlavička souboru TGA

Na začátku souboru typu TGA je uložena hlavička, která má vždy velikost 18 bytů (srovnej s hlavičkou souboru BMP, jejíž velikost je 14+40=54 bytů a přitom neobsahuje žádné další důležité informace, mnohé informace naopak chybí). V hlavičce jsou specifikovány všechny informace o rastrovém obraze a způsobu jeho uložení v souboru.

Hlavička má následující formát:

Tabulka č. 526
offset velikost název význam
0 1 byte IDLength velikost obrazového identifikátoru
1 1 byte ColorMapType typ barevné mapy
2 1 byte ImageType typ obrázku
3 2 byte CMapStart počátek barevné palety
5 2 byte CMapLength délka barevné palety
7 1 byte CMapDepth bitová hloubka položek barevné palety
8 2 byte XOffset Xová souřadnice počátku obrázku
10 2 byte YOffset Yová souřadnice počátku obrázku
12 2 byte Width šířka obrázku
14 2 byte Height výška obrázku
16 1 byte PixelDepth počet bitů na jeden pixel
17 1 byte ImageDescriptor popisovač obrázku

Význam jednotlivých položek v hlavičce:

Položka IDLength obsahuje počet bytů v identifikačním poli obrázku. Pokud je hodnota této položky nulová, identifikační pole není použito.

Položka ColorMapType může nabývat pouze dvou hodnot. Pokud se nepoužívá barevná paleta, je zde uložena nula (0×00), pokud se barevná paleta používá, je zde uložena jednička (0×01).

Položka ImageType obsahuje informace o formátu uložení a kódování rastrových dat:
0-žádná rastrová data nejsou uložena
1-nekomprimovaná data s barevnou paletou
2-nekomprimovaná data ve formátu RGB
3-nekomprimovaná data v odstínech šedi (grayscale)
9-data kódovaná RLE s barevnou paletou (je nastaven bit 0×08)
10-data kódovaná RLE ve formátu RGB (je nastaven bit 0×08)
11-data kódovaná RLE v odstínech šedi (je nastaven bit 0×08)
32-data kódovaná Huffmanovým kódem a RLE s barevnou paletou
33-data kódovaná Huffmanovým kódem a RLE s barevnou paletou (uložení v quadtree)

Položka CMapStart obsahuje index první barvy v barevné paletě. Více informací bude uvedeno v části věnované barevné paletě.

Položka CMapLength obsahuje počet položek uložených v barevné paletě.

Položka CMapDepth obsahuje počet bitů pro každou barevnou položku v paletě. Mohou zde být uloženy hodnoty 0 (bez palety), 16, 24 nebo 32.

V položce XOffset je uložena Xová souřadnice levého spodního rohu obrázku. Tato hodnota může být použita pro ukládání výřezů i s jejich relativním umístěním v originálním obrázku.

V položce YOffset je uložena Yová souřadnice levého spodního rohu obrázku. Význam této hodnoty je stejný jako u předchozí položky.

Položka Width obsahuje šířku obrázku v pixelech. Maximální šířka je tak teoreticky 65535 pixelů, v praxi však některé programy používají 16bitová čísla se znaménkem (short int), a tak je vhodné omezit šířku „pouze“ na 32767 pixelů.

Položka Height obsahuje výšku obrázku v pixelech. Maximální výška je opět prakticky omezena na 32767 pixelů.

Položka PixelDepth obsahuje počet bitů na jeden pixel. Podle typu obrázku (tj. maximálního počtu barev) zde mohou být hodnoty 1bpp, 8bpp, 16bpp, 24bpp a 32bpp (bpp-bits per pixel).

V položka ImageDescriptor jsou uloženy příznaky (flags) specifikující posloupnost uložených pixelů:
bity 0–3: počet atributových (alfa) bitů na pixel (nastaveno na 0, 1 nebo 8)
bit 4: rezervován, nastaven na nulu
bit 5: je-li nastaven na jedničku, je počátek umístěn v levém horním rohu
bity 6–7: prokládání řádků: 00-žádné, 01-liché/sudé, 10-čtyři řádky, 11-rezervováno

identifikační pole obrázku

Identifikační pole je představováno řetězcem, jehož formát není pevně stanoven. Proto může každá aplikace do tohoto pole ukládat libovolné údaje. Maximální délka řetězce je 255 znaků, protože velikost položky IDLength je 1 byte. Většina aplikací identifikační pole nepoužívá, proto do IDLength nastavuje nulovou hodnotu.

Barevná paleta

Barevná paleta obsahuje hodnoty barevných složek RGB pro každou položku v paletě. Celkový počet položek v paletě je zadán v hlavičce souboru TGA atributem CMapLength, index první položky atributem CMapStart. Podle počtu bitů na jednu položku (atribut CMapDepth) jsou povoleny tři formáty položek:

32 bitů (Targa 32): barevné složky RGB spolu s alfa-složkou jsou uloženy v pořadí modrá, zelená, červená a alfa. Každá složka má velikost jeden byte. Opačné pořadí barevných složek (tj. BGRA) většinou není na závadu, neboť odpovídá pořadí bytů při čtení na procesorech Intel (formát TGA vznikl pro potřeby aplikací pracujících na těchto procesorech).

24 bitů (Targa 24): barevné složky RGB jsou uloženy v pořadí modrá, zelená a červená. Každá složka má velikost opět jeden byte.

16 bitů (Targa 16): barevné složky RGB jsou spolu s příznakem průhlednosti (pouze 1 bit!) uloženy v bitové struktuře: ARRRRRGG GGGBBBB. Pořadí bytů odpovídá opět konvencím zavedeným u procesorů Intel.

Rastrová data

Formát uložení rastrových dat je vždy little endian, tj. v konvencích používaných u procesorů Intel.

Pro nekomprimované obrázky uložené ve formátu 1bpp je každý pixel reprezentován jedním bitem, které se slučují po osmicích do jednoho bytu. Tento formát není příliš podporován, i když odpovídá dokumentaci firmy Truevision.

Pro nekomprimované obrázky uložené ve formátu 8bpp (tj. buď paletové obrázky, nebo obrázky ve stupních šedi) je každý pixel reprezentován jedním bytem.

Pro nekomprimované obrázky uložené ve formátu 16bpp (bez palety) je každý pixel uložen ve dvou bytech, které mají bitovou strukturu ARRRRRGG GGGBBBB, kde A odpovídá bitu průhlednosti, R jsou bity červené složky, G zelené složky a Bsložky modré.

Nekomprimované obrázky v barevné hloubce 24bpp nebo 32bpp (samozřejmě bez palety) jsou uloženy tak, že každý pixel je představován trojicí bytů RGB popř. čtveřicí bytů ARGB. Vše je uloženo opět dle konvence procesorů Intel.

V TGA lze ukládat i obrázky kódované jednoduchým kódem RLE. Kódování RLE je použito pouze u obrázků, které mají nastavenou hodnotu ImageType na 9, 10 nebo 11. Při RLE kódování jsou posloupnosti po sobě následujících barev se stejnou hodnotou zakódovány dvojicí hodnot: počtem opakování a hodnotou opakování. V režimu RLE je nejvyšší bit (hodnota 0×80) každého bytu na začátku datového paketu rezervován pro příznak, zda se bude jednat o opakování, či nikoliv.

Pokud je tento příznak nastaven (v byte je uložena hodnota větší než 0×7f), udávají hodnoty nižších sedmi bitů počet opakování (počet opakování=hodnota & 0×7f + 1) hodnoty/barvy uložené v následujících bytech (1 byte pro osmibitové obrázky, 2 byte pro 16bitové obrázky atd). Opakovaná hodnota není omezena pouze na jeden řádek, může přeskakovat přes více řádků, což je výhodné zejména při ukládání pozadí. Tato datová posloupnost se nazývá RLE paket.

Pokud je příznak vynulován (v prvním byte posloupnosti je uložena hodnota menší než 0×80), udávají hodnoty nižších sedmi bitů délku dat, která nejsou pomocí RLE kódovaná. Pokud se tedy v obraze vyskytne složitý motiv, je možné uložit až 128 pixelů různých barev v jednom shluku. Tato datová posloupnost se nazývá Raw paket.

Příklady typických souborů TGA

V následujících tabulkách budou ukázány hlavičky typických souborů TGA.

Hlavička souboru TGA ve formátu 1 bit na pixel bez barevné palety:

Tabulka č. 527
hodnoty (hexa) význam
00 obrázek je uložen bez popisky
00 paleta není přítomna
03 obrázek ve stupních šedi
00 00 počátek barevné palety=0
00 00 délka barevné palety je nulová
00 počet bitů na jednu položku palety je nulový
00 00 00 00 umístění obrázku do počátku
XX XX šířka obrázku v pixelech
YY YY výška obrázku v pixelech
01 počet bitů na pixel je 1
20 obrázek je uložen shora dolů
rastrová data po řádcích 1 bit na pixel

Hlavička souboru TGA ve formátu 8 bitů na pixel s barevnou paletou:

Tabulka č. 528
hodnoty (hexa) význam
00 obrázek je uložen bez popisky
01 paleta je přítomna
01 obrázek v paletovém režimu
00 00 počátek barevné palety=0
00 01 délka barevné palety je 256 položek
18 počet bitů na jednu položku palety je 24
00 00 00 00 umístění obrázku do počátku
XX XX šířka obrázku v pixelech
YY YY výška obrázku v pixelech
08 počet bitů na pixel je 8
20 obrázek je uložen shora dolů
rastrová data po řádcích 1 byte na pixel

Hlavička souboru TGA ve formátu 8 bitů na pixel bez barevné palety (stupně šedi):

Tabulka č. 529
hodnoty (hexa) význam
00 obrázek je uložen bez popisky
00 paleta není přítomna
03 obrázek v grayscale režimu
00 00 počátek barevné palety=0
00 00 délka barevné palety je nulová
00 počet bitů na jednu položku palety je 0
00 00 00 00 umístění obrázku do počátku
XX XX šířka obrázku v pixelech
YY YY výška obrázku v pixelech
08 počet bitů na pixel je 8
20 obrázek je uložen shora dolů
rastrová data po řádcích 1 byte na pixel

Hlavička souboru TGA ve formátu 24 bitů na pixel bez barevné palety (True Color):

Tabulka č. 530
hodnoty (hexa) význam
00 obrázek je uložen bez popisky
00 paleta není přítomna
02 obrázek v True Color režimu
00 00 počátek barevné palety=0
00 00 délka barevné palety je nulová
00 počet bitů na jednu položku palety je 0
00 00 00 00 umístění obrázku do počátku
XX XX šířka obrázku v pixelech
YY YY výška obrázku v pixelech
18 počet bitů na pixel je 24
20 obrázek je uložen shora dolů
rastrová data po řádcích 3 byte na pixel

Pokračování

V dalším díle se budeme opět více věnovat přímo knihovně OpenGL. Konkrétně se budeme zabývat blendingem a modulováním textur. Obě techniky se často používají pro kombinaci stínování a texturování na jednom objektu.

Demonstrační příklad

Dnešní demonstrační příklad vychází z příkladu minulého. Jediná věc, která se změnila, je kód pro načítání textur. Naše textury jsou uloženy ve formátu TGA v režimu true color, tj. každý pixel je uložen na třech bytech. Proto je také kód pro načtení textur poměrně jednoduchý, neboť se z hlavičky pouze vyčte rozlišení a formát obrázku.

Ovládání demonstračního programu je možné buď myší (pohybem vlevo a vpravo se provádí otáčení ve scéně, tlačítka slouží k chůzi vpřed a vzad), nebo klávesnicí (šipky pro pohyb a otáčení, CTRL+šipky pro úkroky).

Zdrojový kód demonstračního příkladu je dostupný zde, k dispozici je i HTML verze se zvýrazněnou syntaxí.

bitcoin_skoleni

Screenshot z demonstračního příkladu
Obrázek 1: Screenshot z demonstračního příkladu

Pro majitele pomalejšího připojení k internetu je zde k dispozici celý článek i s přílohami zabalený do jednoho zip souboru.

Autor článku

Vystudoval VUT FIT a v současné době pracuje na projektech vytvářených v jazycích Python a Go.