8.7. Kolmiulotteiset tekstuuritekniikat Edellä lueteltiin keskeiset kaksiulotteisiin tekstuurikuvauksiin liittyvät ongelmat. Syyt ovat: (1) Kaksiulotteinen tekstuurikuvaus, joka perustuu pintakoordinaatistoon, voi tuottaa laajaa vaihtelua tekstuurin tiivistyksessä. Nämä heijastelevat vastaavaa vaihtelua pinnan käyryydessä. (2) Yritettäessä kuvata tekstuuria jatkuvaksi monimutkaisen ympäristön kohteen pinta voi tulla nopeasti kehnoksi. Tekstuurin jatkuvuus pintaelementtien yli, kun nämä voivat olla eri tyyppiä ja liittyä toisiinsa vaihtelevilla tavoilla, on vaikeaa ylläpitää. Kolmiulotteinen tekstuurikuvaus kiertää nämä ongelmat, koska ainoa tarvittava informaatio pisteen tekstuuriarvon määräämiseksi on sen paikka avaruudessa. Tekstuurin määrääminen kohteelle merkitsee kolmiulotteisen tekstuurifunktion kehittämistä kohteen pinnan pisteille. 8. luku 471 Kolmiulotteinen kohina eli häiriö Suosittu tekstuuritekniikoiden luokka on kohinafunktioiden käyttö. Näille kaikille on yhteistä, että ne soveltavat kolmiulotteista tai spatiaalista kohinafunktiota. Ne pystyvät tuottamaan realistisia, aidonnäköisiä tekstuureja. Merkittävin on turbulenssin eli pyörteen simulointi. Kohinaa varten tarvitaan funktio noise(), joka saa kolmiulotteisen paikan syötteenään ja palauttaa skalaariarvon. Tätä kutsutaan mallin ohjaamaksi synteesiksi. Kehitetään kohinafunktio ainoastaan kiinnostuspisteessä. Funktiolla tulee olla seuraavat ominaisuudet: (1) tilastollisesti invariantti kierrolle (2) tilastollisesti invariantti siirrolle (3) kapea päästökaista taajuuden suhteen 8. luku 472 Kaksi ensimmäistä ehtoa varmistavat, että kohinafunktio on hallittavissa. Riippumatta siirrosta tai suunnasta avaruudessa sen yleisominaisuudet ovat samat. Kolmas ehto suo kohinan näytteistämisen ilman laskostumisen vaaraa. Laskostuminen ei ehkä näkyisi staattisessa kuvassa, mutta animoinnissa se aiheuttaa esim. tuikkimista. Kohina luodaan luonnollisesti satunnaislukugeneraattorilla satunnaislukuina, jotka talletetaan hakutaulukkoon tai tilan säästämiseksi hajautustauluun. Turbulenssin simulointi Kohinan yksittäisarvoa voidaan käyttää simuloimaan useita asioita. Yksi monipuolisimmista sen sovelluksista on ns. turbulenssifunktio (Perlin), jolle annetaan paikka x ja joka palauttaa turbulentin skalaariarvon. Yksiulotteinen versio on: = k i noise(2 x ) turbulence i i= 0 2 Sarja on katkaistu indeksin arvosta k, joka on pienin seuraavan ehdon toteuttava kokonaisluku: 1 k+1 2 < pikselin koko 8. luku 473 8. luku 474
Katkaisukaista rajoittaa funktiota ja takaa sopivan laskostumisen eston. Tarkastellaan esim. ensimmäisen termin noise(x) ja toisen termin noise(2x)/2 eroa. Jälkimmäisen kohdalla kohinafunktio vaihtelee kaksi kertaa niin nopeasti kuin ensimmäisen kohdalla. Jälkimmäisellä on kaksinkertainen taajuus, ja se sisältää piirteitä, jotka ovat kooltaan puolet ensimmäisen termin piirteistä. Turbulenssifunktio edustaa kuitenkin vain osaa tarvittavasta. Se näet johtaa homogeeniseen hahmoon, joka ei ole luonnollinen. Useimmat todelliset tekstuurit sisältävät epähomogeenisiä ominaisuuksia, joten turbulenssi ei yksin riitä niiden simulointiin. Tarkastellaan esimerkkinä marmoria, jossa on sangen selkeästi nähtäviä värijuonia. Aidossa materiaalissa nämä ovat todellisuudessa syntyneet turbulentissä geologisessa prosessissa. Simuloinnissa on kaksi vaihetta: (1) Tekstuurin ensimmäisen asteen peruspiirre esitetään jollakin funktiomuodolla. Tämä on tyypillisesti jatkuva, ja sen ensimmäiset derivaatat sisältävät huomattavaa vaihtelua. (2) Lisätään toisen ja kolmannen asteen yksityiskohtia käyttäen turbulenssia häiritsemään funktion parametreja. Turbulenssina voidaan tässä soveltaa sini aaltoa, joka antaa marmoria muistuttavan tuloksen. Värijuonet, jotka kulkevat häiritsemättöminä, saadaan sini aallolla. Tällöin x akselia pitkin kulkeva sini aalto esitetään: marble(x) = marble_colour(sin(x)) 8. luku 475 8. luku 476 Kuva 8.30. Marmorin simulointia: (a) Vasemmalla on splinillä tehty viipale ilman turbulenssia, (b) keskellä on värisplini, jolla edellinen oli tehty, ja (c) oikealla on simuloitu marmoripala, joka on saatu alkuperäiselle käyttämällä turbulenssia. Värikuvaus marble_colour() kuvaa skalaarisyötteen intensiteettiarvoksi. Kuva 8.30. (a) käsittää kaksiulotteisen marmoriviipaleen, joka on tehty kuvan 8.30. (b) värisplinillä. Seuraavaksi lisätään turbulenssi: marble(x) = marble_colour(sin(x+turbulence(x)) Tällä saatiin kuva 8.30. (c). Kuva 8.31. esittää kolmiulotteista tapausta. Kuva 8.31. Marmorin simulointia. Turbulenssifunktiota voidaan soveltaa muuhunkin kuin väriin. Sillä voidaan käsitellä melkein mitä tahansa parametria, joka vaikuttaa kohteen ulkonäköön. Esimerkkinä on sahalaitamuotoa tuottava funktio, jolla simuloitiin puun kaarnaa, ja pilvien käsittelyä. 8. luku 477 8. luku 478
Kolmiulotteinen tekstuuri ja animointi Turbulenssifunktio voidaan määritellä ajan tai tilan t suhteen lisäämällä ylimääräinen ulottuvuus edustamaan aikaa. Hilan pisteet määrätään tällöin indekseillä (i,j,k,l), jolloin parametrilista käsittää kohinan (x,t) ja samoin turbulenssin (x,t). Pohditaan esimerkkitapauksena tulen simulointia. Liekin perusmuoto tulee esittää funktionomaisesti. Käsitellään tulta kahdessa avaruudessa kolmiulotteisen volumetrisen lähestymistavan ollessa laskennallisesti raskas. Liekkialue määritellään xy tason koordinaattien ( b,0) ja (b,h) suorakulmiossa. Liekin väri tässä alueessa on: 8. luku 479 flame(x) = (1 y/h) flame_colour(abs(x/b)) Kuva 8.32. esittää kaavamaisesti tämän. Funktio flame_colour(x) sisältää kolme eri värispliniä, jotka kuvaavat skalaariarvon x värivektoriin. Jokaisella splineistä R, G ja B on maksimi intensitetti kohdassa x=0, joka vastaa liekin keskikohtaa, ja vaimentuu nollaan intensiteetissä x=1. Vihreä ja sininen splini menevät nopeammin nollaan kuin punainen. Funktion flame_colour(x) palauttama väri painotetaan liekin korkeuden mukaan, jotta saadaan sopiva vaihtelu y akselin suhteen. Liekki renderöidään soveltamalla funktiota flame(x) liekin kattavan suorakulmion värittämiseksi. Kuva 8.32. esittää myös turbulenssifunktion käyttöä: flame(x,t)=(1 y/h) flame_colour(abs(x/b) + turbulence(x,t)) 8. luku 480 Liekin animoimiseksi renderöidään peräkkäisiä kohinaviipaleita, jotka ovat kohtisuoria ja tasavälisiä aika akselin suhteen. Pelkkä monikulmion siirto aikaakselia pitkin ei riitä, vaan sen muotoa pitää samalla muuttaa, jotta liekki eläisi. Siirtämällä samaan aikaan myös y akselia pitkin saadaan tällainen vaikutus aikaan. Kuva 8.33. havainnollistaa simulointia. Lopullinen muoto on: flame(x,t) = (1 y/h) flame_colour(abs(x/b)+ turbulence(x+(0,t y,0),t)) Kuva 8.32. Liekin simulointia turbulenssifunktiolla: ylhäällä liekki ilman turbulenssia ja alhaalla tämän kanssa. Tällöin y on siirretty etäisyys y akselilla suhteessa kohinaan aikayksikössä. 8. luku 481 8. luku 482
8.8. Laskostumisen esto ja tekstuurikuvaus Kuten tämän luvun alussa esitettiin, artefaktat saattavat olla sangen harmillisia tekstuurikuvauksissa. Niiden vaikutus on usein selvästi nähtävissä ja kuvaa vääristäviä, hyvänä esimerkkinä aiemman kuvan 8.14. shakkilauta. Siinä mainittu ylinäytteistysmenetelmä laskostumisen estämiseksi ei monesti riitä, vaan on käytettävä muita tekniikoita. Kuva 8.33. Kaksiulotteisen kohteen turbulenssin animointia. Tekstuurikuvauksilla laskostumisen esto on hankalaa, sillä pitää etsiä pikselin esikuva ja laskea yhteen painotetut arvot T(u,v), jotka ovat esikuvan vaikutuspiirissä, yhden pikselin tekstuuriarvon laskemiseksi. Esikuvan muoto vaihtelee pikselittäin, joten suodatus on laskennallisesti aikaa vaativa. Laskostumisen esto kuvassa 8.34. (a) tarkoittaa integroinnin approksimointia. Likimääräinen, mutta visuaalisesti hyvä menetelmä ei välitä esikuvan muodosta, mutta ottaa huomioon sen koon ja esiprosessoi tarpeellisen suodatuslaskennan. Tämä on mip mapping tekniikka (Williams 1983). 8. luku 483 8. luku 484 Mip mapping perustuu oletukseen, että käänteinen pikselikuva on muodoltaan melko lähellä neliötä. Kuva 8.34. (b) esittää pikselin esikuvan approksimoinnin neliöllä. Tämä approksimointi mahdollistaa laskostumisen eston eli suodatuksen esiprosessoinnin. Kuva 8.34. Mip mapping approksimointi: (a) Pikselin esikuva on yleisessä mielessä kaareva, nelisivuinen alkio tekstuuriavaruudessa. (b) Approksimoidaan esikuvaa neliöllä. (c) Tiivistyminen sattuu pikselin kuvautuessa usealle tekselille. (d) Maksimoituminen esiintyy pikselin kuvautuessa vähemmälle kuin yhdelle tekselille. Asiaan liittyy kaksi ongelmaa. Tavallisempi niistä on tiivistyminen tai minimoituminen, jossa kohde tulee pieneksi kuva avaruudessa ja vastaavasti pikselille tulee suuri esikuva tekstuuriavaruudessa. Kuva 8.34. (c) kuvaa tätä. Monet tekstuurialkiot (tekselit) on kuvattava yksittäisiksi pikseleiksi. Toinen ongelma on maksimoituminen, jossa kohde tulee hyvin lähelle katsojaa ja vain osa kohteesta näkyy kuvaavaruudessa. Tällöin syntyy pikselien esikuvia, jotka ovat pienempiä kuin yksi tekseli (kuva 8.34. (d)). Mipmapping tekniikka käsittelee lähinnä tiivistymistä. 8. luku 485 8. luku 486
Mip mapping tekniikka hyödyntää useita kuvia, jotka on keskiarvoistettu alkuperäisestä kuvasta pienentämällä resoluutiota. Ne käsittävät joukon esisuodatettuja tekstuurikuvauksia. Sekvenssin jokaisen kuvan resoluutio on tarkalleen puolet edellisen resoluuutiosta. Kuva 8.35 esittää tekniikan idean. Lähellä katsojaa oleva kohde, joka on suuri kuva avaruudessa, tarvitsee yksittäisen tekselin suuriresoluutioisesta kuvauksesta. Sama kohde ollessaan kaukana katsojasta ja pienenä kuva avaruudessa vaatii yksittäisen tekselin pieniresoluutioisesta kuvauksesta. Kuva 8.36. havainnollistaa tekniikan soveltamista aiemman kuvan 8.19. yhteydessä. Kuva 8.35. Mip mapping. 8. luku 487 8. luku 488 Kuva 8.36. Mip map tekniikan käyttöä rekursiiviselle teekannulle. 8. luku 489