Textury v real-time grafice © 2004-2005 Josef Pelikán, MFF UK Praha http://cgg.ms.mff.cuni.cz/~pepca/
[email protected]
Textury vylepšují vzhled povrchu těles modifikace barvy („bitmapa”) dojem hrbolatého povrchu („bump-texture”) příp. modulace dalších parametrů: průhlednost, odrazivost, lesk, osvětlení z okolí
Definice textury: 1D, 2D datovým polem (rastr, „bitmapa”)
− nejčastější, umí to každý HW
3D datovým polem („volume texture”) procedurálně – algoritmem v každém pixelu (programovatelné GPU)
Definiční obory textur N
R α
V
α
explicitní [s,t] [x,y,z] nebo projektor T
Mapování textur 2D textury se musí na povrch tělesa mapovat texturové souřadnice [ u, v ] (v OpenGL [ s, t ]) se zadávají v každém vrcholu grafický akcelerátor je interpoluje do jednotlivých pixelů v bitmapě se musí intepolovat (mezi sousedními pixely textury = „texely”) v v
u
u
Coke
Coke
Automatické „projektory“ grafický HW umí některé projekce 3D → 2D úspora přenosu dat z CPU na GPU
dostupné projektory (viz glTexGen): sférická projekce (singularita na pólu) cylindrická projekce lineární projekce (používá se často i pro 1D texturu)
uživatelské transformační matice pro texturové souřadnice (viz mód GL_TEXTURE) mohou pracovat i s homogenní složkou (perspektiva) animace textur na povrchu těles
Opakování textur standardní rozsah texturovacích souřadnic: [0,1]D jak se zobrazí údaje mimo tento rozsah?
cyklické opakování (repeat, wrap, tile) zrcadlové opakování (mirror, flip) každá druhá dlaždice se zrcadlově převrátí může vést k lepší (automatické) spojitosti textury
nejbližší texel (clamp, clamp to edge) odolnost k numerickým chybám na okraji textury
explicitní okraj (border, clamp to border) zadán explicitně nebo jedním řádkem/sloupcem textury
Opakování: repeat, mirror
repeat
Tex mirror
Tex Tex Tex Tex Tex Tex Tex
Tex
Opakování: clamp, border
Tex
clamp
Tex
border
Transformace texturových souřadnic maticové transformace prováděné na GPU obecná homogenní matice 4×4 vektor texturových souřadnic: [ s, t, r, q ] q hraje roli homogenní složky (projektivní transformace)
OpenGL: další zásobník transformačních matic GL_TEXTURE dá se nastavit individuálně pro každou texturovací jednotku = každá TU (viz dále) má svůj zásobník
Kombinace textur
⊗ moderní GPU umějí v jednom pixelu kombinovat několik textur („multitexturing”) globální (pomalu se měnící) základ + detailní textura předem spočítané osvětlení („light-map”) „environment maps” – odlesk zbytku scény apod. ...
Kombinace textur běžně implementované kombinační funkce: REPLACE (ignoruje se původní barva) MODULATE (násobení – jen snižuje původní barvu) DECAL (poloprůhledná textura na barevný povrch) INTERPOLATE (lineární interpolace 2 argumentů) DOT3_RGB[A] (skalární součin složek, pro 3D) ADD, ADD_SIGNED, SUBTRACT, ..
programovatelné GPU („fragment shader”) mají potenciálně neomezené možnosti
Texturovací jednotky jedna texturovací jednotka (TU): vybírá hodnotu z jedné textury (i s filtrováním, viz) realizuje zadanou kombinační funkci výsledek se zapisuje do výstupního fragmentu
vstupy (argumenty) kombinační funkce: předchozí barva (výstup předcházející TU) data z textury (přečtený/filtrovaný texel) konstantní barva (viz GL_TEXTURE_ENV_COLOR) primární barva (před texturováním = interpolovaná barva z rasterizační jednotky) ...
Texturovací kaskáda lineární zapojení texturovacích jednotek: primární barva TU 0 Tex0 data
TU 1 Tex1 data
TU 2 Tex2 data
výsledná barva fragmentu
Příklad složitějšího zapojení TU Global
„diffuse”
TU 1 +
Detail Diffuse light map
TU 2 * TU 5 +
Specular „irradiance map” [ Global specular ] „Gloss map”
TU 3 *
TU 4 *
„specular”
result fragment color
Komprese textur - S3TC první použití: S3 v DirectX 6 (1998) DXTC, v OpenGL: S3TC, DXT1
00 11
pevný kompresní poměr výhodné pro plánování spotřeby paměti 4:1 až 6:1 ztrátová komprese
10 01
rozklad textury na bloky („tiles“) velké 4×4 každý blok je reprezentován dvěma 16-bitovými barvami a 16 2-bitovými indexy (tj. celkem 4 bpp) − dvě extrémní barvy (R5G6B5), mezi nimi další 2 mezibarvy (nebo 1 mezibarva a černá) − každý originální pixel je nahrazen odkazem na jednu barvu
Komprese textur – další metody NVIDIA VTC (Volume Texture Compression) 3D varianta S3TC bloky dat 4×4×1, 4×4×2 nebo 4×4×4
3DFX komprese FXT1 (1999) 8×4 texelů se uloží do 128 bitů paměti (tj. také 4bpp) 4 různé formáty bloků (rozhoduje o nich kodér) − CC_HI: 2× R5G5B5, 32× 3-bit kód (5 mezi a 1 průhledná) − CC_CHROMA: 4× R5G5B5, 32× 2-bit kód (původ. barvy) − CC_MIXED: 4× R5G5B5, 32× 2-bit kód (2 pro každý 4×4 čtverec, komplikované sub-formáty) − CC_ALPHA: 3× R5G5B5A5, 32× 2-bit kód (lerp/nlerp)
Pokročilé techniky – přehled Nejdůležitější techniky užívané při texturování: „mip-mapping” a neizotropické filtrování „gloss mapping” (lesklá odrazivost, moduluje odlesk) „light mapping” („dark mapping”) – osvětlení „shadow mapping” – předem spočítaný stín „bump mapping” (modulace normály) „environment mapping” (okolní světlo) víceprůchodové zpracování, „multitexturing”
nemusí být potřeba programovatelná GPU
Filtrování textur textury pozorované z velké dálky se také musejí filtrovat (průměrovat při zmenšování) jinak by se projevil „alias” – zrnění při pohybu kamery
existuje několik technik, jak si zmenšené textury předem připravit: „MIP-map” („multum in parvo”) je asi nejznámější „ripmap” (Hewlett-Packard) obsahuje i neizotropní zmenšeniny neizotropní filtrace – dynamicky se počítá, v jakém poměru se má textura zmenšit, sčítá se jen pár texelů součtové tabulky – předem sečtené UL obdélníky
MIP-mapping předem se textura zmenší na binární zlomky (1/4, 1/16, apod. – umí spočítat GPU) při zmenšování se použije průměrování barev v sousedních pixelech pro 3-kanálovou barvu (např. RGB) existuje šikovné uspořádání MIP-mapy – zmenšená čtvrtina textury se v paměti uloží místo chybějící čtvrté složky
použití MIP-mapy určí se úroveň a z ní se přečte texel (rychlost) interpoluje se mezi dvěma úrovněmi MIP-mapy, případně ještě mezi čtyřmi sousedy v nich (kvalita)
MIP-mapa B3 R 3 G3
B2
B1
G2
R2
B0 G1
R1
R0
G0
Neizotropické filtrování zpětně promítnutý pixel má na textuře tvar deformovaného čtverce z MIP-mapy se vybere taková úroveň, aby měla kratší strana toho čtyřúhelníka délku cca jednoho texelu podél delší strany čtyřúhelníka se průměruje
zobrazovaný pixel přístup do MIP-mapy
Součtové tabulky X=A+B–C-D A, B, C, D ... levé horní součty
B
C
X D
A
pro rychlé počítání součtu (a tedy i průměru) libovolného obdélníka předem se připraví součty všech obdélníků začínajících v levém horním rohu textury je potřeba větší přesnost (minimálně 24 bitů místo 8)
Efekt textury přímá modifikace barvy, modulace barvy skládání několika barev (detaily, vyšší variace, šum, ..) různé operace (viz „Multitexturing“), RGB i α
efekt „obtisku” („decal”) aplikace poloprůhledného obtisku na povrch tělesa viz výše: „billboards“, „imposters”
hrbolatý povrch („bump mapping”) modifikace normálového vektoru texturou
modifikace materiálu efektu je dosaženo např. násobením dané složky světla skalární texturou („Luminance“ formát)
Efekt textury II nanášení světla („light mapping“) nebo stínu („shadow mapping”) předem spočítané světlo nebo stín se aplikuje texturou násobení difusní složky světla texturou
lesklý odraz okolí („environment mapping” EM) napodobení ideálního lesklého odrazu okolní scény GPU musí umět počítat odražený paprsek a adresovat texturu směrovým vektorem EM slouží k implementaci dalších efektů: − lesklá složka osvětlení (specular reflection „S”) − „bump-mapping“ pomocí EM (obě techniky se spojí)
Bump-mapping speciální texturovací technika – vytváří dojem nerovného povrchu nahrazuje velmi komplikovanou mikro-geometrii modifikace (modulace) normálového vektoru pozorovatel získává většinu informace o struktuře povrchu těles ze stínování (odlesků)
implementace předpokládá spolupráci rasterizačního hardware modulace normály texturou, multitexturing lepší je počítat složky osvětlení přímo v jednotlivých pixelech – spolupráce s Phongovým stínováním
Situace zadání: diferenční funkce b(s,t) definující odchylku simulovaného povrchu od jeho jednodušší aproximace odchýlená normála
N'
N
původní normála
S T
b(s,t)
Výpočet odchýlené normály simulovaný bod na povrchu hrbolatého tělesa
N P ' s , t = P s ,t b s ,t ⋅ ∣N∣ odchýlení normálového vektoru
∂b ∂b s , t ⋅S s , t⋅T ∂s ∂t N' = N − ∣N∣ v podstatě je potřeba znát pouze parciální derivace funkce b(s,t) – a ne její hodnotu ...
Další texturovací techniky co může být ještě definičním oborem textury ? 3D souřadnice [ x, y, z ] – tzv. „prostorová textura” − vnitřní struktura materiálu (dřevo, mramor, ...)
normálový vektor N − veličina závislá na normále (statické difusní osvětlení)
vektor odrazu R – „environment mapping” − předem spočítaná data (CPU i spolupráce s GPU) se do rasterizátoru předávají pomocí zvláštní textury − odraz okolní scény na lesklém povrchu tělesa − mapa osvětlení (dopředu spočítané světlo od více zdrojů, od plošných zdrojů, složitějším světelným modelem, ...)
Environment-mapping (EM) vektor odrazu R se převádí do sférických souřadnic – složitější příprava dat šesti čtvercových stěn krychle – „cubic mapping”
obloha
okolí (čtyři světové strany)
plášť krychle ze šesti čtvercových textur
podlaha
Cubic mapping Greene, 1986 jednodušší než dosud používané sférické mapování
textura je uložena v 6 čtvercových bitmapách POSITIVE_X, NEGATIVE_X, POSITIVE_Y, …
snadné pořízení dat – možnost dynamické syntézy přímo na GPU snadné adresování bitmap, není potřeba normalizace vektoru, jenom dělení: 1. výběr složky s maximální absolutní hodnotou ⇒ plocha 2. výpočet souřadnic ve čtverci (dělení zbývajících složek tou maximální)
Cubic mapping POSITIVE_Y
N
[ s, 1.0, t ]
s = x/y, t = z/y
[ 1.0, s, t ] s = y/x, t = z/x
POSITIVE_X
Další typy směrového mapování sphere mapping (Miller, Hoffman: 1984) přímá implementace odrazu světla na perfektní kouli („light probe”) data jsou v jediné textuře, ale nedají se použít z jiných směrů (zkreslení na okraji) paraboloid mapping (Heidrich, Seidel: 1998) dva snímky z přesně opačných směrů bez zkreslení na okrajích, dobré využití paměti rovnoměrnější vzorkování prostorového úhlu implementace: perspektivní projekce texturovacích souř.
Sphere mapping N
R
y 1
E [0,0,1]
z
1
v
-1
R = E−2 N⋅E N
R x R y R z 1 Rx u = 0.5 2m Ry v = 0.5 2m m =
2
2
2
Potřebuje projektivní texturovou transformaci
Paraboloid mapping R
y
E [0,0,1]
z
v
R = E−2 N⋅E N Rx u = 0.5 2 1 R z Ry v = 0.5 2 1 R z Potřebuje projektivní texturovou transformaci
Environment map bump-mapping sférické i kubické mapování umí dělat současné GPU
v texturových souřadnicích „environment-mapy” lze dělat elegantně též „bump-mapping” místo změny normály se modifikuje [ s, t ] pro EM také tuto techniku umí dnešní rasterizační jednotky
N R
[s+ds,t+dt] [ds,dt]
Literatura Tomas Akenine-Möller, Eric Haines: Real-time rendering, 2nd edition, A K Peters, 2002, ISBN: 1568811829 OpenGL ARB: OpenGL Programming Guide, 4th edition, Addison Wesley, 2004, ISBN: 0321173481 J. Žára, B. Beneš, J. Sochor, P. Felkel: Moderní počítačová grafika, 2. vydání, Computer Press, 2005, ISBN: 8025104540