TIES471 Reaaliaikainen renderöinti



Samankaltaiset tiedostot
Tilanhallintatekniikat

T Vuorovaikutteinen tietokonegrafiikka Tentti

Luku 6: Grafiikka. 2D-grafiikka 3D-liukuhihna Epäsuora valaistus Laskostuminen Mobiililaitteet Sisätilat Ulkotilat

Luento 3: 3D katselu. Sisältö

Luento 6: Geometrinen mallinnus

Tampereen yliopisto Tietokonegrafiikka 2013 Tietojenkäsittelytiede Harjoitus

3D animaatio: liikekäyrät ja interpolointi. Tommi Tykkälä

9. Vektorit. 9.1 Skalaarit ja vektorit. 9.2 Vektorit tasossa

4. Esittäminen ja visualisointi (renderöinti)

Tietokonegrafiikka. Jyry Suvilehto T Johdatus tietoliikenteeseen ja multimediatekniikkaan kevät 2014

MATEMATIIKKA 5 VIIKKOTUNTIA

Luento 6: Piilopinnat ja Näkyvyys

Luento 2: Tulostusprimitiivit

Solmu 3/2001 Solmu 3/2001. Kevään 2001 ylioppilaskirjoitusten pitkän matematiikan kokeessa oli seuraava tehtävä:

Visualisoinnin perusteet

Taso 1/5 Sisältö ESITIEDOT: vektori, koordinaatistot, piste, suora

T Johdatus tietoliikenteeseen ja multimediatekniikkaan Tietokonegrafiikka

Pintoja kuvaavien verkkojen muodostaminen ja optimointi. Antti Seppälä

MS-A0305 Differentiaali- ja integraalilaskenta 3 Luento 7: Pintaintegraali ja vuointegraali

Koordinaatistot 1/6 Sisältö ESITIEDOT: reaaliluvut

Luento 2: 2D Katselu. Sisältö

Luku 6. Dynaaminen ohjelmointi. 6.1 Funktion muisti

11. Tilavuusrenderöinti

z 1+i (a) f (z) = 3z 4 5z 3 + 2z (b) f (z) = z 4z + 1 f (z) = 12z 3 15z 2 + 2

Pitkä matematiikka Suullinen kuulustelu (ma00s001.doc) Tehtävät, jotka on merkitty (V), ovat vaativia.

Suora 1/5 Sisältö ESITIEDOT: vektori, koordinaatistot, piste

Matematiikka vuosiluokat 7 9

TIES471 Reaaliaikainen renderöinti

TOMI LAMMINSAARI 3D-MAAILMAN KAMERAN OHJAAMINEN KASVOJEN PAIKANNUKSEN AVULLA. Diplomityö

Tampereen yliopisto Tietokonegrafiikka 2013 Tietojenkäsittelytiede Harjoitus

NÄKYMÄNHALLINTATEKNIIKAT 3D- GRAFIIKKAMOOTTOREISSA

Preliminäärikoe Tehtävät Pitkä matematiikka / 3

Sovellutuksia Pinta-alan ja tilavuuden laskeminen Keskiö ja hitausmomentti

Riemannin pintojen visualisoinnista

Monikulmiot 1/5 Sisältö ESITIEDOT: kolmio

2.2. Kohteiden konstruktiivinen avaruusgeometrinen esitys

JYVÄSKYLÄN YLIOPISTO. 3. Luennon sisältö

203 Asetetaan neliöt tasoon niin, että niiden keskipisteet yhtyvät ja eräiden sivujen välille muodostuu 45 kulma.

Suorien ja tasojen geometriaa Suorien ja tasojen yhtälöt

Tekijä Pitkä matematiikka Suoran pisteitä ovat esimerkiksi ( 5, 2), ( 2,1), (1, 0), (4, 1) ja ( 11, 4).

Pythagoraan polku

Geometrialtaan mielivaltaisen huonetilan pintojen näkyvyyskertoimien laskenta

Numeeriset menetelmät TIEA381. Luento 6. Kirsi Valjus. Jyväskylän yliopisto. Luento 6 () Numeeriset menetelmät / 33

XXIII Keski-Suomen lukiolaisten matematiikkakilpailu , tehtävien ratkaisut

Kenguru 2016 Student lukiosarja

Ohjelmoinnin peruskurssi Y1

TIES471 Reaaliaikainen renderöinti

Vektorimatematiikkaa Pisteet ja vektorit

Harjoitustehtävät, syys lokakuu Helpommat

Algoritmit 2. Luento 6 To Timo Männikkö

Tekijä MAA2 Polynomifunktiot ja -yhtälöt = Vastaus a)

Luku 8. Aluekyselyt. 8.1 Summataulukko

5. Grafiikkaliukuhihna: (1) geometriset operaatiot

4 Yleinen potenssifunktio ja polynomifunktio

Malleja ja menetelmiä geometriseen tietokonenäköön

Tässä osassa ei käytetä laskinta. Selitä päätelmäsi lyhyesti tai perustele ratkaisusi laskulausekkeella, kuviolla tms.

Kenguru 2012 Student sivu 1 / 8 (lukion 2. ja 3. vuosi)

Luento 6: Tulostusprimitiivien toteutus

Reaaliaikainen karvapeitteen piirtäminen näytönohjaimella

Juuri 4 Tehtävien ratkaisut Kustannusosakeyhtiö Otava päivitetty Kertaus. b) B = (3, 0, 5) K2. 8 ( 1)

MATEMATIIKAN KOE, PITKÄ OPPIMÄÄRÄ HYVÄN VASTAUKSEN PIIRTEITÄ

Käyrien välinen dualiteetti (projektiivisessa) tasossa

GEOMETRIA MAA3 Geometrian perusobjekteja ja suureita

Ota tämä paperi mukaan, merkkaa siihen omat vastauksesi ja tarkista oikeat vastaukset klo 11:30 jälkeen osoitteesta

Algoritmit 2. Luento 6 Ke Timo Männikkö

Tietorakenteet, laskuharjoitus 3, ratkaisuja

Varjoliidon ja Riippuliidon Suomen ennätysten suorittaminen

Reaaliaikaiset varjoalgoritmit. Atso Kauppinen

1.1 Vektorit. MS-A0007 Matriisilaskenta. 1.1 Vektorit. 1.1 Vektorit. Reaalinen n-ulotteinen avaruus on joukko. x 1. R n. 1. Vektorit ja kompleksiluvut

Peruskoulun matematiikkakilpailu Loppukilpailu 2010 Ratkaisuja OSA 1

KESKEISET SISÄLLÖT Keskeiset sisällöt voivat vaihdella eri vuositasoilla opetusjärjestelyjen mukaan.

Ratkaisut vuosien tehtäviin

MATEMATIIKAN KOE, LYHYT OPPIMÄÄRÄ HYVÄN VASTAUKSEN PIIRTEITÄ

Johdatus lukuteoriaan Harjoitus 2 syksy 2008 Eemeli Blåsten. Ratkaisuehdotelma

A TIETORAKENTEET JA ALGORITMIT

DYNAMIIKKA II, LUENTO 5 (SYKSY 2015) Arttu Polojärvi

Luento 4: Kiertomatriisi

c) Määritä paraabelin yhtälö, kun tiedetään, että sen huippu on y-akselilla korkeudella 6 ja sen nollakohdat ovat x-akselin kohdissa x=-2 ja x=2.

Lieriö ja särmiö Tarkastellaan pintaa, joka syntyy, kun tasoa T leikkaava suora s liikkuu suuntansa

Luento 2 Stereokuvan laskeminen Maa Fotogrammetrian perusteet 1

3 Yhtälöryhmä ja pistetulo

Videon tallentaminen Virtual Mapista

Vektorien pistetulo on aina reaaliluku. Esimerkiksi vektorien v = (3, 2, 0) ja w = (1, 2, 3) pistetulo on

1 Kertaus. Lineaarinen optimointitehtävä on muotoa:

PRELIMINÄÄRIKOE PITKÄ MATEMATIIKKA

Oppimateriaali oppilaalle ja opettajalle : GeoGebra oppilaan työkaluna ylioppilaskirjoituksissa 2016 versio 0.8

Tyyppi metalli puu lasi työ I II III

Lyhyt, kevät 2016 Osa A

RATKAISUT a + b 2c = a + b 2 ab = ( a ) 2 2 ab + ( b ) 2 = ( a b ) 2 > 0, koska a b oletuksen perusteella. Väite on todistettu.

Yleistä vektoreista GeoGebralla

kymmenjärjestelmä-käsitteen varmentaminen, tutustuminen 60-järjestelmään kellonaikojen avulla

STL:n luonti IronCADillä

2016/07/05 08:58 1/12 Shortcut Menut

MATEMATIIKAN KOE, LYHYT OPPIMÄÄRÄ HYVÄN VASTAUKSEN PIIRTEITÄ

1 Rajoittamaton optimointi

Harjoitus Bones ja Skin

Algoritmit 1. Luento 3 Ti Timo Männikkö

Grafiikka 205. Tässä luvussa käsitellään geometriaa ja graafisia kohteita. Mukana on pääosin alkeisoperaatioita.


Transkriptio:

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 18.4 mennessä

Harjoitustyö vaihe I 1. Esittely *Harjoitustyön lyhyt kuvaus *Sovelluksen ominaisuudet & toiminnallisuudet *Käytettävät aliohjelmakirjastot ja muut valmiit komponentit 2. Alustava komponenttikaavio (UML) 3. Alustava luokkakaavio (UML) Palauta pdf-tiedostona Jarnolle viimeistään maanantaina 11.4

4.6 Projektiot Ennen leikkausvaihetta näkymän geometria projisoidaan tasolle tai yksinkertaiseen tilavuuteen. Käytämme projektioiden laskuissa oikean käden koordinaattisysteemiä; kamera osoittaa negatiivisen z-akselin suuntaan, y-akseli ylös ja x-akseli oikealle (OpenGL). Direct3D:ssä käytetään vasemman käden koordinaattisysteemiä; kamera osoittaa z-akselin positiiviseen suuntaan. Ortografista projektiota käytettäessä yhdensuuntaiset suorat säilyvät yhdensuuntaisina. Ortografinen projektio muunnos poistaa yhden ulottuvuuden. Muunnosmatriisi P 0 projisoi geometrian tasolle z=0 : P O = 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 Ortografisessa projektiossa sekä positiiviset ja negatiiviset z-koordinaatit muuntuvat samalle tasolle.

4.6 Ortografinen projektio Yleinen tapa tehdä ortografinen projektio, on käyttää kuutta tasoa: oikea, vasen, ala, ylä, etu, taka. Muunnos skaalaa ja siirtää esiteltyjen tasojen muodostaman akselien suuntaisen rajauslaatikon (AABB) kuutioksi origoon (keskipiste 0,0,0). P O = S s T(t) = 2 r l 0 0 0 r+l 2 t b 0 0 r l 0 t+b 2 f n t b f+n f n 0 0 0 1 Huom! n > f. OpenGL:n void glortho(gldouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble nearval, GLdouble farval); ottaa syötteenä n < f ja hoitaa muunnoksen itse negaatiolla. Yksikkökuutiota kutsutaan kanoniseksi kuvasärmiöksi ja koordinaatteja normalisoiduiksi näyttökoordinaateiksi. Projektiomuunnoksen jälkeen geometria leikataan yksikkökuutiolla.

4.6 Perspektiiviprojektio Perspektiiviprojektiota käytettäessä renderöity näkymä vastaa enemmän todellisuutta; kauempana sijaitsevat kappaleet näyttävät pienemmiltä. Perspektiiviprojektiota käytettäessä yhdensuuntaiset suorat eivät (yleisesti) säily yhdensuuntaisina; suorat lähenevät toisiaan äärettömyydessä. Katselupiste (kamera) sijaitsee origossa. Piste p projisoidaan tasolle z = -d (d>0), josta saadaan piste q = (qx, qy, -d). Yhdenmuotoisista kolmioista pisteen q komponentti x voidaan esittää : p z z = -d q p q x = d p x p z q x = dp x pz q y = dp x p z q z = d q x p x P p = 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1/d 0

4.6 Perspektiiviprojektio Verifioitinti vektorin muunnoksella: P p = 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1/d 0 p x p y p z 1 = p x p y p z p z /d dp x p z dp y p z d 1 Näkymäfrustumi (view frustum) alkaa etutasolta (z=near) ja loppuu takatasoon (z=far). Näkökenttä (field of view) : = 2 arctan ( w (2d) ) missä w = kappaleen leveys kohtisuorassa näköakselin suuntaan, d = etäisyyskappaleeseen

4.7 Perspektiivikorjaus Perspektiivikorjausinterpolointi tehdään, jotta saadaan tekstuurit näyttämään oikeilta. Lineaarista interpolointia ei voi käyttää värien ja tekstuurien interpolointiin. Tekstuurien interpolointi toimii, kun tekstuurikoordinaatit jaetaan w- komponentilla; ((u/w),(v/w)). Lopuksi interpoloidut tekstuurikoordinaatit jaetaan interpoloidulla (1/w), jotta saadaan oikea tekstuurin paikka. Tätä kutsutaan hyberboliseksi interpoloinniksi.

4.7 Perspektiivikorjaus Esimerkkinä kolmion rasterointi. u i Kolmion verteksi : r = (p i i, 1, v i ), w i, w i w i missä pi =(p ix, p iy, p iz ) paikka prespektiiviprojektion jälkeen, 1/w i esittää w-komponenttia Vaakaviivan pikseli koordinaattien laskenta: r 3 saadaan interpoloimalla r 0 :sta r 1 :seen, r 4 interpoloimalla r 2 :sta r 1 :seen. R 2 = [ p 2, (1/w 2 ), (u 2 /w 2 ), (v 2 /w 2 ) ] R 0 = [ p 0, (1/w 0 ), (u 0 /w 0 ), (v 0 /w 0 ) ] R3 R4 R 1 = [ p 1, (1/w 1 ), (u 1 /w 1 ), (v 1 /w 1 ) ]

12 Monikulmiotekniikat (polygon techniques) Monikulmiot voidaan määritellä useissa muodoissa, joten ne voidaan joutua jakaamaan käytännöllisempiin primitiiveihin kuten kolmioihin tai nelikulmioihin; tesselaatio (tessalation). Vakauttaminen (consolidation) on prosessi, joka käsittää monikulmioon liittyvän tiedon yhdistämisen ja linkittämisen, esimerkiksi normaalien ja pinnan materiaalin liittämisen. Kolmioittamisella (triangulation) varmistetaan, että data on kelpaa näytettäväksi ja näyttää näytöllä oikealta. Vakauttaminen parantaa renderönnin tulosta ja yleensä nopeuttaa renderöintiä jaetun laskennan avulla. Optimoinnilla ja yksinkertaistamisella (simplification) nopeutetaan edelleen renderöintiä. Yksinkertaistaminen poistaa turhat monikulmiot.

12 Monikulmiotekniikat Tapoja tehdä monikulmiomalli: 1. Kirjoitetaan suoraan geometrian kuvaus. 2. Luodaan geometrinen kuvaus ohjelman avulla; proseduraalinen mallinnus. 3. Muunnetaan toisessa muodossa oleva data (oikeaan) geometriseen muotoon, esimerkiksi molekyylien pinta- tai tilavuusesityksen palloiksi tai sylintereiksi. 4. Luodaan geometria mallinnusohjelmilla 5. Näytteistetään todellinen malli useasta pisteestä, kolmiulotteinen digitalisoija. http://dl.acm.org/citation.cfm?id=825409 6. Rekonstruoidaan malli useammasta kuvasta http://en.wikipedia.org/wiki/photogrammetry 7. Käytetään 3D-skannausta mallin muodostamiseen. http://en.wikipedia.org/wiki/3d_scanner 8. Käytetään edellä mainittujen tekniikoiden yhdistämistä. Tekniikoiden tarkoitus on esittää saatu data monikulmiomuodossa.

12 Monikulmiotekniikat Mallinnustekniikat voidaan jaotella kiinteä- (solid-based) tai pintaperusteisiin (surface-based) tekniikoihin. http://en.wikipedia.org/wiki/solid_modeling http://en.wikipedia.org/wiki/freeform_surface_modelling

12.1 Tesselaatio ja kolmioittaminen Tesselaatio on prosessi, joka pilkkoo pinnan monikulmioiden joukoksi. Yleisesti kaikki grafiikkaprosessorit ja -rajapinnat ovat optimoitu kolmioiden käsittelyyn. Toisin sanoen kolmiot ovat atomisia yksiköitä, joista renderöitävät pinnat muodostetaan. Kompleksisen monikulmion muuntamista kolmioiksi kutsutaan kolmioittamiseksi (triangulation). Renderöijä voi käsitellä vain konvekseja monikulmioita. Tällaisessa tapauksessa tesselaatiota kutsutaan konveksipilkonnaksi. Pinta voidaan joutua pilkkomaan, jotta saadaan tallennettua esimerkiksi varjon vaikutus kussakin verteksissä tai sisäiset heijastukset käyttämällä radianssin siirtotekniikoita.

12.1 Tesselaatio ja kolmioittaminen Tessaloimaton, konveksoitu, kolmioitettu ja yhtenäisesti tessaloitu Ensimmäinen vaihe pinta-tesselaatiossa on tutkia kuinka monikulmio projisoituu kaksi-ulotteiseksi. Tämän tiedon perusteella prosessi yksinkertaistuu kuten myös käytettävät algoritmit. Yksi menetelmä on projisoida monikulmio tasolle xy, yz, ja xz. Riippuen tuloksesta mahdollisesti yksi dimensio (x,y tai z) voidaan vähentää. Paras taso on yleensä monikulmio, jonka projisoitu ala on suurin. Projektion alan laskennan sijasta voidaan yksinkertaisesti jättää pois koordinaatti, jolla on suurin paino monikulmion normaalissa. Esimerkiksi koordinaatti (-7,2,4); jätetään x pois.

12.1 Tesselaatio ja kolmioittaminen Ongelman projisoinnin ja normaalin käyttöön aiheuttaa nelikulmio; tiimalasi tai rusetti monikulmio (mallinnusvirhe). [kirja] Ratkaisuna käytetään esimerkiksi Newelsin kaavaa: lasketaan kolmesta projisoidusta alueesta lasketaan keskiarvo taso, josta muodostetaan normaali; x=yz, xz=y ja xy=z. Yksikertainen kolmioittamisalgoritmi on muodostaa viivasegmentti, minkä tahansa kahden verteksin välillä ja tutkia leikkaako se monikulmion sivuja tai onko se päällekäin jonkun sivun kanssa. Mikäli testi on positiivinen, viivasegmenttiä ei voida käyttää monikulmion lohkomiseen. Muussa tapauksessa lohkaistaan monikulmio sekmentin suhteen ja jatketaan.

12.1 Tesselaatio ja kolmioittaminen Tehokkaampi kolmioittamisalgoritmi on "korvien leikkaus" (ear clipping); vaativuus O(n 2 ). Ensimmäisessä vaiheessa etsitään monikulmion korvat yhdistämällä kolmen peräkkäisen verteksin ensimmäinen ja kolmas verteksi viivasekmentillä. Mikäli viivasekmentti leikkaa monikulmiota on kysymyksessä "korva", joka leikataan pois. Prosessia jatketaan, kunnes korvia ei enää löydy. Monimutkaisemmat kolmioittamisalgoritmien vaativuus on O(n log n). Tesselaatio ja kolmioittaminen ovat laskennallisen geometrian paljon tutkittuja alueita.

12.1 Tesselaatio ja kolmioittaminen Yksi tapa ohittaa kolmioittaminen on renderöidä kompleksi monikulmio suoraan grafiikkaprosessorilla. Ideana on, että oikeasti näkyvät pikselit piirretään parittomilla kerroilla. Reiät ja koverat kohdat piirretään parillisilla kerroilla. Algoritmi: Monikulmio renderöidään kolmioviuhkana (triangle fan) stensiilipuskuriin. Stensiilipuskuria käytetään käänteismoodissa, jolloin täytetyt alueet merkitään ensimmäisessä vaiheessa (first pass). Toisessa vaiheessa (second pass) kolmioviuhka renderöidään uudelleen normaalissa stensiilipuskurimoodissa, jolloin renderöidään ainoastaan täytetyt alueet. Menetelmän etuna on ettei kolmioitusta tarvitse suorittaa olenkaan, mutta haittana on että monikulmiot pitää piirtää kaksi kertaa ja stensiilipuskuri pitää tyhjätä joka kuvakehyksellä. http://open.gl/depthstencils

12.1.1 Varjostusongelmat Katso kirja [537] 12.2.2 Reunojen murtumat ja T-verteksit (Edge Cracking and T-Vertices) Katso kirja [539]

12.2 Vakauttaminen (consolidation) Tesselaation jälkeen on järkevä tarkastaa muodostettujen monikulmioiden oikeellisuus: Onko verteksilistassa peräkkäin identtisiä verteksejä? Onko monikulmiossa vähintään kolme uniikkia verteksiä? Yhdistämisoperaatio (merging) etsii yhteiset verteksit monikulmioiden välillä. Suuntausoperaatiolla (orientation) pinnan muodostavien monikulmioiden sivut suunnataan samaan suuntaan. Suuntausoperaation jälkeen tutkitaan muodostaako monikulmioverkko kiinteän pinnan. Reunatunnistuksella etsitään graafisesti merkittäviä reunoja. Operaation liitetään yleensä verteksien normaalien muodostus, jolla saadaan pinta näyttämään sulavalta.

12.2.1 Yhdistäminen (merging) Geometrinen data voi olla joskus hajallaan ja monikulmioita ei ole liitetty toisiinsa mitenkään. Erillisten monikulmioiden tallennus on ajanhukkaa ja niiden renderöinti on hyvin tehotonta. Tästä syystä erilliset monikulmiot yhdistetään yhdeksi monikulmioverkoksi (mesh). Yksinkertaisimmillaan monikulmioverkko on lista verteksejä ja ääriviivoja. Jokaisella verteksillä on paikka ja siihen liittyviä tietoja kuten diffuusi- ja heijastusväri, (varjostus)normaali, tekstuurikoordinaatit jne. Jokaisella monikulmion ääriviivalla (outline) on indeksi 0 -> n-1, missä n on verteksien määrä. Jokainen verteksi voidaan tallentaa vain kerran ja se voidaan jakaa usean monikulmion kanssa. Kolmioverkko (triangle mesh) on monikulmioverkko, joka sisältää vain kolmioita.

12.2.1 Yhdistäminen Yksinkertaisin tapa tehdä yhdistäminen on hajautus (hashing). Algoritmi: aluksi verteksi-indeksi alustetaan nollaksi. Jokaisen monikulmion verteksit tallennetaan hajautus-tauluun. Verteksi ja sen indeksi tallennetaan hajautustauluun, jos se ei vielä ole siinä. Samalla indeksiä kasvatetaan ja verteksi tallennetaan lopulliseen verteksilistaan. Mikäli verteksi on jo hajautustaulussa, haetaan sen indeksi ja tallentaan monikulmio indekseineen. Monikulmion sivujen orientaatio voi olla aiheuttaa ongelmia riippuen mallin datasta. Normaalisti CAD-mallinnuksessa verteksit etenevät monikulmion ääriviivoissa vastapäivään katsotaessa sivua ulkoapäin. Kysymyksessä on oikean käden orientaatio, joka ei riipu käytettävästä näkymän tai mallin orientaatiosta.

12.2.2 Suuntaaminen (orientation) Tietyissä tilanteissa on välttämätöntä varmistaa, että pinta voidaan onnistuneesti suunnata. Jokainen monikulmion sivu tulisi jakaa enintään kahden monikulmion kesken monikulmioverkossa. Yksi lähestymistapa monikulmion suuntaukseen: 1. Muodostetaan sivu-pinta (edge-face) rakenteet kaikille monikulmioille. 2. Järjestetään tai hajautetaan (hash) sivut, jotta löydetään peräkkäiset sivut. 3. Etsitään monikulmioryhmät, jotka koskettavat toisiaan. 4. Käännetään ryhmien pinnat yhdenmukaisen rakenteen saavuttamiseksi. Ensimmäisessä askeleessa luodaan puoli-sivut (half-edge). Puoli-sivu on monikulmion sivu, jossa on osoitin monikulmion pintaan (face). Koska sivu on yleensä jaettu kahden monikulmion kesken, puhutaan puolisivusta. Puoli-sivu muodostetaan tallentamalla verteksit järjestyksessä. Järjestyksen perustana on vektorikomponenttien suuruus järjestyksessä x (1.), y (2.) ja z (3.). Nyt tarkoituksena on löytää sivut, jotka ovat identtisiä. Haku onnistuu helposti hajautustaulusta, kun verteksit on järjestetty vektorikomponenttien mukaan.

12.2.2 Suuntaaminen Nyt tarkoituksena on löytää sivut, jotka ovat identtisiä. Haku onnistuu järjestetystä listasta, koska permutaatioita ei tarvitse huomioida. Hajautustaulua käytetään yhteensopivien sivujen hakuun. Mikäli kaikki verteksit ovat aiemmin liitetty yhteen niin että puolisivut käyttävät samoja indeksejä, voidaan yhteensopiva puolisivu tallentaa väliaikaiseen listaan. Puolisivuun liitetään tieto sen ensimmäisestä verteksistä. Liitokset vierekkäisten monikulmioiden välillä tiedetään, kun sivut on saatu yhteensovitettua. Saadaan muodostettua vierekkäisyysgraafi (adjacency graph), jossa esitetään listana kolmiot ja niihin liitetyt indeksit. Mikä tahansa sivu, jolla ei ole kahta naapuri monikulmiota on ns. rajasivu (boundary edge). Toisiinsa koskettava monikulmiot muodostavat jatkuvan ryhmän (continuoes group).

12.2.2 Suuntaaminen Seuraavaksi säädetään monikulmioverkon suuntauksen yhdenmukaisuus; jokaisen monikulmion ääriviivojen tulisi olla vastanpäivään suunnattuja. Jokaisesta monikulmioryhmästä valitaan sattumanvaraisesti monikulmio, josta aloitetaan. Monikulmion naapureiden orientaatiot tarkastetaan seuraavasti: mikäli sivun (edge) läpikäyntisuunta on sama molemmissa monikulmioissa pitää naapuri monikulmio kääntää (flip). Rekursiivisesti käydään läpi naapurin naapurit kunnes kaikki jatkuvat ryhmät on testattu kerran.

12.2.2 Suuntaaminen Osa monikulmion pinnoista saattaa olla suunnattuna sisäänpäin. Etumerkillisellä tilavuustestillä tarkastetaan pinnan orientaatio. Tilavuustesti tehdään monikulmioryhmälle. Algoritmi: ensin lasketaan ryhmän rajaussärmiön keskipiste. Vetämällä viivat rajaustilavuuden keskipisteestä monikulmion kärkipisteisiin muodostuu tetraedi (tapaus kolmio), jonka tilavuus lasketaan. Jos tilavuus on negatiivinen monikulmion sivujen järjestys ja normaali käännetään. Tapauksessa, jossa kappale ei ole kiinteä vaan pelkästään pinnan kuvaus, on mahdollista että orientaatio on edelleen vääriin. Tarvitaan tekijän manuaalinen tarkastus.

12.3.1 Kolmiorakenteet Grafiikkaprosessorin kuormaa voidaan vähentää lähettämällä liukuhihnalle kolmioryhmiä, jotka jakavat verteksejä mahdollisimman paljon keskenään, jolloin vähemmän verteksejä ja normaaleja pitää muuntaa, vähemmän leikkauksia tarvitsee suorittaa, valaistuksen vaikutuksen laskeminen vähenee... Kolmioviuhka: http://en.wikipedia.org/wiki/triangle_fan Kolmioliuska: http://en.wikipedia.org/wiki/triangle_strip http://www.opengl.org/documentation/specs/version1.1/glspec1.1/node17.html http://profs.sci.univr.it/~colombar/html_opengl_tutorial/en/02rendering_022.html Kirja [547]

12.4 Verteksi- ja indeksipuskurit Grafiikkarajapintojen verteksipuskurikutsut ovat tehokas tapa toimittaa mallin data grafiikkaprosessorille. Verteksipuskuri on jatkuva muistialue, johon verteksidata tallennetaan. Verteksipuskurin tietorakenne on taulukko, johon on tallennettu verteksiin liittyvät tiedot: diffuusi- tai heijastusvärejä, normaali, tekstuurikoordinaatteja jne. Yhden verteksin muistin varauskokoa tavuina sanotaan "loikaksi" (stride). Vaihtoehtoisesti voidaan käyttää verteksivirtoja (vertex stream). Useampia verteksivirtoja voidaan käyttää säästämään tilaa ja siirtoaikaa. Yhteen virtaan ("striimiin") tallennetaan taulukko verteksien paikoista ja toiseen normaalit. Käytännössä nykyisillä grafiikkaprosessoreilla on tehokkainta käyttää yhtä verteksipuskuria.

12.4 Verteksi- ja indeksipuskurit Verteksidata voidaan käsitellä: 1. Yksittäisten pisteiden listana 2. Erillisinä viivasegmentteinä (verteksipareina) 3. Yksittäisenä murtoviivana (polyline) http://en.wikipedia.org/wiki/polygonal_chain 4. Kolmiolistana (triangle list) 5. Kolmioviuhkana (triangle fan) 6. Kolmioliuskana (triangle strip) DirectX 10:ssä kolmioihin voidaan liittää rinnakkaisia kolmio verteksejä, joita voidaan hyödyntää geometriavarjostimella. Katso kirjan kuvat [559].

12.4 Verteksi- ja indeksipuskurit Grafiikkaprosessorille siirrettävän ja tallennettavan datan määrä on usein pienempi, kun käytetään indeksipuskuria. Hyöty verteksien jakamisesta käytettäessä indeksipuskuria on huomattavasti suurempi kuin indeksipuskurista aiheutuva pieni ns. ylikäyttö (overhead). Indeksipuskuri voi sisältää erillisiä kolmioita tai kolmioliuskoja (tristrip), jotka ovat tikattu yhteen jaetuille vertekseillä. Yksi strategia on etsiä kolmioille järjestys, jotta voidaan hyödyntää välimuistia (cache). Sääntö: kolmioliuskat, joissa on keskimäärin kaksi tai enemmän kolmiota vie vähemmän tilaa kuin indeksoitu kolmiolista. Verteksien tallennuksen optimoinnin pääasiallinen tarkoitus on renderöintinopeuden parantaminen, ei niinkään tallennuksen (tilan) optimointi.

12.4 Verteksi- ja indeksipuskurit Esimerkki: Mallinnusohjelmassa kuution kahdeksan kulmapistettä tallennetaan taulukkoon, sen kuusi normaalia ja sivujen määrämiseen kuusi indeksisilmukkaa toiseen taulukkoon. Grafiikkaprosessorilla tallennetaan 24 verteksiä. Jokaisella kuution kulmapisteellä on kolme normaalia riippuen sivusta. Indeksipuskuriin tallennetaan 12 kolmioita, joilla määritellään kuution pinnat (2*6). Varjostinmallissa 4.0 (shader model) voi tulostaa prosessoituja verteksejä uuteen puskuriin, mikä mahdollistaa joustavan tavan käyttää verteksipuskureita. Esimerkki: ensimmäisessä vaiheessa (pass) verteksipuskuriin määritelty kolmioverkko käsitellään yhtenä sarjana pisteitä. Verteksivarjostin laskee vertekseille halutut operaatiot ja tulostaa tulokset uuteen verteksipuskuriin. Seuraavassa vaiheessa uusi verteksipuskuri linkitetään alkuperäiseen indeksipuskuriin kuvaamaan kolmioverkon liitoksia, joita voidaan hyödyntää jatkoprosessoinnissa.

13 Käyrät ja kaarevat pinnat Käyrät ja kaarevat pinnat voidaan kuvata tarkasti matemaattisilla yhtälöillä. Yhtälöiden laskentatuloksista muodostetaan kolmiot, jotka renderöidään grafiikkaliukuhihnalla. Hyödyt ja erinomaisuudet: 1. Huomattavasti kompaktimpi esitystapa kuin monikulmioilla. 2. Tarjoavat skaalautuvat geometriset primitiivit. 3. Tarjoavat sulavammat ja jatkuvammat primitiivit kuin suorat viivat ja tasomaiset monikulmiot. 4. Animointi ja törmäystarkastelu on helpompaa ja nopeampaa. 5. Yleensä kaarevien pintojen transformointi vaatii vähemmän matriisioperaatioita kuin vastaavan monikulmioverkon. 6. Tietokoneen suorittimelta (CPU) grafiikkaprosessorille (GPU) lähetettävän tiedon määrä on huomattavasti pienempi, mikäli grafiikkaprosessori pystyy ottamaan vastaan kaarevan pinnan määrittelyn suoraan.

13.1 Parametrisoidut käyrät Reaaliaikaisessa grafiikassa parametrisoituja käyriä käytetään yleensä liikuttamaan katsojaa tai kappaletta tiettyä ennaltamäärättyä polkua pitkin. Muita käyttöjä esimerkiksi hiusten renderöinti [kirja 577]. Lineaarinen interpolointi kahden pisteen välillä tuottaa suoran viivan (jana). Yhtälö kuvaa interpoloidun pisteen p(t): p t = p 0 + t p 1 p 0 = 1 t p 0 + tp 1 missä t on käyrän parametri [0,1]. Esimerkiksi, jos haluamme liikuttaa kameraa pisteiden p 0 ja p 1 välillä 20 askelta sekunnin aikana: t i = i/20, i on kuvakehyksen indeksi. Lineaarinen interpolointi toimii hyvin kahden pisteen välillä, mutta useamman pisteen kanssa tulee ongelmia.

13.1 Parametrisoidut käyrät Ratkaisuna on toistaa lineaarista interpolointia, jolloin saadaan muodostettu Bezier (beh-zee-eh) käyrän geometrinen määrittely. Ensin pitää lisätä pisteitä, jotta voidaan toistaa interpolointi. Lisätään kolme kontrollipistettä a, b ja c. Lasketaan p(1/3); t=1/3. Lasketaan uudet pisteet d ja e lineaarisesti interpoloimalla a:sta b:hen ja b:stä c:hen. Lopuksi lasketaan f lineaarisesti interpoloimalla d:stä e:hen; p(t) = f. Muodostuu yhteys: p t = 1 1 d + te = 1 t 1 t a + tb + t (1 t)b + tc = 1 t 2 a + 2 1 t tb + t 2 c Saadaan paraabeli, jonka asteluku on kaksi. Käyrän asteluku riippuu kontrollipisteistä, jos n + 1 kontrollipistettä käyrän aste on n. Toisin sanoen kontrollipisteiden lisääminen kasvattaa käyrän vapausasteita; neliöllinen, kuutiollinen,... Katso kirja [578].

13.1 Parametrisoidut käyrät Toistettavaa (rekursiivinen) lineaarinen interpolointia kutsutaan Casteljaun algoritmiksi. Yleistetään määritelmä: kontrollipiste merkitään p i (p 1, p 2, p 3,..). Lineaarinen interpolointi toistetaan k kertaa, jolloin saadaan "välipisteet p i k. Bezier käyrä n + 1 kontrollipisteelle esitetään: p k i t = 1 t p k 1 i t + tp k 1 i+1 t, missä k = 1.. n, i = 0.. n k http://www.rw-designer.com/nurbs http://geometrie.foretnik.net/files/nurbs-en.swf

13.1 Parametrisoidut käyrät Grafiikkaprosessorilla voidaan toteuttaa mm. "rajattuja" bezier käyriä (bounded Bezier curves), joissa alue kontrollipisteiden välillä olevan suoran ja käyrän piirretään. Tehtävä onnistuu käyttämällä pikselivarjostinta kolmiorenderöinnissä. Käytetään neliöllistä Bezier-käyrää kolmella kontrollipisteellä. Asetetaan verteksien kolme tekstuurikoordinaatia (t 0,t 1,t 2 ). Renderöitäessä tekstuurikoordinaatit interpoloidaan kolmion (p 0,p 1,p 2 ) yli. Samalla lasketaan skalaarifunktio kolmion sisällä jokaiselle pikselille, missä u ja v ovat interpoloidut tekstuurikoordinaatit: f u, v = u 2 v Pikselivarjostin tunnistaa onko pikseli alueen sisällä (f(u,v) < 0), muussa tapauksessa ollaan ulkona. Jos käytetään perspektiiviprojektiota saadaan projisoitu Bezier käyrä.

13.2 Parametrisoidut kaarevat pinnat Parametrisoituja pintoja voidaan käyttää mallintamaan kappaleiden kaarevia pintoja. Parametrisoitu pinta määritellään kontrollipisteiden joukolla. Parametrisoidun pinnan tesselaatiossa lasketaan pinnan esitys useassa pisteessä ja muodostetaan esityksestä kolmiot, jotka approksimoivat todellista pintaa. Tämä on mahdollista, koska grafiikkaprosessori renderöi tehokkaasti kolmioita. Pinta voidaan tesseloida ajonaikana halutuksi määräksi kolmioita. Kolmioiden määrä kasvattaa luonnollisesti laatua, mutta nopeus kärsii [DirectX esimerkki].

13.2.1 Bezier tilkut (bezier patches) Grafiikkaprosessorilla voidaan toteuttaa mm. "rajattuja" bezier käyriä (bounded Bezier curves), joissa alue kontrollipisteiden välillä olevan suoran ja käyrän piirretään. Tehtävä onnistuu käyttämällä pikselivarjostinta kolmiorenderöinnissä. Lineaarinen interpolointi laajennetaan bi-lineaariseksi interpoloinniksi; kahden pisteen sijasta käytetään neljää pistettä (a,b,c,d) ja yhden parametrin t sijasta käytetään kahta parametria (u,v). Käytettäessä u parametria lineaariseen interpolointii a:sta b:hen ja c:stä d:hen saadaan e ja f: e = 1 u a + ub f = 1 u c + ud Seuraavaksi pisteet e ja f lineaarisesti interpoloidaan toiseen suuntaan käyttämällä parametria v: p u, v = 1 v e + vf = 1 u 1 v a + u 1 v b + 1 u vc + uvd

13.2.1 Bezier tilkut (bezier patches) p u, v = 1 v e + vf = 1 u 1 v a + u 1 v b + 1 u vc + uvd Yhtälö kuvaa yksinkertaisimman ei-tasomaisen parametrisoidun pinnan, jossa pinnan pisteet generoidaan eri u:n ja v:n arvoilla. Mikäli u:n ja v:n raja-arvot rajaavat suorakulmaisen särmiön (esim. [0,1] x [0,1]) on kysymyksessä tilkku. Laajennettaessa bezier tilkun interpolointia, lisätään pisteitä kuten käyrän tapauksessa. Käytetään esimerkiksi 3 x 3 hilaa (9 pistettä) muodostamaan bineliöllinen bezier-tilkku. Ensin bi-lineaarisesti interpoloidaan neljä kertaa ja tuloksena saadaan välipisteet. Sitten bi-lineaarisesti interpoloidaan kyseiset pisteet.

13.2.1 Bezier tilkut (bezier patches) Toistettu bi-lineaarinen interpolointi on de Casteljau's algoritmin laajennus tilkuille. Pinnan aste on n. Kontrollipisteet määritellään p i,j, missä i ja j [0..n]. Yhtälöksi saadaan: p k i,j u, v = 1 u 1 v p k 1 i,j + u 1 v p k 1 i,j+1 + 1 u vp k 1 i+1,j k 1 + uvp i+1,j+1 Bernstein polynomien avulla: p u, v = B i m (u) = m n i=0 j=0 m i=0 m i n j missä k = 1.. n, i = 0.. n k, j = 0.. n k n j=0 B j n v p i,j = m n i=0 j=0 u i 1 u m i v j 1 u n j p i,j B i m u B j n v p i,j missä pinnan vapausasteelle on kaksi parametria m ja n; käytetään myös yhdistettä m x n.

13.X Kirjan topiikkeja Bezier kolmiot (bezier triangles) http://en.wikipedia.org/wiki/b%c3%a9zier_triangle N-tilkut (N-patches) http://www.gamasutra.com/view/feature/131389/b%c3%a9zier_triangles_and_npatches.php Jatkuvuus (continuity) Implisiittiset pinnat (implicit surfaces) Käyrien ositus (subdivision curves) Pintoja ositus (subdivision surfaces) Silmukoitu ositus (loop subdivision)

13.6 Tehokas tesselaatio Kaarevasta pinnasta luodaan (normaalisti) kolmioverkko reaaliaikaisessa renderöinnissä.prosessia kutsutaan tessalaatioksi. Yksinkertaisin tesselaatio on yhdenmukainen tesselaatio. Esimerkki: Bezier-tilkuista muodostettu pinta tesseloidaan: 11 pistettä per tilkun puoli tekee 10 x 10 x 2 = 200 kolmiota. Näytteistetään uv-avaruudesta yhdenmukaisesti. Lasketaan p(u,v) kaikille (u k,v l ) = (0.1k,0.1l). missä k ja l ovat kokonaislukuja [0..10]. Tämä voidaan suorittaa sisäkkäisillä for-silmukoilla. Kolmiot muodostetaan neljään pinnan pisteeseen p(u k,v l ),p(u k +1),p(u k +1,v l +1) ja p(u k,v l +1). Sen sijaan, että tesseloidut pinnat kolmioineen lähetetään grafiikkaprosessorin liukuhihnalle, on järkevämpää lähettää kaarevan pinnan esitys grafiikkaprosessorille ja hoitaa datan laajennus siellä.

13.6 Tehokas tesselaatio GPU:n tesselaattori käyttää murtotesselaatio tekniikkaa, joka hajottaa kolmion tai nelikulmion useaksi kolmioksi tai nelikulmioksi. Itsenäisiä murtotesselointi kertoimia voidaan käyttää parametrisoidun pinnan reunoilla mahdollistamaan jatkuvan tarkkuuden tason menetelmät ja näin pop-efektin välttäminen. Kun tesselaatio on suoritettu verteksit ohjataan verteksivarjostimelle. Verteksivarjostimella voidaan laskea Bezier-kolmiot, jotta saadaan sulava kaareva pinta.

13.6.1 Adaptiivinen tesselaatio Yhdenmukainen (tasainen) tesselaatio antaa hyvän tuloksen, jos näytteistystaajuus on riittävä. Tesselaation tarve on kuitenkin paikka riippuvainen. Kohdissa, joissa pinta taipuu tarvitaan korkeampaa tesselaatiota, kun vastaavasti tasaisilla pinnoilla ei ole tarvetta. Adaptiivisen tesselaation algoritmit adaptoivat tesselaation perustuen johonkin mittaan; esimerkiksi kaarevuuteen, kolmion sivun pituuteen tai johonkin näyttökehyksen mittaan. http://developer.amd.com/wordpress/media/2012/10/tatarchuk-tessellation%28eg2007%29.pdf

Vokseli (voxel) Vokseli on säännöllisen kolmiulotteisen hilan alkio. Wikipedia: Vokseli (engl. voxel, sanoista volumetric pixel) on pikselin kolmiulotteinen vastine, kolmiulotteisen kuvamatriisin kuva-alkio. 3D vokseli-grafiikan käsittely on raskasta, koska kuva-alueen vokselien lukumäärä on verrannollinen kuvaresoluution kuutioon. Vokseleita sovelletaan mm. tietokonetomografiassa ja magneettikuvauksessa. Vokseleina esitetty malli (kappale) voidaan "renderöidä" suoraan tilavuus renderöinnillä tai erottamalla vokselin monikulmiopinnat korkeuskäyrien perusteella. http://voxeljs.com/#gallery

This new GI technology uses a voxel grid to store scene and lighting information, and a novel voxel cone tracing process to gather indirect lighting from the voxel grid. http://on-demand.gputechconf.com/gtc/2012/presentations/s0610-octree-based-sparse-voxelization-for-rt-global-illumination.pdf