Esityksen sisältö 3D Grafiikka tietokonepeleissä Peruskäsitteitä Korkean tason rakenne Piirron alkeisobjektit Tekstuurit Valotus Laitteistopiirtoliukuhihna Yhteenveto Peruskäsitteitä Piirto- ja taustapuskuri Piirto- ja taustapuskuri Näkyvyys Syvyys- ja Stencil-puskuri Kolmiot Verteksit Koordinaattiavaruudet Tekstuurit Varjostimet Materiaalit Molempien tehtävä on taltioida pikselien väriarvoja Piirtopuskuri näkyy ruudulla Taustapuskuri on muistialue koneen muistista Kuva piirretään taustapuskuriin estää osittain piirretyn kuvan näkymisen käyttäjälle Taustapuskuri vaidetaan piirtopuskurin kanssa Voidaan vaihtaa tai voidaan kopioida Taustapuskuri on isompi, jos käytetään reunan pehmennystä (anti-aliasing) pienennetään ja suodatetaan piirtopuskuriin
Kappaleiden näkyvyys ja syvyyspuskuri Stencil-puskuri Syvyyspuskuri (depth buffer) on saman kokoinen kuin taustapuskuri Syvyyspuskuri tallentaa Z-arvon Kutsutaan usein Z-puskuriksi Pikselin syvyysarvoa verrataan puskurin arvoon Mikäli uuden pikselin syvyysarvo on suurempi kun puskurin arvo, niin tällöin arvo hylätään, sillä se on kauempana kamerasta Muutoin arvo on edempänä ja pikseli on näkyvillä ja tällöin ylikirjotetaan uusi arvo sekä syvyyspuskuriin että korvataan väri taustapuskurista Apupuskuri Yleensä 8-bitin syvyinen Yleensä yhdistetään 24-bittiseen syvyyspuskuriin Käytetään moninaisiin tehtäviin, kuten läpinäkyvyyteen ja muihin erikoistehosteisiin Käytetään paljon erilaisissa peitto- ja leikkausalgoritmeissa Kolmiot Verteksit Perusalkio (primitive) piirtoliukuhihnoissa Kaikki monimutkaisemmat kappaleet perustuvat kolmioihin ja niistä muodostuviin sarjoihin, pois lukien kuitenkin viivat ja pisteoliot (point sprites) Kolmio on alkeellisin perusalkio, joka määrittää tason Erilaisilla kolmiotasosarjoilla voidaan määrittää dataa, kuten tekstuureja, värejä jne... Avaruuden pisteitä, joissa on seuraavia lisämääreitä: Värit (usein RGBA) Tason normaali Tekstuurikoordinaatit Muuta dataa, jota varjostimet tarvitsevat Kolmiot muodostuvat kolmesta verteksistä Verteksit määrittävät miten kolmiot varjostetaan
Eri koordinaattiavaruudet Leikkausavaruus Maailma-avaruus (World space) Mielivaltainen yleinen peliavaruus Objektiavaruus (Object space) Maailma-avaruuden lapsi Origo sijaitsee objektin asemapisteessä ja on objektin asennon suuntainen Tallennetaan verteksien paikat ja normaalit -avaruus n versio objektiavaruudesta Leikkausavaruus (clipping space) on muunnettu versio kamera-avaruudesta Ruudun reunat muodostavat 4-leikkaustasoa Lähin ja kaukaisin taso Tarvitaan syvyyspuskurin tarkkuuden kontrollointiin Kokonaisuudessa tarvitaan siis 6 leikkaustasoa Tekee leikkauksen laitteistolle helpommaksi -avaruuden ja leikkausavaruuden yhteispeli Näyttö- ja tangenttiavaruus avaruuden näkyvyyskaavio kolmiot tulevat leikkaantumaan Leikkaus avaruuden näkyvyyskaavio Näyttöavaruus Leikkausavaruuden pikselit projisoituna näyttöavaruuteen Todellisia pikseleitä, valmiina renderöintiin Tangenttiavaruus Määritetty jokaisessa pisteessä verkko-objektin (mesh) pinnalla Yleensä liukuvasti interpoloitu koko pinnalle Pinnan normaali on yksi akseli Tangentti ja binormaali makaavat pitkin pintaa Tangenttien normaalit ovat mallintajan määräämiä Hyödyllinen valotuksen laskennassa
Tekstuurit Varjostimet Tekseli taulukko Kuten pikseli, mutta vain tekstuurissa Yleensä R,G,B,A mutta voi sisältää muitakin arvoja 1D, 2D, 3D taulukko 2D on kaikkein yleisin Yksinkertaisimmillaan 2D bittikarttakuva Yleensä neliö ja kahden potenssi Varjostinohjelma ajetaan jokaiselle verteksille ja pikselille Muodostaa pikselien värin ja verteksien paikat Suhteellisen pieniä ohjelmia Yleensä kymmenestä satoihin operaatioihin Ei suoraa yhteyttä eri varjostimien välillä Laitteistot kehittyvät nopeasti Materiaalit Piirron ajoitus pelissä Kokoelma määrityksiä, kuinka kolmiot piirretään Tarkka sisältö hyvin sovellusriippuvaista Suuri kokoelma tietoa ja erilaisia tiloja Verteksi ja pikseli varjostimet Tekstuurit Yleisiä muuttujia ja kuvaus verteksien datasta Ei sisällä todellista verteksien dataa Piirtonopeus vaihtelee voimakkaasti tilanteen mukaan Jotkut 3D maailmat monimutkaisempia kuin toiset Yleisesti 15-60 ruutua/sekunnissa Pelin päivitys vakionopeuksista n nopeuden ei pidä vaikuttaa peliin Moninpelissä jokaisella on oma näkymä, mutta vain yksi yhteinen peli Pelin päivitys pidettävä erillään piirrosta
Verkko-objektit Tilavuusjaottelu Kolmioita Verteksejä Yksi materiaali (yleensä) Atominen yksikkö piirrossa Ei täysin atominen, riippuu laitteistosta Yksi pelin ylemmän tason objekti voi sisältää useita verkko-objekteja Kaikkea ei voida piirtää aivan joka piirrolla Paljon objekteja hidastaa liikaa On määritettävä tarkasti mitä on näkyvillä Jaetaan pelimaailma alueisiin Määritetään mitkä alueet ovat näkyvillä Piirretään jokainen näkyvä alue On useita erilaisia tapoja jakaa maailma alueisiin Tilavuusjaottelu - porttitekniikka Tilavuusjaottelu porttitekniikka Porttitekniikassa solmut liittyvät toisiinsa porttien avulla Usein monikulmio, mutta voi olla mikä muoto tahansa Tarkistetaan onko solmun yksikään portti näkyvissä. Mikäli näin on, piirretään solmu Tarkistetaan onko portteja muihin solmuihin näkyvissä Toistetaan ylläkuvattu muille solmuille Näkökenttä Tutkitaan kaksi ensimmäistä porttia?? Solmu Portti Näkyvissä Ei näkyvissä Ei tutkittu
Tilavuusjaottelu porttitekniikka Tilavuusjaottelu porttitekniikka Solmu Portti Solmu Portti Molemmat näkyvissä Näkyvissä Ei näkyvissä Ei testattu Merkitään solmu näkyväksi, testataan kaikki portit jotka lähtevät solmusta?? Näkyvissä Ei näkyvissä Ei testattu Tilavuusjaottelu porttitekniikka Tilavuusjaottelu porttitekniikka Solmu Portti Solmu Portti Yksiportti näkyvissä, yksi ei näkyvissä Näkyvissä Ei näkyvissä Ei testattu Merkitään solmu näkyväksi, toista solmua ei tutkita pidemmälle (sillä portti on kiinni). Tutkitaan kaikki portit näkyvästä solmusta??? Näkyvissä Ei näkyvissä Ei testattu
Tilavuusjaottelu porttitekniikka Tilavuusjaottelu porttitekniikka Solmu Portti Solmu Portti Yksi näkyvä, kaksi ei näkyvää Näkyvissä Ei näkyvissä Ei testattu Merkitään solmu näkyväksi, tarkistetaan uuden solmun portit? Näkyvissä Ei näkyvissä Ei testattu Tilavuusjaottelu porttitekniikka Tilavuusjaottelu - porttitekniikka Yksi portti ei näkyvä Ei enempää näkyviä solmuja tai portteja tarkistettavaksi. Voidaan piirtää näkymä. Solmu Portti Näkyvissä Ei näkyvissä Ei testattu Porttitekniikka on yksinkertainen ja nopea Vähäinen muistin käyttö Automaattinen tuottaminen vaikeaa Vaikeaa saada selville, missä solmussa piste on Pitää jatkuvasti pitää kirjaa objektin liikkeistä porteissa Parhaimmillaan sisätiloissa Ulkotiloissa liian paljon portteja käsiteltäväksi
Tilavuusjaottelu - PVS Piirtoalkeisobjektit Mahdollinen näkyvyysjoukko (potentially visible set) Perustuu mihin tahansa olemassaolevaan solmujärjestelmään Jokaiseen solmuun tallennettu siitä näkyvät solmut Staattinen lista Etukäteislaskenta hidastaa kentän lataamista Ei huomioi kulloistakin näkymää Ei voida käyttää liikkuvien objektien kanssa Todella nopea (ei rekursiota, ei laskentaa) yhdistellään muihin Silti vaaditaan näkyvyys tarkastelu leikkaus Nauhat, listat ja viuhkat Indeksoidut alkeisobjektit Verteksivälimuisti Neliöt ja pisteoliot nauhat (strips), listat (lists), viuhkat (fans) Kolmiosarjojen rakennetta 1 Kolmio lista 8 2 3 7 4 6 9 Kolmionauha 2 4 5 1 3 5 3 2 4 5 1 6 Kolmioviuhka 6 7 8 2 1 4 5 6 Viivalista 3 1 2 3 4 5 6 Viivanauha Listat eivät jaa mitään verteksejä Verteksien määrä = kolmioiden määrä * 3 Nauhat ja viuhkat jakavat verteksejä Verteksi määrä = kolmiomäärä + 2 Vähentää muistin kulutusta Nopeuttaa toistuvia verteksien käsittelyrutiineja
Käytännössä hukkadataa syntyy... Indeksoidut alkeisobjektit 32 kolmiota, 25 verteksiä 4 nauhaa, 40 verteksiä 25 verteksistä syntyy 40 verteksiä, jolloin on 60% redundanssia! Verteksit tallennettuna erilliseen taulukkoon Ei redundanssia Kutsutaan verteksipuskuriksi tai verteksitaulukoksi Kolmiot viittaavat indekseihin eivät vertekseihin Indeksi on vain kokonaisluku (integer) Tyypillisesti 16 bittinen Indeksien monistaminen halpaa Verteksivälimuisti Nelikulmiot ja pisteoliot Verteksejä käsitellään verteksivarjostimilla Tuloksia käytetään usealle kolmiolle Vältetään uudelleenkäsittelyä jokaisen kolmion kohdalla Tallennus videomuistiin liian hidasta, joten tallennetaan tulokset pieneen välimuistiin Vaatii alkeisobjektien indeksointia Välimuisti tyypillisesti 16-32 verteksin kokoinen Tällä saavutetaan yleensä noin 95% kattavuus Nelikulmiot tuettuja joissain API toteutuksissa Piirretään kuten kaksi kolmiota Voimme ajatella nelikulmion olevan pieni kolmioviuhka Ei merkittävästi tehokkaampaa Pisteoliot ovat yksittäisiä verteksejä Ruudun suuntainen neliö, ei vain koostu kahdesta kolmiosta Harmittavia laitteistorajoitteita Harvoin vaivan arvoista
Tekstuurit Tekstuuri formaatit yleisesti Tekstuurit formaatit Tekstuurin kiinnitys (texture mapping) Tekstuuriin piirtäminen (texture rendering) Tekstuurit muodostuvat tekseleistä (texels) Tekselit koostuvat usein komponenteista R,G,B ja A Kaikki formaatit eivät sisällä kaikkia komponentteja Eri formaateilla on erilaisia bittisyvyyksiä eri komponenteille Yleisiä formaatteja: A8R8G8B8, R5G6B5, A32f ja A16R16G16B16f DXT1: pakattu 4x4 RGB lohko: 64 bits Tekstuuri formaattien ulottuvuudet Tektuurien kiinnitysavaruudet Tekselit on järjestetty monella eri tavalla Tekstuureilla on usein 'mipmap' ketjuja Mipmapin koko on puolet alkuperäisistä ulottuvuuksista Täydellinen mipmap-ketju sisältää kaikki eri kokoiset mipmapit aina kokoon 1 asti Tekstuurien kiinnitys (texture mapping) Tekstuuri koordinaatit U, V, W Vain U tarvitaan 1D kartassa ja U,V 2D avaruudessa U,V,W tyypillisesti tallennettu vertekseihin tai laskettu varjostimissa Arvot välillä [0,1]
Tekstuuriin piirtäminen Valotus Tekstuurit on yleensä tehty erilliseen pakettiin Ladataan levyltä Mutta mikä tahansa 2D kuva voi olla tekstuuri Voidaan asettaa tekstuuri piirron kohteeksi ja näyttää sitten piirrettyä tekstuuria Komponentit Valotus ympäristö Useat valonlähteet Staattinen valotuskartta (lightmap) Leviävä materiaali valotus (diffuse material lighting) Normaali tekstuuri kiinnitys (normal mapping) Komponentit Valotusympäristö Valotuksessa on kolme tekijää: Mitkä valot paistaa pinnalle? Kuinka materiaali käyttäytyy valon kanssa? Mitkä osat lopulta näkyvät kameraan? Reaaliaikainen piirto yhdistää kaksi viimeistä Ilmenee verteksi- ja pikselivarjostuksessa Moni algoritmi toimii molemmissa Vastaa ensimmäiseen kysymykseen: Mikä valo paistaa pinnalle? Perusmalli on suuntaamaton kevyt valaistus Paikka Intensiteetti eli voimakkuus Väri Fysiikka mallit käyttävät käänteissääntöä Kirkkaus = valonvoimakkkuus / etäisyys 2
Valotusympäristö Useat valonlähteet Mutta tästä saadaan suuri kirkkausalue ja monitorien kirkkausalue on rajoittunut Käytännössä tämä näyttää pahalta Monet käyttävät käänteistä etäisyyttä Vaaleus = valon vaaleus / etäisyys Lisäämällä minimietäisyys estetään puhkipalaminen Maksimietäisyys lisätään tehokkuus syistä Järjestelmissä on kymmenistä tuhansiin valoja Mahdotonta laskea jokaisen vaikutusta joka piksellile arvioidaan eniten vaikuttuvat valot Ympäröivä valo (ambient light) Yksi väri lisätään jokaiseen valoon Vähentään kontrastia 3D maailmasta hyväksyttävissä päivänvalo tilanteissa Staattinen valotuskartta Hajoava materiaalivalo Yleensä varasto etukäteen lasketulle valotukselle Mahdollisia käyttökohteita: Mahdollistaa kevyen perusvalotuksen tekemisen Valo on imeytynyttä ja uudelleen säteilevää Uudelleen säteilee joka suuntaan joten ei väliä missä kamera on Sama valonvoimakkkuus osuu kameraan Staattinen normaalikarttojen (normal map) korostaminen Ei sovellu liikkuviin kohteisiin Valonvoimakkuus on pistetulo pinnan ja valovektorin välillä (Lamberin yleinen valo)
Normaalikartat Laitteistopiirtoliukuhihna Pinnan normaalivektorit tallennettu vertekseihin Muutokset pieniä vierekkäisten verteksien välillä Pinta näyttää tasaiselta Todelliset pinnat epätasaisia Suuret erot pintojen normaalien välillä Saattaa tarvita paljon lisää verteksejä Normaalikartat taltioivat pinnan normaaleja tekstuurissa Tarkistusnormaalit jokaiselle pikselille Suoritetaan valotuslaskuja pikselivarjostimessa Syötteiden kokoaminen Verteksivarjostaminen Alkeisobjektien kokoaminen, valinta ja leikkaus Projektio ja rasterointi Pikselivarjostus Z-, Stencil- ja piirtopuskurit Varjostinkielet Laitteistopiirtoliukuhihna Syötteiden kokoaminen Käsittelemme yleisen liukuhihnamallin On hyvin yleinen, mutta eri vaiheet vaihtelevat suuresti eri toteutuksissa Myöskin valitettavasti ei ole mitään 'ajatonta tietoa' Laitteistot muuttuvat erittäin nopeasti Tilojen vaihto Tekstuurit, varjostimet, sulautus tyypit (blend modes) Virrat syötedataan Verteksipuskurit Toiminnallinen malli ainoastaan Ei toteutettavissa sellaisenaan tehokkaasti Moni vaihe oikeasti siirretty laitteistolle Indeksipuskurit Vakiodata Yhdistetään alkeisobjekteihin
Verteksivarjostin Alkeisobjektien kokoaminen, valinta ja leikkaus Verteksidata ruokkii verteksivarjostajaa Ohjelmaa ajetaan keskeytyksettä kunnes se on valmis Yksi verteksi kerrallaan käsitellään Verteksivarjostin ei näe useita verteksejä eikä myöskään verteksirakenteita Tulokset tallennetaan verteksivälimuistiin vaste (output) sijainnin tulee olla näkyvyys alueella Verteksit luetaan välimuistista Kasataan kolmioiksi Valitaan verteksit Valinta-alue Taustapinta (verteksien järjestys myötäpäivään) Leikkaus suoritetaan ei valituille kolmioille Jatketaan niiden kolmioiden kanssa, jotka eivät leikkaannu pois ruudusta Projektio ja rasterointi Pikselivarjostus Verteksit projisoidaan ruutuavaruuteen Todelliseen pikselikoordinaatistoon Kolmiot on rasteroitu Etsitään pikselit, jotka todella vaikuttavat Etsitään syvyysarvot näille pikseleille Löydetään interpoloidut atribuuttitiedot Tekstuuri koordinaatit Kaikki muu pidetään vertekseissä Syöttää pikselit varjostimelle Ohjelma ajetaan kertaallaalleen joka pikselille annetulla interpoloidulla verteksidatalla Voi lukea tekstuureja Paluuarvona palauttaa pikselin värin Voi myös mahdollisesti palauttaa uuden syvyysarvon Voi myös tuhota pikseleitä (estää piirron)
Z-, Stencil, piirtopuskuri sekoitus Varjostusohjelmat Z- ja stencil-testit suoritetaan Pikselejä saatetaan tuhota testeissä Jos ei, niin uudet Z- ja stencil-arvot kirjoitetaan Jos taustapuskuri käytössä Kirjoitetaan uusi väri taustapuskuriin Mikäli sekoitus käytössä, uusi arvo sekoitetaan Monia erilaisia varjostusmahdollisuuksia Aikaisemmin kielet lähellä assemblyä Erilainen assembly jokaiselle varjostin versiolle Nykyään käytetään c-kielen tyylisiä kieliä Piilottaa paljon toteutuksen yksityiskohtia Toimii suuren laitejoukon kanssa Vaatii todella tarkkaa kehityksen seurausta Yhteenvetoa liukuhihnasta Yhteenveto Kuljetaan läpi koko 3D maailman Ohitetaan ei näkyvät solmut Piirretään objektit, jotka näkyvät Verteksit muutetaan näyttöavaruuteen Käytetään verteksivarjostusohjelmia Tehdään kolmioita vertekseistä Rasteroidaan kolmiot pikseleiksi Valotus tehdään yhdistelemällä Osa tehdään verteksivarjostimessa Osa tehdään pikselivarjostimessa Lopputuloksena ovat uudet värit joka pikselille Poisluetaan pikselit, jotka eivät ole näkyvillä Kirjoitetaan tai sekoitetaan (blend) taustapuskuriin
Loppukevennys Credits Yhtään pikseliä ei ole vahingoitettu tämän esitelmän teossa Kiitos mielenkiinnosta ja anteeksi kärsimyksistä =) kirjoittanut Credits Credits kirjoittanut kirjoittanut
Credits Credits kirjoittanut kirjoittanut Credits Credits kirjoittanut kirjoittanut
Credits kirjoittanut Credits Credits