3D-Maailman tuottaminen

Samankaltaiset tiedostot
Luento 3: 3D katselu. Sisältö

Selainpelien pelimoottorit

arvostelija OSDA ja UDDI palveluhakemistoina.

Tilanhallintatekniikat

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

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

3D-renderöinti OpenGL-ohjelmointirajapinnalla

Luento 6: Piilopinnat ja Näkyvyys

5. Grafiikkaliukuhihna: (1) geometriset operaatiot

Sisällys. T Tietokonegrafiikan perusteet. OpenGL-ohjelmointi 11/2007. Mikä on OpenGL?

Pro gradu -tutkielma Meteorologia SUOMESSA ESIINTYVIEN LÄMPÖTILAN ÄÄRIARVOJEN MALLINTAMINEN YKSIDIMENSIOISILLA ILMAKEHÄMALLEILLA. Karoliina Ljungberg

T Johdatus tietoliikenteeseen ja multimediatekniikkaan Tietokonegrafiikka

TIES471 Reaaliaikainen renderöinti

Tampereen yliopisto Tietokonegrafiikka 2013 Tietojenkäsittelytiede Harjoitus

Työn laji Arbetets art Level Aika Datum Month and year Sivumäärä Sidoantal Number of pages

Tampereen yliopisto Tietokonegrafiikka 2013 Tietojenkäsittelytiede Harjoitus

Luento 7: 3D katselu. Sisältö

Peilaus pisteen ja suoran suhteen Pythonin Turtle moduulilla

Luonnontieteiden popularisointi ja sen ideologia

T Vuorovaikutteinen tietokonegrafiikka Tentti

Aika/Datum Month and year Kesäkuu 2012

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

! #! %! & #!!!!! ()) +

Maailman muutosta tallentamassa Marko Vuokolan The Seventh Wave -valokuvasarja avauksena taidevalokuvan aikaan

T Tietokonegrafiikan perusteet. OpenGL-ohjelmointi

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

MS-A0003/A0005 Matriisilaskenta Malliratkaisut 4 / vko 47

3.2 Matriisien laskutoimitukset. 3.2 Matriisien laskutoimitukset. 3.2 Matriisien laskutoimitukset. 3.2 Matriisien laskutoimitukset

Koht dialogia? Organisaation toimintaympäristön teemojen hallinta dynaamisessa julkisuudessa tarkastelussa toiminta sosiaalisessa mediassa

Katsaus korruption vaikutuksesta Venäjän alueelliseen talouskasvuun ja suoriin ulkomaisiin investointeihin

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

GeoGebran 3D paketti

Osoita, että kaikki paraabelit ovat yhdenmuotoisia etsimällä skaalauskuvaus, joka vie paraabelin y = ax 2 paraabelille y = bx 2. VASTAUS: , b = 2 2

Kartio ja pyramidi

Graikka yleisesti tietokonepeleissä

Matriisit, L20. Laskutoimitukset. Matriisikaavoja. Aiheet. Määritelmiä ja merkintöjä. Laskutoimitukset. Matriisikaavoja. Matriisin transpoosi

Matriisit, L20. Laskutoimitukset. Matriisikaavoja. Aiheet. Määritelmiä ja merkintöjä. Laskutoimitukset. Matriisikaavoja. Matriisin transpoosi

Tekijä Pitkä matematiikka On osoitettava, että jana DE sivun AB kanssa yhdensuuntainen ja sen pituus on 4 5

Konformigeometriaa. 5. maaliskuuta 2006

JOHDATUS TEKOÄLYYN TEEMU ROOS

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

Luento 6: Geometrinen mallinnus

Seguinin lauta A: 11-19

Visualisoinnin perusteet

0, niin vektorit eivät ole kohtisuorassa toisiaan vastaan.

MS-A0003/A0005 Matriisilaskenta Laskuharjoitus 2 / vko 45

Algoritmit 2. Luento 6 To Timo Männikkö

Algebran perusteet. 44 ϕ(105) = (105). Näin ollen

Arkkitehtuurinen reflektio

Controlling the Camera of 3D World by Using Real Time Face Tracking

6.5. Renderöintijärjestys

Luento 10: Näkyvyystarkastelut ja varjot. Sisältö

JOHDATUS TEKOÄLYYN TEEMU ROOS

Reaaliaikainen karvapeitteen piirtäminen näytönohjaimella

Asuntojen neliöhinnan vaihtelu Helsingissä ( )

TIES471 Reaaliaikainen renderöinti

3.2 Matriisien laskutoimitukset. 3.2 Matriisien laskutoimitukset. 3.2 Matriisien laskutoimitukset. 3.2 Matriisien laskutoimitukset. Olkoot A 2 := AA =

Lineaarikuvausten. Lineaarikuvaus. Lineaarikuvauksia. Ydin. Matriisin ydin. aiheita. Aiheet. Lineaarikuvaus. Lineaarikuvauksen matriisi

Esityksen sisältö. Peruskäsitteitä. 3D Grafiikka tietokonepeleissä. Piirto- ja taustapuskuri

Malliperustainen ohjelmistokehitys (Model-Driven Engineering, MDE)

KJR-C1001 Statiikka ja dynamiikka. Luento Susanna Hurme

KJR-C1001 Statiikka ja dynamiikka. Luento Susanna Hurme

Reaaliaikaiset varjoalgoritmit. Atso Kauppinen

Geogebra -koulutus. Ohjelmistojen pedagoginen hyödyntäminen

Matriisit, kertausta. Laskutoimitukset. Matriisikaavoja. Aiheet. Määritelmiä ja merkintöjä. Laskutoimitukset. Matriisikaavoja. Matriisin transpoosi

Avaruuslävistäjää etsimässä

Grafiikkasuorittimen käyttö keskusmuistitietokannoissa

2020 Fusion. What s New in Version 6? What s New in Version 6? 1 of Fusion

Luento 5 Mittakuva. fotogrammetriaan ja kaukokartoitukseen

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

Peruskoulun matematiikkakilpailu Loppukilpailu 2010 Ratkaisuja OSA 1

Oppimateriaalin kokoaminen ja paketointi

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

PERUSLASKUJA. Kirjoita muuten sama, mutta ota KAKSI välilyöntiä (SEURAA ALUEMERKINTÄÄ) 4:n jälkeen 3/4 +5^2

Videon tallentaminen Virtual Mapista

Matematiikan ilmiöiden tutkiminen GeoGebran avulla

10.2. Säteenjäljitys ja radiositeettialgoritmi. Säteenjäljitys

Luento 2: 2D Katselu. Sisältö

Sisältö. Luento 1: Transformaatiot (2D) 1. Koordinaattimuunnokset. Muunnokset (jatkuu) 2. Perustransformaatiot. Perustransformaatiot (jatkuu)

Pistepilvestä virtuaalimalliksi työpolku

Yleistä vektoreista GeoGebralla

x = y x i = y i i = 1, 2; x + y = (x 1 + y 1, x 2 + y 2 ); x y = (x 1 y 1, x 2 + y 2 );

2.2. Kohteiden konstruktiivinen avaruusgeometrinen esitys

MS-A0003/A0005 Matriisilaskenta Laskuharjoitus 1 / vko 44

3D-grafiikkamoottorin toteutus

MATEMATIIKKA JA TAIDE II

Koordinaatistot 1/6 Sisältö ESITIEDOT: reaaliluvut

Helsingin seitsemäsluokkalaisten matematiikkakilpailu Ratkaisuita

Algoritmit 2. Luento 6 Ke Timo Männikkö

Hannu Mäkiö. kertolasku * jakolasku / potenssiin korotus ^ Syöte Geogebran vastaus

Kertausosa. 5. Merkitään sädettä kirjaimella r. Kaaren pituus on tällöin r a) sin = 0, , c) tan = 0,

Luento 5 Mittakuva. fotogrammetriaan ja kaukokartoitukseen

Luento 6 Mittakuva. fotogrammetriaan ja kaukokartoitukseen

Tiedekunta/Osasto Fakultet/Sektion Faculty Valtiotieteellinen tiedekunta

BM20A5800 Funktiot, lineaarialgebra ja vektorit Harjoitus 4, Syksy 2016

Dominointianalyysi. Teppo Niinimäki. Helsinki Approksimointialgoritmit HELSINGIN YLIOPISTO Tietojenkäsittelytieteen laitos

Matematiikka ja teknologia, kevät 2011

3.1 Lineaarikuvaukset. MS-A0004/A0006 Matriisilaskenta. 3.1 Lineaarikuvaukset. 3.1 Lineaarikuvaukset

KUVANKÄSITTELY THE GIMP FOR WINDOWS OHJELMASSA

Transkriptio:

hyväksymispäivä arvosana arvostelija 3D-Maailman tuottaminen Eero Sääksvuori Helsinki 11.12.2017 Seminaari HELSINGIN YLIOPISTO Tietojenkäsittelytieteen laitos

HELSINGIN YLIOPISTO HELSINGFORS UNIVERSITET UNIVERSITY OF HELSINKI Tiedekunta Fakultet Faculty Laitos Institution Department Matemaattis-luonnontieteellinen tiedekunta Tekijä Författare Author Eero Sääksvuori Työn nimi Arbetets titel Title Tietojenkäsittelytieteen laitos 3D-Maailman tuottaminen Oppiaine Läroämne Subject Tietojenkäsittelytiede Työn laji Arbetets art Level Aika Datum Month and year Sivumäärä Sidoantal Number of pages Seminaari 11.12.2017 8 sivua + 4 sivua Tiivistelmä Referat Abstract Tässä kirjoituksessa tutustutaan siihen, miten 3D-grafiikka muodostetaan näytönohjaimessa, mikä on grafiikkaliukuhihna, sekä mitä vaiheita siinä on. Kirjotuksessa ei johdeta matriiseja, vaikka 3D-grafiikan muodostamisen pääpainona ovatkin matriisit ja niiden transformaatiot. Tekstissä keskitytään enemmän siihen, mitä matriisit saavat aikaan ja mitä peliohjelmoijan on hyvä ymmärtää kustakin vaiheesta käyttäessään valmiita ohjelmointirajapintafunktioita. ACM Computing Classification System CCS: Computing methodologies Computer graphics Computing methodologies Graphics processors Computing methodologies Rasterization Avainsanat Nyckelord Keywords 3D, Näytönohjain, Grafiikkaliukuhihna Säilytyspaikka Förvaringsställe Where deposited Muita tietoja övriga uppgifter Additional information

Sisältö ii 1 Johdanto 1 2 Kärkien prosessointi 2 3 Rasterointi 3 4 Fragmenttien prosessointi 4 5 Ulostulon lomitus 5 6 Geometriavarjostin ja Tesselaatio 6 7 Yhteenveto 7 Lähteet 8 Liitteet A Liite: Matriisilaskentaa 1 A.1 Matriisien laskutoimitukset....................... 1 A.2 Kärkien translaatio............................ 1 A.3 Kärkien skaalaus............................. 2 A.4 Kärkien rotaatio............................. 2 A.5 Yhdistetyt muunnosmatriisit....................... 2 A.6 Kamera-avaruuden muunnosmatriisi................... 3 A.7 Projektiomatriisi............................. 3 A.8 Perspektiivijako.............................. 4 A.9 Ikkunanäkymämuunnos......................... 4

1 Johdanto 1 Pelatessaan harvoin miettii, että kuvan muodostaa vain eriväriset pisteet eli pikselit, jotka ovat levitetty kaksiulotteiselle alustalle. Näitä pikseleitä on reilu kaksi miljoonaa tavallisessa 1920x1080 resoluution näytössä. Jokainen kuva on renderöitävä näytölle 16 millisekunnissa, jotta pelistä saa sulavan tuntuisen simulaation. Renderöinnin ohella on tehtävä myös muita laskennallisia tehtäviä, kuten pelifysiikoiden laskentaa. Kuinka näytönohjain pystyy tähän kaikkeen? Pelit ovat simulaatioita, joissa pelimaailma on pyritty mallintamaan tavalla, jolla tietokoneen on helppo manipuloida sitä [Gre09]. Tämä tarkoittaa, että pelimaailman 3D-komponentit, kuten sotilaat, puut, talot, ovat kaikki muodostettu monikulmioverkosta. Kolmio on yksinkertaisin monikulmio, jolla saadaan luotua pinta. Tämän vuoksi niitä käytetään lähes yksinomaan pelin verkkojen muodostamisessa [Han11]. Kun verkkojen pintaan lisätään tekstuurit, saadaan komponentit näyttämään realistiselta. Prosessorien ja näytönohjainten suurin ero on niiden ytimien määrässä [FH08]. Kuva 1: Monikulmioverkko kaivosta Moderni näytönohjain sisältää huomattavasti enemmän ytimiä, jotka ovat suunniteltu toimimaan samanaikaisesti graafisen liukuhihnan eli grafiikkaliukuhihnan avulla. Tämän lisäksi näytönohjaimessa on oma keskusmuisti, josta se voi hakea kullekin pelimaailman komponentille tekstuurit. Näytönohjain siis toimii itsenäisesti kuvien renderöinnissä. Prosessori voi hoitaa muita asioita, kuten vihollisten tekoälyn. Kärkivarjostin Rasterointi Fragmenttivarjostin Ulostulolomittaja Kuva 2: Yksinkertaistettu grafiikkaliukuhihna Grafiikkaliukuhihna hajauttaa työn osiin, jolloin näytönohjaimen jokainen ydin voi prosessoida dataa itsenäisesti. Liukuhihnan ensimmäisessä vaiheessa prosessorilta

2 syötteenä saadut monikulmioverkkolistat yhdistetään yhteiseen avaruuteen. Tämän jälkeen kohtaukseen scene jääneistä monikulmioista muodostetaan fragmentteja, jotka ovat tyypillisesti yhden pikselin kokoisia. Nämä fragmentit värjätään ja lisätään puskuriin, josta kuva piirretään näytölle. Grafiikkaliukuhihna on kehittynyt vuosien varrella ja siihen on tullut uusia vaiheita, kuten geometriavarjostin sekä tesselaatio. 2 Kärkien prosessointi Kärki vertex on kolmiulotteinen sijainti, johon on usein säilötty myös muuta dataa, kuten kärjen normaalit, tekstuurien koordinaatit sekä väri. Kärjet ovat nimensä mukaisesti monikulmioissa olevia kohtia, joissa on kulma. Peleissä monikulmion kulmat ovat yleensä koveria, koska niitä on helpompi prosessoida [Han11]. Näytönohjaimessa kuvan piirtäminen alkaa kärkien prosessoinnista. Siinä 3Dnäkymän jokainen kärki muunnetaan leikeavaruuteen, mistä kärjet jatkavat rasterointi vaiheeseen. Vaikka näkymän komponentit ovat muodostettu monikulmioverkoista, on kärkien prosessointi vaihe, jossa kärjet käsitellään omana yksilönään. Kärkien prosessointiin voi vaikuttaa tekemällä varjostimen, joka ottaa syötteenä yhden kärjen ja palauttaa sen muutettuna leikeavaruuteen [Mic17a]. Varjostimessa kärjelle voi esimerkiksi vaihtaa värin, muuttaa tekstuurien koordinaatteja tai siirtää kärkeä. Kuva 3: Kaivon kärjet visualisoituna Komponentin verkkodata tuodaan yleensä 3D- mallinnusohjelmasta, minkä prosessori lähettää grafiikkarajapinnalle piirrettäväksi. Nämä mallit ovat yleensä omassa avaruudessa object space sekä ovat tavallisesti riippumattomia toisista malleista. Mallit siirretään ensiksi yhteiseen avaruuteen world space, jotta ne näkyvät samassa kuvassa. Tätä varten mallin kärjille tehdään yksinkertaisia muunnoksia, kuten translaatio siirto, skaalaus ja rotaatio.

3 Transformaatiot tehdään käyttämällä matriisien kertolaskua ja niistä muodostetaan yhtenäinen muunnosmatriisi world matrix, joka hoitaa kaikki operaatiot kerralla [Han11]. Yhteisessä avaruudessa mallit eivät välttämättä ole halutussa 3D-näkymässä, vaan ne siirretään ja mahdollisesti käännetään vastaamaan kameran näkymää eli muodostetaan kameran avaruus camera space. Tämä tapahtuu muodostamalla matriisi view matrix, joka transformoi kärjet niin että niiden suhde origoon pysyy samana, mutta avaruuden origo onkin nyt kameran koordinaateissa. Jos esimerkiksi mallin kärki sijaitsee pisteessä 1,1,1 ja kamera -2,-2,-2, niin transformaation jälkeen kärki on pisteessä 3,3,3 ja kamera 0,0,0. Kamera muodostaa tyypillisesti näkökentän view frustum, joka muistuttaa katkaistua pyramidia [Han11]. Tästä pyramidista muodostetaan suorakulmainen särmiö eli leikeavaruus clip space projektiotransformaation avulla. Projektiotransformaatio saa aikaa näkymän perspektiivin eli ilmiön, jossa kauempana olevat mallit ovat pienempiä kuin lähellä olevat. Tätä varten rasteroinnissa on kuitenkin vielä suoritettava perspektiivijako. 3 Rasterointi Rasterointi on näytönohjaimeen valmiiksi määritelty vaihe [Han11], jota on mahdollista virittää erilaisilla asetuksilla. Rasteroinnissa leikeavaruuden sisällä olevista kärjistä muodostetaan primitiivejä, jotka lopuksi pilkotaan fragmenteiksi. Nämä fragmentit jatkavat liukuhihnassa fragmenttivarjostimeen. OpenGL:ssä rasterointi on pilkottu kahteen eri vaiheeseen, joita ovat primitiivien kokoaminen primitive assembly sekä rasterointi. Primitiivit ovat yksinkertaisia kolmiulotteisen avaruuden olioita, joita voivat esimerkiksi olla pisteet, viivat, kolmiot, kolmioviuhkat, tai kolmioverkot. Jokainen primitiivi prosessoidaan grafiikkaliukuhihnassa itsenäisenä kokonaisuutena, vaikka monikulmioverkot muodostuvatkin useista primitiiveistä. Kun primitiivit saadaan muodostettua, niistä poistetaan culling täysin näkökentän eli leikeavaruuden ulkopuolelle jääneet yksilöt. Prosessori yleensä tarkistaa karkeasti monikulmioverkkojen näkyvyyden jo ennen grafiikkaliukuhihnaan lisäämistä, jotta säästytään turhalta laskennalta. Osittain näkökentän sisällä olevien primitiivien näkökentän ulkopuoliset alueet leikataan clipping pois. Näkymästä poistetaan

4 myös pinnat, jotka osoittavat kamerasta poispäin. Tämän on huomattavissa silloin, kun kamera menee virheellisesti seinän tai hahmon sisään, jolloin näyttää siltä ettei näkymässä tai hahmossa ole pintoja. Projektiotransformaation jäljiltä kärkien w-komponentti on kärjen positiivinen z- etäisyys kameraan [Han11]. Kärjet eivät ole samassa projektioavaruudessa, eli kaikkien kärkien w-komponentti ei ole 1. Näytönohjain muuntaa leikeavaruuden koordinaatit normalisoiduiksi laitekoordinaateiksi NDC, normalized device coordinates jakamalla kärjen komponentit sen w-komponentilla. Tämä saa aikaan perspektiivinäkymän. Samalla w-komponentti palautuu arvoksi 1. Rasterointi muuttaa näkymän ikkunaan sopivaksi. Tätä varten leikeavaruus on muunnettava näyttöavaruudeksi screen space. Näyttöavaruus vaatii yleensä kärkien peilauksen y-akselin suhteen, jotta koordinaatistosta saadaan oikeakätinen. Sitten näkymä skaalataan haluttuun kokoon kuten koko näytölle. Lopuksi koko leikeavaruus siirretään positiivisiin koordinaatteihin. Rasteroinnin viimeinen tehtävä on pilkkoa nykyinen näkymä fragmentteihin. Tätä varten kärkien sisältämä data on interpoloitava fragmentteihin. Laitteistovalmistajat käyttävät tähän erilaisia optimoituja algoritmeja [Han11]. 4 Fragmenttien prosessointi Fragmenttien prosessointi on vaihe, jossa rasteroinnista tulleet fragmentit värjätään ja lähetetään grafiikkaliukuhihnan viimeiselle vaiheelle eli ulostulolomittajalle output merger. Fragmentti on liukuhihnan entiteetti, joka sisältää sijainnin ikkunassa, syvyyden sekä muut rasteroinnin interpoloimat tiedot, kuten värin. Direct3D:ssä fragmentteja kutsutaan pikseleiksi, mutta koska fragmentit ei välttämättä vaikuta lopulliseen kuvaan, tekstissä niitä kutsutaan yksinkertaisuuden vuoksi fragmenteiksi kuten OpenGL:ssä. Kuvan lopulliseen väriin vaikuttaa mm. tekstuurit, valaistus sekä muu jälkikäsittely, mitkä hoidetaan fragmenttivarjostimella. Fragmenttivarjostin on siis kärkivarjostimen tapaan ohjelmoitava vaihe, mikä ottaa syötteenä fragmentin ja palauttaa väriarvoja, alpha-arvon läpinäkyvyys sekä syvyysarvon. Kukin fragmentti prosessoidaan omana yksilönään, eikä se pääse käsiksi muihin fragmentteihin tai ruutupuskuriin. Fragmenttivarjostin hakee fragmenteille tekstuurin näytönohjaimen välimuistista VRAM. Tekstuurit ovat yleensä kaksiulotteisia kuvia, jotka liimataan mallin

5 päälle. Niillä mallille saadaan luotua pinta. Tyypillisiä tekstuuripintoja voivat olla kivi, maa tai talojen seinät. Joskus tekstuureja käytetään kaukaisten mallien renderöintiin, jotta säästytään laskennalta. Tekstuurien käyttö voi kuitenkin aiheuttaa vääristymiä, jos malli on monimutkainen [Han11]. Esimerkiksi kasvot sisältävät paljon yksityiskohtia, mitkä on monimutkaista levittää kaksiulotteiselle pinnalle. Tätä varten on kehitelty erilaisia algoritmeja, jotka vähentävät tekstuurien vääristymistä. Valaistus tehdään yleensä fragmenttivarjostimessa, sillä se antaa malleille sulavan pinnan [Han11]. Grafiikkaliukuhihnassa tehty varjostus on yleensä paikallista. Paikallisessa valaistuksessa on tyypillisesti jokin valonlähde, kuten katulamppu tai aurinko, joka valaisee kohtauksen pinnat. Valaistus voidaan tehdä esimerkiksi käyttämällä Phongin valaistusmallia. Siinä valaistus on jaettu osiin: diffuusi, spekulaari sekä ambientti [Kur97]. Oikeassa maailmassa valaistus on kuitenkin monimutkaisempaa. Siinä pinnat saattavat heijastaa valoa epäsuorasti toisiin pintoihin. Tällaista mallia kutsutaan globaaliksi valaisuksi. Yleensä peleissä globaali valaistus on etukäteen laskettu tai valaistusta on approksimoitu. 5 Ulostulon lomitus Ulostulolomittaja output merger on liukuhihnan viimeinen vaihe. Se prosessoi varjostimesta tulleet fragmentit, jotka sisältävät värin sekä mahdolliset syvyys- ja alphaarvot. Näiden avulla ulostulolomittaja päättää lopullisen värin väripuskuriin. Jos käytössä on kaksoispuskurointi, niin näytönohjain saattaa täyttää toista puskuria jo ennen kun edellinen puskuri on renderöity näytölle. Fragmentit saapuvat ulostulolomittajalle satunnaisessa järjestyksessä. Väripuskuriin halutaan vain fragmenttien värit, mitkä ovat lähimpänä kameraa eli joiden syvyys on pienin. Tätä varten ulostulolomittaja pitää Z-puskuria, johon se säilöö syvyysarvon samalla kun se päivittää väripuskurin. Jos ulostulolomittajalle saapuu fragmentti, jonka syvyys on suurempi kuin Z-puskurissa, se hylätään. Asia on kuitenkin monimutkaisempi, jos kyseessä on läpinäkyvä fragmentti. Läpinäkyvyys toteutetaan yhdistämällä fragmentin väri, sen takana olevan väriin. Jotta läpinäkyvyys voidaan prosessoida oikein, läpinäkyvät fragmentit on siis käytävä järjestyksessä läpi. Koska järjestys riippuu katselukulmasta, on järjestäminen tehtävä reaaliajassa. Näytönohjaimiin ollaan kehittelemässä algoritmia tätä varten,

6 mutta tällä hetkellä sen hoitaa fragmenttivarjostin. Näytönohjain saattaa poistaa rasterointi vaiheessa malleja, jotka ovat toisten mallien takana. Fragmenttien syvyyksiä on kuitenkin mahdollista muuttaa vielä rasterointi vaiheen jälkeen varjostimessa, tällöin näytönohjain ei voi ennustaa syvyyksiä. Kohtaus voidaan joskus renderöidä kahdesti. Ensimmäiseksi näkymä renderöidään ilman tekstuureja ja valaistusta, ja säilötään z-puskurin arvot. Tämän jälkeen poistetaan kaikki ylimääräinen eli fragmentit, joiden syvyys on suurempi kuin z-puskurissa ja renderöidään kohtaus tekstuureilla ja valaistuksilla. 6 Geometriavarjostin ja Tesselaatio Tähän mennessä tekstissä on kerrottu vain kärki- ja fragmenttivarjostimesta, mutta varjostimia on tullut vuosien varrella muitakin. Direct3D 10 lisäsi geometriavarjostimen ja Direct3D 11 laitteistopohjaisen tesselaation, jota varten varjostinmalliin shader model lisättiin 2 uutta varjostinta: runkovarjostin hull shader ja aluevarjostin domain shader. Nämä varjostimet on lisätty myös muihin grafiikkarajapintoihin. Runkovarjostin Tesselaattori Aluevarjostin Geometriavarjostin Kuva 4: Direct3D 11, Varjostinmalli 5 Tesselaatio on vaihe, joka suoritetaan kärkien prosessoinnin jälkeen. Sen tehtävänä on generoida malliin monikulmioita dynaamisesti. Tällöin kärkien prosessoinnin voi hoitaa korkeasti approksimoidulle mallille ja saada yksityiskohtaisen mallin renderöinnissä. Tesselaation käyttö vähentää tarvittavaa muistia sekä prosessointi aikaa. Tesselaatio käyttää tilkkuja patch, joista on määritelty kontrollipisteet [Mic17b]. Runkovarjostimessa prosessoidaan tilkut ja määritetään tarvittavat datat tesselaattorille sekä aluevarjostimelle [Mic17b]. Tesselaattori pilkkoo alueen neliö, kolmio, viiva pienemmiksi objekteiksi [Mic17b]. Aluevarjostin asettaa tesselaattorin pilkkomille objekteille kärkien tiedot runkovarjostimesta tulleen datan avulla. Geometriavarjostin on vaihtoehtoinen vaihe, mikä sijaitsee grafiikkaliukuhihnassa ennen rasterointia. Se prosessoi yhden primitiivin kärjet kerrallaan. Geometriavarjostimen avulla on mahdollista muuttaa primitiivin geometriaa liukuhihnassa, eli

7 a Ruori ilman tesselaatiota b Ruori tesselaatiolla Kuva 5: Tesselaatio lisää monikulmioiden määrää grafiikkaliukuhihnassa esimerkiksi kärkivarjostimesta tulleesta yksittäisestä pisteestä voisi tehdä kolmion tai poistaa koko primitiivin. Geometriavarjostin voi myös tallettaa ulostulon suoraan näytönohjaimen muistiin, tällöin se prosessoidaan kärkivarjostimessa seuraavaan ruutua piirrettäessä. Näytönohjain saa siis luotua uutta grafiikkaa ilman prosessoria. 7 Yhteenveto 3D-grafiikan piirtäminen näytölle on monivaiheinen prosessi, jota pystytään kontrolloimaan varjostimilla. Varjostimet ovat vuosien varrella kehittyneet entistä vapaammiksi, tarjoten enemmän mahdollisuuksia. Ennen varjostimet olivat hankalasti koodattavia ja varjostinfunktiot toimivat vain tietyssä vaiheessa. Tämä johti helposti pullonkaulaan liukuhihnassa, esimerkiksi kärkivarjostimessa. Nykyisin varjostimien syntaksi on hyvin määriteltyä ja universaalia. Liukuhihnaan on myös lisätty uusia vaiheita, joilla näytönohjaimesta on saatu entistä itsenäisempi. Geometriavarjostin voi muuttaa reaaliajassa mallien geometriaa, ja sillä voi luoda helposti esimerkiksi pilviä tai savutehosteita. Tesselaatio sen sijaan mahdollistaa korkealaatuisten mallien käytön liukuhihnassa tehokkuutta menettämättä. Tällä hetkellä suuret pelit ovat useimmiten tehty Direct3D:llä ja toimivat vain PCtietokoneilla, mutta uusi laitteistoriippumaton grafiikkarajapinta, Vulkan, saattaa tarjota mahdollisuuden pelata Direct3D-tasoisia pelejä myös puhelimella.

Lähteet 8 FH08 Fatahalian, K. ja Houston, M., GPUs: A Closer Look. Queue, 6,22008, sivut 18 28. URL http://doi.acm.org/10.1145/1365490.1365498. Gre09 Gregory, J., Game Engine Architecture. A K Peters, Wellesley, Mass, 2009. Han11 Han, J., 3D Graphics For Game Programming. Chapman and Hall/CRC, Boca Raton, 2011. Khr17a Khronos Group, Rendering Pipeline Overview - OpenGL Wiki, 2017. URL https://www.khronos.org/opengl/wiki/rendering_ Pipeline_Overview. Khr17b Kur97 Mic17a Mic17b Khronos Vulkan Working Group, T., Vulkan R 1.0.66 - A Specification, 2017. URL https://www.khronos.org/registry/vulkan/specs/1. 0/html/vkspec.html. Kurhila, J., Paikalliset valaistusmallit, 1997. URL https://www.cs. helsinki.fi/group/goa/render/valaistus.html. Microsoft, Programming Guide for Direct3D 11, Graphics Pipeline, 2017. URL https://msdn.microsoft.com/en-us/library/windows/ desktop/ff476882. Microsoft, Programming Guide for Direct3D 11, Tessellation Stages, 2017. URL https://msdn.microsoft.com/en-us/library/windows/ desktop/ff476340. Mö08 Möller, T., Real-time Rendering. A.K. Peters, Wellesley, Mass, 2008. SSKLK13 Shreiner, D., Sellers, G., Kessenich, J. M. ja Licea-Kane, B. M., OpenGL Programming Guide: The Official Guide to Learning OpenGL, Version 4.3. Addison-Wesley Professional, 8. painos, 2013.

A Liite: Matriisilaskentaa 1 A.1 Matriisien laskutoimitukset - Yhteen- ja vähennyslasku: a A + B = c a A B = c b + d b d e g e g f = h f = h a + e c + g a e c g b + f d + f b f d f - Kertolasku: a b αa αb αa = α = c d αc αd a b e f ae + bg af + bh AB = = c d g h ce + dg cf + dh Matriisien kertolasku ei ole vaihdannainen, tosin sanoen AB BA. Tämä on syytä huomioida tehtäessä yhdistettyjä muunnosmatriiseja. - Jakolasku: A/B = AB 1 = a c b d e g f h 1 = a c b d h f g = e ah + bf ch + df ag + be bg + de Jakolasku suoritetaan ottamalla jakajasta käänteismatriisi. A.2 Kärkien translaatio Translaation tekemiseksi matriisien kertolaskulla, on koordinaatit muunnettava homogeenisiksi. Tämä tapahtuu lisäämällä koordinaatteihin uusi komponentti w. x, y, z x, y, z, 1 1 0 0 t x x x + t x T t x, t y, t z = 0 1 0 t y y 0 0 1 t z z = y + t y z + t z 0 0 0 1 1 1 missä t x, t y, t z ovat etäisyyksiä kullakin akselilla.

2 A.3 Kärkien skaalaus s x 0 0 0 x s x x Ss x, s y, s z = 0 s y 0 0 y 0 0 s z 0 z = d y y d z z 0 0 0 1 1 1 missä s x, s y ja s z ovat skaalauksia akselin mukaan. A.4 Kärkien rotaatio missä θ on rotaation määrä asteina. 1 0 0 0 x x R x θ = 0 cosθ sinθ 0 y 0 sinθ cosθ 0 z = y z 0 0 0 1 1 1 cosθ 0 sinθ 0 x x R y θ = 0 1 0 0 y sinθ 0 cosθ 0 z = y z 0 0 0 1 1 1 cosθ sinθ 0 0 x x R z θ = sinθ cosθ 0 0 y 0 0 1 0 z = y z 0 0 0 1 1 1 A.5 Yhdistetyt muunnosmatriisit Muunnosmatriisit yhdistetään yhdeksi matriisiksi, jolla kaikki kärjet muunnetaan avaruuteen. M world = T t x, t y, t z R z α R y β R x θ Ss x, s y, s z 1 Matriisien suoritus tapahtuu käänteisesti, eikä tulos ole sama jos järjestystä vaihtaa. Tässä muodostettiin muunnosmatriisi, joka ensimmäiseksi skaalaa, sitten kääntää kärjet ja lopuksi siirtää ne. Kun matriisi on laskettu, voidaan sitä käyttää:

3 M world V = V 2 missä M on muunnosmatriisi, V on kärki ja V saatu kärki. A.6 Kamera-avaruuden muunnosmatriisi Kamera-avaruuden muunnosmatriisi muodostetaan tekemällä translaatio jossa kameran sijainti C siirretään origoon O. Tästä saadaan muodostettua matriisi: Merkitään: C = C x, C y, C z, nyt translaatiomatriisi on 1 0 0 C x T camera = 0 1 0 C y 0 0 1 C z 0 0 0 1 Jos akselit eivät ole samansuuntaiset, voidaan translaatiomatriisi yhdistää rotaatiomatriisin. missä α, β, θ ovat kulmia. M camera = T camera R z α R y β R x θ 3 A.7 Projektiomatriisi Projektiomatriisi muodostaa leikeavaruuden kameran näköalueesta, joka tyypillisesti on pyramidin mallinen. Projektiomatriisin muodostamiseen vaikuttaa näköalue field of view, kameran maksimietäisyys sekä etäisyys kameran ja projektioseinän välillä. M proj = jossa f ovy on vertikaalinen näköalue. cot fovy 2 aspect 0 0 0 0 cot fovy 2 0 0 0 0 f f n nf f n 0 0 1 0 aspect = w, jossa w = projektioseinän leveys ja h = projektioseinän korkeus. h

n on projektioseinän etäisyys kameraan ja f näköalueen pisin etäisyys kameraan [Han11]. 4 A.8 Perspektiivijako Projektiomatriisi muuttaa kärkien w-komponentit, joka siirtää ne eri homogeenisiin avaruuksiin. Jotta kärjet saadaan yhteiseen avaruuteen näytönohjain suorittaa perspektiivijaon. Perspektiivijaossa kukin kärjen komponentti jaetaan sen w-komponentilla. Projektiomatriisin jäljiltä w-komponentti on z eli kärjen positiivinen etäisyys kameraan. Kun jako on suoritettu, tulee kauempana olevista kärjistä pienempiä kuin lähellä olevista. Tämän takia muunnosta kutsutaan perspektiivijaoksi. Merkitään kärkeä v = a, b, c, d, nyt αv = 1 d v = 1 d a A.9 Ikkunanäkymämuunnos 1 d b 1 c 1 d d d = a d b d c 1 d Ikkunanäkymuunnos muuntaa perspektiivijaosta tulleet koordinaatit ikkunaan sopiviksi. Ikkuna-avaruus on y-akselin suhteen käänteinen, joten kärjet on peilattava. Leikeavaruuden koordinaatisto on myös skaalattava, sillä koordinaatit ovat tällä hetkellä [-1,1] välillä. Lopuksi origo siirretään alkamaan näkymän vasemmasta yläkulmasta. Tämä johtuu vanhoista CRT-näytöistä, jotka aloittivat piirtämisen kyseisestä kohdasta. W 0 0 MinX + W 2 2 M win = 0 H 0 MinY + H 2 2 0 0 MaxZ MinZ MinZ 0 0 0 1 jossa W on ikkunan leveys, H on ikkunan korkeus, MinX, MinY on näkymän kulmapiste [Han11].