TIES471 Reaaliaikainen renderöinti
Laskuharjoitus 1 Lataa kirja 3D Math Primer for Graphics and Game development https://tfetimes.com/wp-content/uploads/2015/04/f.dunn-i.parberry-3d-math-primer-for-graphics-and-game-development.pdf Tee tehtävät 1-10 (9.5 Exercises) kirjan sivulta 146. Palauta tehtävät maanantain 18.4 luennolla. Oikein tehdystä tehtävästä 0.1 lisäpistettä tenttiin (Max. 10*0.1=1) Palauta tehtävät maanantaihin 25.4 mennessä
6.2 Näytteistäminen (sampling) Näytteistämisprosessin tarkoituksena on esittää informaatio (data) digitaalisesti. Näytteistämisessä informaation määrä vähenee. Näytteistetty signaali rekonstruoidaan alkuperäiseksi signaaliksi digitaalisen suodatuksen avulla. Näytteistämistä suoritettaessa voi esiintyä aliasoitumista. Aliasoitumista esiintyy, jos signaalia näytteistetään liian matalalla taajuudella. Nyquist rajoitus: (kuva)signaalin näytteenottotiheys pitää olla vähintään kaksi kertaa yhtäsuuri kuin näytteistettävän signaalin maksimitaajuus. Nyquistin rajoitus vaatii signaalille kaistarajoituksen (bandlimit).
6.2 Näytteistäminen (sampling) 3D-renderöinti voidaan kuvitella kolmiulotteisen näkymän näytteistysprosessiksi, joka tuottaa kaksiulotteisen kuvan pikselit. Erityisesti tekstuurimappauksessa uudelleen näytteistyksellä on suuri merkitys. Kolmiulotteinen näkymä ei ole koskaan (normaalisti) kaistarajoitettu, kun renderöinin näytteistys tehdään pisteillä; vastoin Nyquistin rajoitusta.
6.2 Näyttöperustainen antialiasointi Yleinen strategia näyttöperustaiseen antialiasointiin on käyttää näytteistysmallia koko näytölle ja laskea pikseliarvo painottamalla ja yhteenlaskemalla näytteet : n p x, y = w i c(i, x, y) i=1 missä n on pikselikohtainen näytteiden määrä funktio c(i,x,y) on näytteen väri w i näytteen on painokerroin [0..1] Jokainen näyte otetaan eri alueelta (pikseliruudukko) näytöltä ja mahdollisesti näytteistysmalli voi vaihdella pikselien välillä.
6.2 Näyttöperustainen antialiasointi Antialiasointialgoritmit, jotka laskevat enemmän kuin yhden näytteen per pikseli, kutsutaan ylinäytteistysmenetelmiksi (supersampling). Yksinkertaisin koko näkymän antialiasointi menetelmä (FSAA) renderöi koko näkymän suuremmalla resoluutiolla, jonka jälkeen vierekkäiset näytteiden keskiarvot määrävät lopullisen kuvan. Esimerkki haluttu renderöinti resoluutio on 1000 x 800 pikseliä. FSAA renderöi 2000 x 1600, käytetään 2x2 pikseliruutuja, otetaan neljä näytettä per pikseli. Menetelmä MAKSAA, koska jokainen näyte joudutaan varjostamaan ja Z- puskuroimaan.
6.2 Näyttöperustainen antialiasointi MSAA - multisample antialiasing (optimoitu supersampling) http://www.opengl.org/wiki/multisampling CSAA - coverage sampling antialiasing http://www.nvidia.com/object/coverage-sampled-aa.html HRAA - high resolution antialiasing http://www.nvidia.com/object/feature_hraa.html
6.3 Gamma-korjaus Gamma-arvo kertoo pikselin numeerisen arvon ja sen todellisen valontiheyden suhteen. Gammakorjaus poistaa kontrastieroja ja epälineaarisuuksia lopullisesta pikselikuvasta. Gammakorjaukseen sijaan käytetään nykyään ICC-profiileja: http://en.wikipedia.org/wiki/icc_profile
6.4 Kuvaperustainen teksturointi Kuvateksturoinnissa kaksiulotteinen kuva liitetään monikulmion pintaan. Grafiikkaprosessoreiden käyttämä tekstuurikoko on yleensä 2 m x 2 n tekseliä, missä m ja n ovat positiivisia kokonaislukuja. Modernit GPU:t sallivat mielivaltaiset tekstuurikoot. DirectX 10:ssä maksimi tekstuurikoko on 8192 2 tekseliä. Tarkoituksena on estää lopullisen renderöidyn kuvan aliasoituminen, johon tarvitaan näytteistystä ja suodatusta. Tärkeää on erottaa suodatetaanko varjostusfunktion syötteitä vai tulosteita. Tekstuurien suodatus toimii hyvin, jos varjostusfunktion syötteet ja tulosteet liittyvät toisiinsa lineaarisesti (heijastus ja diffuusi). Tässä tapauksessa yksittäisten tekstuuriarvojen suodatus vastaa lopullisten värien suodatusta.
6.4 Tekstuurien suurennos Yleisimmät suodatustekniikat (filtering) tekstuurien suurennokseen ovat lähin naapuri (nearest neighbour) ja bi-lineaarinen interpolointi. Lähin-naapuri suurennusmenetelmälle on luonteenomaista, että yksittäiset tekselit saattavat tulla näkyviksi; pikselöityminen. Pikselöityminen tapahtuu, koska suurennuksessa jokainen pikseli(keskus) saa lähimmän tekselin arvo, joka johtaa karkeaan ulkonäköön. Bi-lineaarinen suodatuksessa pikselille haetaan neljä vierekkäistä tekseliä ja lineaarisesti interpoloidaan ne kaksiulotteisesti. Tuloksena saadaan pikselille sekoitettu arvo. Kuutiollinen konvoluutio (cubic convolution) käyttää alueotantaa, jossa lasketaan tekstuurin tekselijoukon (4x4, 5x5) painotettu keskiarvo. Menetelmällä saadaan huomattavasti parempi tulos tekstuurin suurennoksessa.
6.4 Tekstuurien suurennos Bi-lineaarinen suodatuksessa pikselille haetaan neljä vierekkäistä tekseliä ja lineaarisesti interpoloidaan ne kaksiulotteisesti. Tuloksena saadaan sekoitettu arvo pikselille. (x l,y t ) (x r,y t ) (p u,p v ) (x l,y b ) (x r,y b ) b p u, p v = 1 u 1 v t(x l, yb) + u (1 v )t(x l, yb) + 1 u v t(x l, yt) + u v t(x r, yt) missä (p u, p v ) on pikselin paikka b(p u, p v ) on pikselin sekoitettu arvo (x,y) on tekselin paikka (kokonaislukuja) t(x, y) on tekselin väri u ja v ovat pikselin desimaalit
6.4 Tekstuurien suurennos Etäisyyskenttä on (etumerkillinen) skaalarikenttä yli avaruuden tai pinnan, johon kappale on sidottu. Etäisyyskentät arvot kertovat etäisyyden kappaleen lähimpään rajapisteeseen. Arvo on negatiivinen kappaleen sisällä sijaitseville pisteille ja positiivinen ulkopuolella oleville. Renderöitäessä etäisyyskentän arvot lineaarisesti interpoloidaan. (Team Fortress 2). http://www.valvesoftware.com/publications/2007/siggraph2007_alphatestedmagnification.pdf
6.5 Tekstuurien pienennös Pienennettäessä (minification) tekstuuria useat tekselit saattavat peittää saman pikselin. Tekseleiden vaikutusta tiettyyn pikseliin on vaikea määrittää; reaaliajassa käytännössä mahdotonta. Lähin naapuri (nearest neighbour) pienennös toimii kuten vastaava suurennus suodatin tekee. Menetelmä valitsee tekselin, joka on pikselin päällä. Tämä suodatin voi aiheuttaa aliasoitumisen.
6.5 Mip-kartoitus (mipmapping) Mip-kartoituksessa (mipmapping) alkuperäisestä tekstuurista tehdään joukko pienennetty versioita. Tekstuurin pienennykset jaetaan eri tasoille. Ensimmäisen (alimman) tason pienennys on neljännes alkuperäisestä. Pienennys suoritetaan laskemalla alkuperäisen tekstuurin neljän vierekkäisen tekselin keskiarvo. Prosessia jatketaan rekursiivisesti kunnes tekstuurin korkeus tai leveys on yhden tekselin (korkein taso). http://www.gamedev.net/page/resources/_/technical/directx-and-xna/mip-mapping-in-direct3d-r1233 Mipmap -kartan pystyakseli on kolmas tekstuurikoordinaatti (d). Koordinaatti ei ole välttämättä lineaarinen. Sitä käytetään tasojen näytteistyksessä. Hyvälaatuinen suodatus (Gaussian) ja gamma-korjaus takaavat korkealaatuisen mip-kartan.
6.5 Mip-kartoitus (mipmapping) Koordinaatin d laskennan tarkoituksena on selvittää kuinka pitää näytteistää mip-kartan akselilla. Tavoitteena on saada pikseli-tekseli suhteeksi 1:1 (Nyquist rajoitus). Pikselin liittyessä useampaan tekseliin d:n arvo kasvaa, jolloin pienempää ja epätarkempaa tekstuuria käytetään. Arvo d on analoginen mip-kartan tekstuuritason kanssa; se kertoo tasojen välisen etäisyyden. Ylempi ja alempi tekstuuritaso ja etäisyys (d) näytteistetään. Molempien tasojen interpoloidun näytteet tallennetaan paikkaan (w,v), joka lineaarisesti interpoloidaan suhteessa tasojen väliseen etäisyyteen d. Prosessia kutsutaan trilineaariseksi interpoloinniksi. Koordinaatti d:hen liitetään tarkkuuden tason poikkeama (Level Of Detail, bias). LOD bias lisätään d:hen ja sillä voidaan vaikuttaa tekstuurin tarkkuuteen.
6.5 Anisotrooppinen suodatus Anisotropisen suodatuksen idea on, että pikseli takaisin projisoidaan. Saatu nelikulmio näytteistetään useamman kerran ja näytteet yhdistetään. Jokaisella mip-kartan näytteellä on paikka ja neliön muotoinen alue. Algoritmi käyttää useampaa aluetta kattamaan takaisin projisoidun neliökulmion. Nelikulmion lyhemmän sivun perusteella voidaan määrittää koordinaatti d, jolloin keskiarvoistettu alue on pienempi ja tarkempi jokaiselle mip-kartan näytteelle.
6.6 Tilavuustekstuurit Kuvaperustaisessa tilavuusteksturoinnissa tekstuuriavaruus laajennetaan kolmiulotteiseksi (u,v,w). Esimerkiksi lääketieteellisessä kuvantamisessa data voidaan esittää 3D-hilassa, jossa monikulmiota liikuttamalla voidaan tarkastella kaksiulotteisia otteita (tekstuuri). Tilavuusteksturoinnin avulla voidaan esittää tilavuusperustaisia valoja. Pinnan pisteen valaistus voidaan laskea selvittämällä sen arvo tilavuuden sisällä käyttäen valonsuuntaa. Grafiikkaprosessorit tukevat mip-kartoitusta tilavuustekstuureille. Yhden mipmap-tason suodatus pitää suorittaa tri-lineaarisella interpoloinnilla ja quad-lineaarisella interpoloinnilla. Tilavuustekstuurien käyttö pinnan teksturointiin on tehotonta, koska suurta osaa näytteistä ei käytetä. http://http.developer.nvidia.com/gpugems/gpugems_ch39.html
6.6 Kuutiotekstuurit (cube maps) Kuutiotekstuuri sisältää kuusi neliönmuotoista tekstuuria, jotka ovat liitetty kuution tahoihin. Kuutiotekstuuri määritellään vektorilla (px,py,pz), joka kertoo säteen suunnan kuution keskipisteestä ulospäin. Kuutiotekstuurit ovat käteviä esittämään arvoja, jotka kertovat funktion suunnan. Kuutiotekstuureja käytetään ympäristönkartoitusessa (environment mapping). Artefakteja voi esiintyä kohdissa, joissa kuution tahot yhdistyvät (sivut). Kuutiokartojen pitäisi olla jatkuvia, mutta grafiikkaprosessorit eivät tue bilineaarista interpolointia rajakohtien yli. http://www.nvidia.com/object/cube_map_ogl_tutorial.html
6.7 Tekstuurien välimuisti (texture caching) Monimutkainen sovellus voi sisältää huomattavan määrän tekstuureja. Nopea tekstuurimuistiin määrää vaihtelee järjestelmästä toiseen, mutta käytännössä sitä ei ole koskaan tarpeeksi. Tekstuurien välimuistin hallintatekniikoilla haetaan tasapainoa tekstuurien muistiin latauksella ja niiden muistin tarpeelle kerrallaan. Yleisiä neuvoja tekstuurien käyttöön: tekstuurit on hyvä pitää pieninä, mutta kuitenkin sen verran suurina ettei suurennuksessa tule ongelmia. Monikulmiot kannattaa pitää ryhmiteltynä tekstuurien käytön mukaan. Esimerkiksi näkymän teksturoidut monikulmiot voivat sijaita aluksi kaukana; sovellus lataa mip-kartasta (mipmapping) oikean tason tekstuurit renderöitäviksi.
6.7 Tekstuurien välimuisti (texture caching) Viimeksi vähiten käytetty (LRU=Least Reacently Used) strategia on yksi yleisesti käytetty tekstuurivälimuistitekniikka. Menetelmässä jokaiselle grafiikkaprosessorin muistiin ladatulle tekstuurille annetaan aikaleima, joka kertoo milloin tekstuuria on viimeksi käsitelty renderöinissä. Kun muistia pitää vapauttaa uudelle tekstuurille, ylikirjoitetaan vanhimman aikaleiman omaava tekstuuri. LRU:n yksinkertaisuudesta johtuen, se ei toimi tapauksessa jolloin jokainen tekstuuri pitää vaihtaa jokaisella näyttö päivityksellä. Tässä tilanteessa on hyvä käyttää viimeksi eniten käytetty tekstuuri (MRU) strategiaa. Hyvin laajoissa näkymissä (lentokonesimulaattorit) tekstuurit hajoitetaan pienemmiksi palasiksi, jotta laitteisto pystyy käsittelemään niitä. Clip-kartta (clipmap) rakenne soveltuu erinomaisesti suurin näkymiin. Clip-kartassa koko tekstuuri data käsitellään mip-karttana (mip-map). Renderöinti kevenee, koska mip-kartan alempien tasojen suurempia tekstuurien käyttö on vähäistä (DirectX 10 tuki). http://http.developer.nvidia.com/gpugems2/gpugems2_chapter02.html
6.8 Tekstuurien pakkaus Tekstuuripakkauksella pienennetään muistinkaistanleveyteen ja tekstuurien välimuistiin liittyviä ongelmia. Grafiikkaprosessori pystyy purkamaan pakatut tekstuurit "lennossa", jolloin tarvitaan vähemmän tekstuurimuistia ja samalla tekstuurivälimuistin määrä kasvaa. Huomattavan tärkeää on muistinkaistanleveyteen kohdistuva vaikutus (1. kotitehtävä!) S3 kehitti tekstuurien pakkaukseen S3TC algoritmin (DXTC), jossa tekstuurikuva pakataan erillisiin lohkoihin, joita päästään käsittelemään erikseen. DirectX (DXTC): http://msdn.microsoft.com/en-us/library/bb694531%28v=vs.85%29.aspx OpenGL: https://www.opengl.org/wiki/s3_texture_compression OpenGL ES:ssä käytetään Ericsson texture compression (ETC) algoritmia tekstuurien pakkaukseen.
6.9 Proseduraalinen teksturointi Nykyiset grafiikkaprosessoriarkkitehtuurit tarjoavat mahdollisuuden muodostaa tekstuureja laskennallisesti johtuen tehokkaasta (ja halvasta) laskentakapasiteetista. Esimerkiksi tilavuustekstuurit (volume textures) on järkevää muodostaa proseduraalisesti, koska ne kuluttavat merkittävästi tekstuurimuistia. http://en.wikipedia.org/wiki/procedural_texture
6.9 Tekstuurianimaatio Tekstuurikoordinaatteja voidaan muuntaa verteksi- ja pikselivarjostimilla, mikä mahdollistaa esimerkiksi zoomauksen, pyöritykset, leikkaukset ja muodonmuutokset (morphing). Tekstuurianimaatioolla voidaan toteuttaa monimutkaisempi ilmiöitä kuten vesiputouksia ja tulipaloja.
6.10 Materiaalin mappaus Tekstuuri on materiaalin ominaisuus, joka vaikuttaa varjostusfunktioon : L O v = ( c diff π + m + 8 8π cosm θ h c spec ) ELcosθ i missä m on pinnan sileyttä kuvaava parametri ja väritermit c diff ja c spec ovat vakioita. Todellisen maailman kappaleissa materiaalin ominaisuudet vaihtelevat yli kappaleen pinnan; diffuusitermi c diff ja heijastustermi c spec muuttuvat. Pikselivarjostimella voidaan lukea tekstuurin väriarvot ja muuttaa termejä ennen varjostinfunktion toteuttamista. Tekstuuria, jolla vaikutetaan diffuusitermiin sanotaan diffuusivärikartaksi (diffuse map), vastaavasti heijastustermiä heijastusvärikartaksi (specular map, gloss map).
6.2 Alfa mappaus Läpinäkyvyys, alfa-kanava, kompositio
6.11 Kyhmytys (bumb mapping) Kyhmytystekniikat (bumb mapping) toteutetaan yleensä pikselikohtaisesti. Kyhmytys "parantaa" kappaleiden kolmiulotteista vaikutelmaa, mutta ei niin merkittävästi kuten itse geometria. Kappale yksityiskohdat voidaan luokitella kolmeen mittasuhdeluokkaan: * makro-ominaisuus, joka kattaa pikselijoukon * meso-ominaisuus, joka kattaa "muutaman" pikselin * mikro-ominaisuus, joka kattaa pikseliä pienemmät yksiköt Renderöitäessä ominaisuudet ovat joustavia riippuen katsojan etäisyydestä kappaleeseen. Varjostinmallia käytetään simuloimaan pinnan mikroskooppisia vuorovaikutuksia; kiiltävät kappaleet ovat mikroskooppiselta pinnaltaan sileitä kun vastaavasti diffusoivat pinnat ovat karkeita.
6.11 Kyhmytys (bumb mapping) Meso-geometria kuvaa omaisuuksia mainittujen skaalojen välillä. Se kuvaa yksityiskohtaa, joka on liian vaikeaa renderöidä yksittäisillä monikulmioilla, mutta sellaisia, jotka katsoja pystyy erottamaan muutaman pikselin kattavan pinnan kaarevuuden; kasvojen rypyt, lihaksisto. Tällaisten ominaisuuksien renderöintiin käytetään kyhmytystekniikoita. Kyhmytyksen perusajatus on pinnan normaalin muunnos tekstuurin avulla. Pinnan geometrian normaali säilyy samana, mutta valaistusyhtälön normaalia muutetaan "varoen". Kyhmytyksessä, muutettavan normaalin pitää vaihtaa suuntaa jonkin kehyksen suhteen. Kehysreferenssinä käytetään tangenttiavaruuden kantaa, joka on tallennettu jokaiseen verteksiin. Kehysreferenssillä muunnetaan valo pinnan malliavaruuteen ja lasketaan vaikutus pinnan normaaliin. Monikulmiopinnalle, johon on liitetty normaalikartta (normal map) vertekseihin tallentaan myös tangentti ja bitangentti vektorit.
6.11 Kyhmytys (bumb mapping) Tangentti ja bitangentti vektorit vastaavat normaalikartan akseleita malliavaruudessa. Tarkoituksena on muuntaa valonsuuntaa normaalikartan suhteen. Muunnosmatriisi: t B p = t x t y t z 0 b x b y b z 0 n x n y n z 0 0 0 0 0 b n Matriisi muuntaa siis verteksiin liittyvän valon suunnan maailmankoordinaatistosta tangenttiavaruuteen. Vektoreiden ei tarvitse olla kohtisuorassa toisinsa nähden.
6.12 Normaalimappaus (normal mapping) Suositeltava implementointi kyhmytykselle (bumb-mapping) on normaalikartan tallennus. Normaalikartan tallennus keventää huomattavasti pikselikohtaista varjostuslaskentaa. Normaalikartan tallennukseen tarvitaan kolme komponenttia (x,y,z), jotka voidaan esittää värinä (RGB); yksi värikanava kuvaa yhden suunnan poikkeamaa. Normaalikartan arvot (x,y,z) skaalataan [-1,1]; 8 bitin tekstuurille (0=-1.0, 255=1.0). Esimerkki: väri [128,128,255] vastaa vaalean sinistä, joka kuvaa tasaisen pinnan, jonka normaali on [0,0,1]. Kartasta voidaan hakea jokaiselle pikselille normaali ja soveltaa sitä suoraan varjostinfunktion laskennassa, koska normaalin orientaatio on tekstuurin suhteen. Normaalikarttojen suodatus on vaikeampaa kuin väritekstuurien, koska normaalin ja varjostetun värin suhde ei ole lineaarinen. Standardi suodatus johtaa aliasoitumiseen.