Texturování 6
Obsah
Popis formátu rastrového souboru TGAPouž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:
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:
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:
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):
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):
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í.
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.