TIES471 Reaaliaikainen renderöinti
5.1 Valonlähteet Yksinkertaisin valolähde on pistemäinen valo (point light), joka säteilee joka suuntaan annetulla voimakkuudella ja värillä. Suunnattu valo (directional light) säteilee näkymän jokaiseen pisteeseen samansuuntaisesti; esim. aurinko. Ympäröivä valo (ambient light) on ympäristöstä heijastuva valo. Kohdevalo (spotlight) säteilee kartion muotoiseen kiilaan. Valo on voimakkaampi kartion keskellä. http://www.cs.uic.edu/~jbell/coursenotes/computergraphics/lightingandshading.html
5.2 Varjostus (sävytys) Varjostusprosessissa lasketaan materiaalin pinnasta ulospäin suuntautuva valon määrä L 0 katselusädettä pitkin materiaalin ominaisuuksien ja valonlähteiden perusteella. Peiliheijastustermi (specular) termi kertoo materiaalin pinnasta heijastuneen valon määrän : M spec = c spec E L cosθ i, missä E L valon tehotiheys tasolla, joka kohtisuorassa valon suuntavektoria l vastaan Diffuusiheijastustermi kertoo siirtyneen (transmission), imeytyneen n (absorption) ja sironneen (scattering) valon määrän: M diff = c diff E L cosθ i, missä E L valon tehotiheys tasolla, joka kohtisuorassa valon suuntavektoria l vastaan p θ i l
5.2 Varjostus (sävytys) h n Varjostusfunktio materiaalista lähtevälle valolle, kun käytetään yhtä valon lähdettä: v θ h θ i l L O v = ( c diff π + m + 8 8π cosm θ h c spec ) E L cosθ i p missä m on pinnan sileyttä kuvaava parametri ja c diff ja c spec ovat vakioita.
5.2 Varjostus (sävytys) Varjostusfunktiota lasketaan yleensä verteksi- ja pikselivarjostimilla. Varjostinfunktion toteutuksessa tulee huomioida laskentojen taajuus : *Mallikohtainen (per-model) : ilmiön koskiessa koko mallia voidaan laskenta suorittaa yhdellä kertaa sovelluksessa ja antaa tulos grafiikka-api:lle. *Primitiivikohtainen (per-primitive) : ilmiön koskiessa piirtoprimitiiviä (kolmio, viivasegmentti) laskenta suoritetaan geometriavarjostimella (tai verteksivarjostimella, mikäli viereisten verteksien tietoja tarvita). *Verteksikohtainen (per-vertex) : ilmiön koskiessa verteksiä laskenta suoritetaan verteksi-varjostimella ja tulokset lineaarisesti interpoloidaan yli verteksiin liittyvän kolmion käyttäen pikselivarjostinta. *Pikselikohtainen (per pixel) : pikselikohtaiset laskennat suoritetaan pikselivarjostimella.
5.2 Varjostus (sävytys) h n Erotetaan mallikohtaiset alilausekkeet : n v θ h θ i l L O v = (K d + K S cos m θ hk ) E Lk cosθ ik k=1 p missä K d = c diff /π, K s = ((8 + m) / 8 π)*c spec Käytettäessä yhdensuuntaisia valonlähteitä l k ja E Lk ovat vakioita. θ hk ja θ ik muuttuvat läpi monikulmion. cos θ lasketaan l k ja n välisellä tai h k ja n välisellä pistetulolla. n = pinnan normaali h = puolivektori v = katselusuunta l = valon suunta l+v h =, p = p v p l+v p v p
5.2 Varjostus (sävytys) h n float3 Shade ( float3 p, float3 n, uniform float3 pv, uniform float3 Kd, uniform float3 Ks, uniform float m, uniform uint lightcount, uniform float3 1[MAXLIGHTS], uniform float3 EL[MAXLIGHTS]) { float3 v = normalize(pv - p); float3 Lo = float3(0.0f,0.0f,0.0f); v θ h θ i p l for (uint k = 0; k < lightcount; k++) { float3 h = normalize(v + l[k]); float costh = saturate(dot(n, h)); float costi = saturate(dot(n, l[k])); Lo += ((Kd + Ks * pow(costh, m)) * EL[k] * costi; } } return Lo;
5.2 Varjostus (sävytys) Koska suoritetaan Shade-kutsu? Verteksinormaaleja käytettäessä primitiivikohtainen varjostuslaskenta ei tuota sulavaa lopputulosta (flat shading). Verteksikohtainen varjostus ja sen jälkeinen lineaarinen interpolointi tuottaa paremman lopputuloksen; Gouraud ( guh row ) varjostus. Verteksin normaali ja paikka maailmankoordinaateissa annetaan syötteenä Shade-funktiolle. Pikselivarjostin tulostaa suoraan interpoloidun arvon. Gouraud-varjostus toimii hyvin mattapinnoilla. Phong-varjostuksessa verteksivarjostin kirjoittaa maailman koordinaatistossa sijaitsevat verteksien normaalit ja positiot interpoloituihin arvoihin. Pikselivarjostin antaa ne Shade-funktiolle, jonka paluuarvo kirjoitetaan kehyspuskuriin.
5.3 Aliasoituminen ja antialisointi Monikulmion reunat näyttävät näytöllä kulmikkailta ja porrastuneilta. Reunojen porrastumista sanotaan aliasoitumiseksi. Aliasoituminen johtuu riittämättömästä näyttökehyksen resoluutiosta esittämään yksityiskohdat selvästi. Nyquist: kuvasignaalin näytteenottotiheys pitää olla vähintään kaksi kertaa yhtäsuuri kuin näytteistettävän signaalin maksimitaajuus. On mahdotonta välttää täysin aliasoitumista käytettäessä pisteitä (näytteitä) näkymän renderöintiin. Antialisointimenetelmiä esitellään teksturoinnin yhteydessä. http://www.niksula.cs.hut.fi/~pjryynan/stu4portfolio/antialiasointi/antialiasointi.html
6.1 Tekstuuriliukuhihna Teksturointi muokkaa varjostusfunktiossa käytettävien parametrien arvoja perustuen pinnan positioon. Toisin sanoen näkymän kappaleen pinnan väriksi tietyssä pisteessä asetetaan tekstuurin (kuvan) diffuusivärin arvo. Esimerkiksi kiilloon (gloss) visualisointiin tarkoitettu tekstuuri vaikuttaa sitä vastaavaan parametriin tai kyhmytykseen (bumb mapping) tarkoitettu tekstuuri vaikuttaa pinnan normaalin arvoon. Kuvatekstuurin pikseleitä kutsutaan tekseleiksi (texel). Projektiofunktio Vastaavuusfunktio Tulos Muunnosfunktio paikka mallikoordinaatistossa paikka uvkoordinaatistossa paikka tekstuurikoordinaatistossa tekstuurin (väri)arvo muunettu tekstuurin (väri)arvo
6.1 Tekstuuriliukuhihna Liukuhihnan alussa tekstuurin paikka esitetään mallikoordinaatistossa (tai maailman koordinaatistossa). Projektiofunktio muuntaa mallikoordinaatit kaksiulotteisiin (u,v)- koordinaatteihin (tekstuurikoordinaatit). Esimerkiksi ortografista projektiota voidaan käyttää muunnoksessa. Puhutaan tekstuurimappauksesta (texture mapping). Vastaavuusfunktiolla (corresponder function) (u,v) -koordinaatit skaalataan tekstuurin koon alueeseen. Skaalatut (u,v) -koordinaatit osoittavat tekselin väriarvoon. Lopuksi saadut väriarvot muunnetaan varjostusfunktiolle sopiviksi.
6.1.1 Teksturoinnin projektiofunktio 1. askel teksturointiliukuhihnalla projisoi pinnan pisteen kaksiulotteiseen (u,v) -avaruuteen. Projektiofunktion tarkoitus on tuottaa tekstuurikoordinaatteja. Mallinnussovelluksissa (u,v) koordinaatit määritellään (yleensä) verteksi kohtaisesti. Mallinnusohjelmistoissa voidaan käyttää esimerkiksi pallomaisia (spherical), sylinterimäisiä (cylindrical) ja tasomaisia projektiofunktiota. Projektiofunktioina käytetään myös parametrisoitu kaarevia pintoja, jotka sisältävät itsessään (u,v) koordinaatit. Tässä tapauksessa ei ole siis kysymys projektiosta. Yleensä projektiofunktiota käytetään mallinnusvaiheessa ja tulokset tallentaan vertekseihin. Joissakin tapauksissa voi kuitenkin olla järkevää toteuttaa projektiofunktio verteksi- tai pikselivarjostimessa; animointi.
6.1.1 Projektiofunktio Parametriavaruus voi olla kolmi- tai neliulotteinen. Kolmiulotteisessa tapauksessa tekstuurikoordinaatit esitetään vektorina (u, v, w), missä w projektiosuunnan syvyys. Parametriavaruus voi olla tyypiltään suuntaava, jossa jokainen piste edustaa jotakin suuntaa; esimerkiksi kuutiokartta (cube map). Käytettäessä moniteksturointia (multitexturing) tarvitaan jokaiselle tekstuurille omat tekstuurikoordinaatit. Lopullisten tekseli arvojen saantiin käytetään interpolointia.
6.1.2 Vastaavuusfunktio Vastaavuusfunktio muuntaa (skaalaa) parametriavaruuden koordinaatit tekstuuriavaruuden koordinaateiksi. Vastavuusfunktio tarjoaa joustavan tavan asettaa tekstuuri näkymän kappaleen pinnalle. Vastaavuusfunktio voi olla muunnosmatriisi, joka suoritetaan verteksille tai pikselivarjostimelle. Muunnosmatriisilla tekstuuria voidaan siirtää, pyörittää, skaalata, vääntää,... Vastaavuusfunktiolla voidaan valita jokin tekstuurin osa käytettäväksi kappaleen teksturoinnissa. Vastaavuusfunktiolla voidaan hallita tekstuurin käyttäytymistä määritellyn alueen sisä- ja ulkopuolella.
6.1.2 Vastaavuusfunktio Käärintä (wrap, DirectX), toisto (repeat, OpenGL) tai laatoitus (tile): kuvaa toistetaan koko pinnan yli. Peilaus (mirror): Kuvaa toistetaan koko pinnan yli, mutta sen peilikuvaa käytetään joka toisella toistolla. Puristus (clamp) tai purista reunaan (clamp to edge). Tekstuuriarvot lukualueen ulkopuolella [0..1) puristetaan alueelle. Toiminnallisuus on estää vastakkaisen puolen tekselien käytön bilineaarisessa interpoloinnissa. Rajoitus (border) tai purista rajaa (clamp to border). Tekstuurialueen ulkopuoliset arvot renderöidään erikseen määritellyllä värillä. Esiteltyjä vastaavuusfunktioita voidaan käyttää eri akseleilla; tekstuuri voidaan puristaa u-akselilla ja toistaa v-akselilla.