Graikka yleisesti tietokonepeleissä

Samankaltaiset tiedostot
Selainpelien pelimoottorit

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

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

arvostelija OSDA ja UDDI palveluhakemistoina.

Tilanhallintatekniikat

Luento 3: 3D katselu. Sisältö

Luento 6: Piilopinnat ja Näkyvyys

Aika/Datum Month and year Kesäkuu 2012

5. Grafiikkaliukuhihna: (1) geometriset operaatiot

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

T Vuorovaikutteinen tietokonegrafiikka Tentti

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

Tampereen yliopisto Tietokonegrafiikka 2013 Tietojenkäsittelytiede Harjoitus

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

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

Algoritmit 2. Luento 6 Ke Timo Männikkö

T Johdatus tietoliikenteeseen ja multimediatekniikkaan Tietokonegrafiikka

Visualisoinnin perusteet

TIES471 Reaaliaikainen renderöinti

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

Luonnontieteiden popularisointi ja sen ideologia

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

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

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

3D-Maailman tuottaminen

Luento 2: Tulostusprimitiivit

Tampereen yliopisto Tietokonegrafiikka 2013 Tietojenkäsittelytiede Harjoitus

Reaaliaikaiset varjoalgoritmit. Atso Kauppinen

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

Algoritmit 2. Luento 6 To Timo Männikkö

2.2. Kohteiden konstruktiivinen avaruusgeometrinen esitys

Luku 8. Aluekyselyt. 8.1 Summataulukko

Monikulmiot 1/5 Sisältö ESITIEDOT: kolmio

Möbiuksen nauha. Välineet: paperisuikaleita, paperiristejä (liitteenä) lyijykynä, teippiä, sakset, värikyniä, liimaa ja värillistä paperia

Scratch ohjeita. Perusteet

Videon tallentaminen Virtual Mapista

Peilaus pisteen ja suoran suhteen Pythonin Turtle moduulilla

Valokuvien matematiikkaa

Vektoreita GeoGebrassa.

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

Kaksirivisen matriisin determinantille käytämme myös merkintää. a 11 a 12 a 21 a 22. = a 11a 22 a 12 a 21. (5.1) kaksirivine

Luento 6: Tulostusprimitiivien toteutus

KOLMIULOTTEINEN TIETOKONEGRAFIIKKA PELEISSÄ

Digikuvan peruskäsittelyn. sittelyn työnkulku. Soukan Kamerat Soukan Kamerat/SV

Tasogeometriaa GeoGebran piirtoalue ja työvälineet

Luento 4: Näkyvyystarkastelut ja varjot

Algoritmit 2. Luento 3 Ti Timo Männikkö

Reaaliaikainen karvapeitteen piirtäminen näytönohjaimella

TYÖPAJA 1: Tasogeometriaa GeoGebran piirtoalue ja työvälineet

A = a b B = c d. d e f. g h i determinantti on det(c) = a(ei fh) b(di fg) + c(dh eg). Matriisin determinanttia voi merkitä myös pystyviivojen avulla:

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

Luku 6. Dynaaminen ohjelmointi. 6.1 Funktion muisti

, on säännöllinen 2-ulotteinen pinta. Määrää T x0 pisteessä x 0 = (0, 1, 1).

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

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

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

3D-renderöinti OpenGL-ohjelmointirajapinnalla

T Tietokonegrafiikan perusteet. OpenGL-ohjelmointi

Kanta ja Kannan-vaihto

1. STEREOKUVAPARIN OTTAMINEN ANAGLYFIKUVIA VARTEN. Hyvien stereokuvien ottaminen edellyttää kahden perusasian ymmärtämistä.

PN-puu. Helsinki Seminaari: Tietokannat nyt HELSINGIN YLIOPISTO Tietojenkäsittelytieteen laitos

Algoritmit 2. Luento 3 Ti Timo Männikkö

1 Kannat ja kannanvaihto

Matematiikan tukikurssi

Tietotekniikan valintakoe

Oppimateriaalin kokoaminen ja paketointi

MATEMATIIKKA JA TAIDE II

Tehtävä 2: Tietoliikenneprotokolla

Arkkitehtuurinen reflektio

Tiedekunta/Osasto Fakultet/Sektion Faculty Valtiotieteellinen tiedekunta

14 Monikulmiot 1. Nimeä monikulmio. a) b) c) Laske monikulmion piiri. a) 30,8 cm 18,2 cm. Laske sivun x pituus, kun monikulmion piiri on 25,0 cm.

Uolevin reitti. Kuvaus. Syöte (stdin) Tuloste (stdout) Esimerkki 1. Esimerkki 2

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

TYÖPAJA 1: Tasogeometriaa GeoGebran piirtoalue ja työvälineet

Hallintomallit Suomen valtionhallinnon tietohallintostrategioissa

Tietokonegrafiikan perusteet

Action Request System

MEMS-muisti relaatiotietokannoissa

Pintamallintaminen ja maastomallinnus

MS-A0003/A0005 Matriisilaskenta Malliratkaisut 5 / vko 48

Algoritmit 1. Luento 11 Ti Timo Männikkö

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

1 Funktiot, suurin (max), pienin (min) ja keskiarvo

Flow!Works Pikaohjeet

GEOMETRIA MAA3 Geometrian perusobjekteja ja suureita

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

Matematiikan tukikurssi

2. Seuraavassa kuvassa on verkon solmujen topologinen järjestys: x t v q z u s y w r. Kuva 1: Tehtävän 2 solmut järjestettynä topologisesti.

!"#$%&'$("#)*+,!!,"*--.$*#,&--#"*/".,,%0

POHDIN - projekti. Funktio. Vektoriarvoinen funktio

KUVANKÄSITTELY THE GIMP FOR WINDOWS OHJELMASSA

Algoritmi III Vierekkäisten kuvioiden käsittely. Metsätehon tuloskalvosarja 7a/2018 LIITE 3 Timo Melkas Kirsi Riekki Metsäteho Oy

Venekilpailu! Esteiden väistely ja hahmon ohjaaminen

Oppimistavoitematriisi

MS-A0003/A0005 Matriisilaskenta Malliratkaisut 4 / vko 47


Videon tallentaminen Virtual Mapista

MICROSOFT EXCEL 2010

Tietokonegrafiikan perusteet

Transkriptio:

Graikka yleisesti tietokonepeleissä Mikko Heilimo Helsinki 22.2.2006 Seminaaritutkielma HELSINGIN YLIOPISTO Tietojenkäsittelytieteen laitos

HELSINGIN YLIOPISTO HELSINGFORS UNIVERSITET UNIVERSITY OF HELSINKI Tiedekunta/Osasto Fakultet/Sektion Faculty Laitos Institution Department Matemaattis-luonnontieteellinen Tekijä Författare Author Mikko Heilimo Työn nimi Arbetets titel Title Tietojenkäsittelytieteen laitos Graikka yleisesti tietokonepeleissä Oppiaine Läroämne Subject Tietojenkäsittelytiede Työn laji Arbetets art Level Aika Datum Month and year Sivumäärä Sidoantal Number of pages Seminaaritutkielma 22.2.2006 13 sivua Tiivistelmä Referat Abstract Tämä seminaariartikkeli käsittelee tietokonepelien graikkaa yleisesti. Tarkastelun lähtökohdaksi on valittu kolmiulotteiset tietokonepelit ja aihealueen laajuuden ja rajallisen sivumäärän vuoksi käsittely on varsin yleisluontoista, eikä mihinkään osaalueeseen perehdytä pintaa syvemmin. Ensimmäisessä kappaleessa käsitellään kuvan yleistä muodostusta ruudulle, 3Dgraikan eri piirtokerroksia ja kappaleiden näkyvyyksiä. Tämän lisäksi käsitellään erilaisia kuvanmuodostuksen teknisiä apuvälinepuskureita ja 3D-graikassa käytettyjä geometrisia kappaleita. Toinen kappale käsittelee materiaaleja, tekstuureja sekä varjostusta. Näitä ei käsitellä kovin tarkasti tässä seminaariartikkelissa, sillä nämä aiheet käsitellään tarkemmin muissa tämän seminaarin esitelmissä. Kolmas luku käsittelee pelien perinteisiä valotusjärjestelmiä pintapuolisesti. Selvitetään hieman yleisesti käytetyn pistevalon toimintaa, usean valonsäteen yhdistämistä sekä staattisia valotuskarttoja. Neljäs luku käsittelee piirtoliukuhihnaa. Siinä selvitetään laitteistopohjaisen liukuhihnan eroja sovelluskehittäjän itse ohjelmoitavissa oleviin liukuhihnoihin. Luvun toisessa kappaleessa käydään läpi hyvin pintapuolisesti vaihe vaiheelta yleinen piirtoliukuhihnamalli. Malli on sinällään kuitenkin vain viitekehys, sillä toteutukset poikkeavat siitä usein hyvinkin paljon. ACM Computing Classication System (CCS): I.2.1 [Articial Intelligence, Applications and Expert Systems, Games] Avainsanat Nyckelord Keywords kolmiulotteinen graikka, varjostus, tietokonepelit Säilytyspaikka Förvaringsställe Where deposited Muita tietoja övriga uppgifter Additional information

Sisältö ii 1 Johdanto 1 2 Yleistä tietokonegraikasta 1 2.1 Kuvan muodostus ruudulle........................ 1 2.2 Piirtokerrokset ja näkyvyys....................... 2 2.2.1 Piirtopuskuri........................... 2 2.2.2 Taustapuskuri........................... 3 2.2.3 Näkyvyys............................. 3 2.2.4 Syvyys- ja kaaviopuskurit.................... 4 2.3 Kolmiulotteinen geometria peleissä................... 4 2.3.1 Kolmio-geometria......................... 4 2.3.2 Kolmio-rakenne.......................... 5 2.3.3 Kolmiosarjat............................ 5 2.3.4 Objektiverkot........................... 6 2.4 Koordinaattiavaruudet.......................... 6 3 Materiaalit 7 3.0.1 Materiaalit............................ 7 3.0.2 Tekstuurit............................. 7 3.0.3 Varjostimet............................ 8 4 Valaistus 8 4.0.4 Kuvan muodostuminen silmälle................. 8 4.0.5 Pistevalo.............................. 9 4.0.6 Useat valon lähteet........................ 9

4.0.7 Staattiset valotukset....................... 9 iii 5 Piirtoliukuhihna 10 5.1 Laitteistossa toteutettu piirtoliukuhihna................ 10 5.1.1 Piirtoliukuhihnat yleisesti.................... 10 6 Yhteenveto 11 Lähteet 13

1 Johdanto 1 Tietokonepelien graikka on kehittynyt viimeisen kymmenen vuoden aikana kaksiulotteisesta pikseligraikasta näyttäviin 3D-maailmoihin, joissa illuusio todellisuuden kaltaisista virtuaalimaailmoista on ajoittain varsin uskottavan oloista. Tämän kaiken on mahdollistanut 3D-graikkapiirien nopea kehitys. Merkittävimpänä kehityksen harppauksena voidaan pitää aivan viime vuosina yleistyneitä sovellusohjelmoijien itse muokattavia pikselivarjostinyksiköitä, joiden ansiosta peleihin on saatu ensi kertaa toteutettua näyttäviä erikoistehosteita reaaliaikaisesti. 2 Yleistä tietokonegraikasta Tässä kappaleessa esitellään 3D-graikan peruskäsitteistöä ja valotetaan hieman gra- ikan tuottamiseen tarvittavien apuvälineiden toimintaa, kuten taustapuskuria. 2.1 Kuvan muodostus ruudulle Tietokoneen kuva muodostuu ruudulle siten, että näytönohjain siirtää kuvan näyttölaitteelle, josta näyttölaite sitten omien sisäisten tekniikoiden mukaisesti muodostaa kuvan katseltavaksi. Tätä ennen kuitenkin näytönohjain on yhteistyössä prosessorin kanssa tehnyt paljon työtä muodostaakseen esitettävän kuvan kaksiulotteiseen pikselimatriisiin NxK, jossa N on kuvan leveys ja K on kuvan korkeus. Esimerkiksi kolmiulotteisen graikan kohdalla kolmiulotteinen maailman näkymä on tarvinnut projisoida tälle kaksiulotteiselle pikseliavaruudelle. Jatkossa tässä artikkelissa kutsumme näitä avaruuksien ulottuvuuksia yleisillä merkinnöillä 2D ja 3D. Merkinnät viittaavat siis kuvattavan maailman tai muun käsitteen dimensioihin. Tämä seminaariartikkeli keskittyy kolmiulotteisen maailman peruskäsitteisiin ja näihin eri avaruuksien konversiovaiheisiin kuvaa muodostettaessa.

2 2.2 Piirtokerrokset ja näkyvyys 2.2.1 Piirtopuskuri Piirtopintapuskuri (frame buer) on se NxK-matriisi, joka on kuvattu kappaleessa 2.1. Puhuttaessa piirtopintapuskurista matriisina, tulee ottaa huomioon, että kyse on ainoastaan abstraktista mallista, eikä kyseinen puskuri ole fyysisessä mielessä useinkaan kaksiulotteinen. Puskuri on todellisuudessa useimmissa toteutuksissa yhtenäinen yksiulotteinen muistialue, joka sijaitsee lähes poikkeuksetta näytönohjaimen muistissa. Tämän muistialueen ulkopuolella on vain kuvattu näytön ulottuvuudet erillisissä muuttujissa ja näin voimme mieltää puskurin kaksiulotteiseksi ajattelemalla, että puskurin N ensimmäistä pikseliä ovat rivillä 1 ja seuraavat N pikseliä rivillä kaksi jne. Piirtopintapuskuriin piirretään ruudulle muodostettava kuva. Perinteisessä kaksiulotteisessa graikassa kuten käyttöjärjestelmien käyttöliittymissä (GUI, Graphical User Interface) käyttöjärjestelmä piirtää suoraan tähän ainoaan näyttöpuskuriin, jolloin piirrettävä kuva muodostuu välittömästi ruudulle. Tämä tarkoittaa käytännössä sitä, että käyttäjä saattaa nähdä kuvan koko sen muodostumisen ajan ja näin myös kuvan ollessa keskeneräinen. Usein laitteistot kuitenkin voidaan määrätä odottamaan kuvan uudelleenpiirtoa niin kauan, että koko kuva-ala on saatu piirrettyä. Tämä estää varsin haitallisen ruudun välkkymisilmiön piirron aikana. Menetelmät eivät kuitenkaan poista sitä ongelmaa, että kolmiulotteisessa graikassa kuva muodostetaan useassa työvaiheessa ja näin kuvaa ei voida piirtää edes yhdellä pyyhkäisyllä ruudulle. Usein piirretään ruudulle paljon kolmiulotteisia elementtejä, jotka jäävät lopulta jonkin toisen elementin taakse. Esimerkiksi ruudun taka-alalle saatetaan piirtää puita ja lopulta etualalle piirtyy talo, joka peittää osan puista. Vaikka tällaista turhaa piirtämistä pyritään välttämään useilla ohjelmointitekniikoilla, niin usein kuitenkin tehosyistä joudutaan piirtämään paljonkin asioita, jotka jäävät pois lopullisesta kuvasta. Mikäli yllä kuvatun kaltainen kuva piirrettäisiin suoraan ruudulle näkyisi aluksi koko metsä ja vasta, kun päästäisiin piirtojärjestyksessä tuon talon kohdalle, osa puista peittyisi. Tilanne on selvästi epätoivottu ja näin ei tietysti saisi käydä. Tätä ongelmaa ratkaisemaan on peleihin kehitetty tekniikka, jossa

3 taustapuskuria (frame buer) hyödynnetään näkyvien pikselien määrittämiseksi. 2.2.2 Taustapuskuri Taustapuskurin käytössä ollessa piirtojärjestelmä (rendering prosessing system) piirtää kuvan aluksi taustapuskuriin, josta koko kuvan valmistuttua se vaihdetaan piirtopuskuriksi ja entinen piirtopuskuri tulee näin ollen taustapuskuriksi. Nykyisin näytönohjaimien tehot ovat niin suuria, että usein ei enää vain vaihdeta puskureita vaan ne todella kopioidaan toisiinsa. Tämä mahdollistaa datan käsittelyn kopioinnin aikana. Esimerkiksi tiedon tallennusmuoto voidaan vaihtaa tai taustapuskuri voidaan pakata [Rab05, s. 445]. 2.2.3 Näkyvyys Objektien näkyvyys 3D-maailmassa on hieman ongelmallista. On itsestään selvää, että ei ole perusteltua piirtää objekteja, jotka eivät näy ruudulla ollenkaan, sillä tämä veisi vain laskenta-aikaa ilman näkyvää tulosta. Näin ollen tarvitaan optimointialgoritmeja, jotka pyrkivät poistamaan esimerkiksi ylimääräisiä objekteja, kuten metsä-esimerkissä kappaleessa 2.2.1. Yksinkertaisin tällainen optimointi olisi, että jätetään piirtämättä kaikki objektit, jotka eivät näy ruudulla. Toisin sanoen jätetään piirtämättä objektit, jotka ovat kameran näkyvyysprojision ulkopuolella. Tätä käytetäänkin paljon nykypeleissä ja vaikka optimointi on ilmeisen tehokas, niin se ei yksinään riitä. Tämän lisäksi pyritään myös laskemaan kappaleet, jotka jäävät toisten kappaleiden taakse kokonaisuudessaan. Tämä menetelmä on myös varsin yleisesti käytössä ja toimii varsin hyvin. Meillä voi olla kuitenkin tilanteita, joissa kappaleet ovat toistensa päällä. Tarkemmin sanottua kappale a on kappaleen b sisällä tai vain osittain päällekkäin. Kuvitellaan tilannetta, että 3D-maailmassa yritetään kuvata lintua häkissä. Tässä esimerkissä lintu on täysin häkin sisällä. Näin ollen häkin etuosan pitäisi olla linnun edessä (piirretään linnun jälkeen) ja häkin takaosan pitäisi olla linnun takana (piirretään vastaavasti ennen lintua). Tätä ongelmaa ei voida ratkaista edes sillä, että häkki jaetaan kahteen osaa, sillä jos kameran pyörähtää 90 astetta linnun ympäri

4 molemmat osat häkistä ovat nyt sivuttain ja huomataan, että ratkaisu ei toimi. Näihin tilanteihin on kehitetty varsin hyvä menetelmä jota kutsutaan syvyyspuskuriksi (Depth Buer) [Rab05, s. 445]. 2.2.4 Syvyys- ja kaaviopuskurit Syvyyspuskurissa on tarkoitus laskea jokaisen pikselin etäisyys kameran tarkastelupisteestä. Tämä tapahtuu siten, että ensin piirretään objekteja käänteisessä etäisyysjärjestyksessä kameraan, kaukaisin ensin periaatteella. Jokaisen piirrettävän pikselin kohdalla tarkistetaan, että onko pikselin syvyyspuskurissa oleva vanha etäisyysarvo suurempi kuin mitä uuden päälle piirrettävän pikselin syvyysarvo. Mikäli näin on niin pikselin arvo ja syvyyspuskurin arvo korvataan uusilla arvoilla. Tätä jatketaan kunnes koko kuva on piirretty valmiiksi [Rab05, s. 445-446]. Tekniikasta käytetään myös hieman vähemmän tehoa tarvitsevaa versiota, jossa jokaisen monikulmion pisteiden väliset pikselit interpoloidaan päätepisteiden perusteella. Tämä on usein huomattavasti nopeampaa, vaikka molemmat algoritmit ovatkin saman kertaluokan algoritmeja [WaL01, s. 514-518]. Kaaviopuskuria (stencil buer) käytetään usein kiinteästi syvyyspuskurin kanssa. Kaaviopuskurin käyttötarkoitus ei ole vakiintunutta ja se toimii usein erilaisissa efekteissä aputietona. Esimerkiksi usein nykyisin käytetään 24-bittistä syvyyspuskuria ja 8 bittistä kaaviopuskuria, jolloin ne voidaan yhdistää yhdeksi 32 bittiseksi puskuriksi, jota kutsutaan syvyys- tai kaavio-puskuriksi. 2.3 Kolmiulotteinen geometria peleissä Tässä luvussa käsitellään peleissä käytettyjä geometrisia kappaleita ja kuvataan, miten isommat kappaleet muodostuvat pienemmistä osista. 2.3.1 Kolmio-geometria Suuresta alkeiskuvioiden (primitives) joukosta 3D-maailmoissa käytetään lähinnä vain kolmioita, jotka muodostuvat pisteistä. Jotkut laitetason renderöintiliukuhih-

5 nat tukevat myös muita alkeiskuvioita, kuten neliöitä, pisteitä ja olioita (sprite), mutta lähes poikkeuksetta nämä muut primitiivit muuntuvat piirtoliukuhihnalla kolmioiksi, joten keskitymme tässä artikkelissa vain kolmioihin. Ne ovat yleisimpiä alkeiskuvioita, sillä kolmioilla on useita todella hyviä ominaisuuksia 3D-graikan näkökulmasta. Ensinnäkin kolmiot ovat yksinkertaisimpia alkeiskuvioita, jotka määrittävät pinnan (surface) avaruudessa. Myöskin kolmioiden päätepisteiden välisiä pisteitä on varsin helppo interpoloida ja kolmiot muodostavat helposti monimutkaisempia kolmiulotteisia objekteja, kuten myöhemmin tulemme näkemään. 2.3.2 Kolmio-rakenne Kolmiot muodostuvat vertekseistä (vertice) kuten kuvasta 1 käy ilmi. Verteksit eivät ole tavallisia pisteitä avaruudessa, joilla on ainoastaan paikka (x,y,z). Vertekseillä on myös muita ominaisuuksia, kuten väri ja normaalivektori, joita käsitellään myöhemmin. 2.3.3 Kolmiosarjat Koska kaikki monimutkaiset 3D-kappaleet kuvataan kolmioilla, on selvää, että monimutkaisemmat kappaleet koostuvat useista vierekkäisistä kolmioista. Esimerkiksi nelikulmio koostuu kahdesta kolmiosta, jotka jakavat yhden sivun nelikulmion lävistäjällä. Suurempi suorakaide koostuu nelikulmioista ja niin edelleen. Kuvasta 2 huomaamme, että tällä tavoin muodostettavat kolmionauhat sisältävät paljon toistuvia verteksejä eri kolmioita määritettäessä. Yksinkertaisin tapa tallentaa nuo nauhat olisi kirjata jokainen verteksi siinä järjestyksessä kun ne kolmio-kolmiolta kappaletta myötäpäivää läpikäydessä tulevat vastaan. Tällaista tallennusrakenne on nimeltään kolmiolista (triangle list). Ei ole viisasta tallentaa näitä toistuvia verteksejä vaan olisi parempi kirjata jokainen verteksi vain kertaalleen. Näin tehdään kolmionauha (triangle stip) ja kolmioviuhka (triangle fan) tallennusrakenteissa. Nämä ovatkin yleisimmät tallennusrakenteet juuri niiden tehokkuuden vuoksi. Kuvassa 3 on kuvattuna nämä rakenteet sekä vielä erikoistapauksina viivalista (line list) ja viivanauha (line strip), joilla voidaan kuvata tehokkaasti esimerkiksi tekoälyn ja pelin

6 muiden rakenteiden tarvitsemia tietoja graikan ulottuvuuksista [WWJ05, s. 459-463]. Kolmioviuhka muodostuu yhdestä keskusverteksistä, jota vasemmalta oikealle seuraa jokainen kyseiseen keskusverteksiin liittyvä verteksi. Tällä menetelmällä on erityisen tehokasta kuvata kolmioviuhkalle hankalia orgaanisia kappaleita kuten ihmisten kasvoja. Kolmioviuhka vastaavasti kuvaa myötäpäivää kiertäen kolmiot siten, että edellisen kolmion viimeinen verteksi on seuraavan kolmion ensimmäinen verteksi. Tämä menetelmä on myös varsin tehokas ja kuten kuvasta 3 voi huomata niin kolmen vierekkäisen kolmion kuvaaminen onnistuu kolmiolistassa yhdeksällä verteksillä ja vastaavasti kolmioviuhkassa ja kolmionauhassa viidellä verteksillä. Tämä on piirtoliukuhihnan kannalta todella merkittävä ero, kun samoja kuvioita käydään toistuvasti läpi. 2.3.4 Objektiverkot Vertekseistä muodostuu kolmioita, jotka muodostavat kolmiorakenteita ja näitä muodostuneita monimutkaisia kolmirakenteita kutsutaan objektiverkoiksi (mesh). On hieman ohjelmointirajapinnasta riippuvaista, mitä kaikkea määritetään objektiverkkoon kuuluvaksi, mutta yleisesti rajaus tehdään geometrisiin rakenteisiin. Kuitenkin useat järjestelmät liittävät objektiverkkoihin myös materiaaleja, tekstuureja ja muita objektiin yleisesti liittyviä tietoja. 2.4 Koordinaattiavaruudet Tietokonepeleissä käytetään monenlaisia koordinaattiavaruuksia. Yleisesti voidaan kuitenkin sanoa, että kaikki yleisimmät avaruudet ovat joko 2D- tai 3D-avaruuksia ja usein vielä niin, että avaruus muodostuu (x,y,z) ulottuvuuksista. On kuitenkin muistettava, että eri 3D-kirjastot käyttävät eri avaruuksia ja esimerkiksi Direct3D käyttää vasenkätistä avaruutta, jossa z-ulottuvuus kasvaa poispäin origosta ja avoin OpenGL rajapinta käyttää oikeakätistä avaruutta, jossa z-akseli mielletään toisin päin. Näiden kahden avaruuden välillä tehtävät konversiot ovat kuitenkin helppoja, eikä avaruuksia käsitellä ajanpuutteen vuoksi tässä tarkemmin. Koordinaattiavaruuksista puhuttaessa on kuitenkin huomioitava, että on usein hyö-

7 dyllistä pitää erillisinä maailma-koordinaattiavaruus (world space) sekä objektien sisäinen avaruus (object space). Objektien verteksien topologiat on määritetty sisäisessä avaruudessa ja kappaleita siirretään ja pyöritetään maailma-koordinaattiavaruudessa. Nämä asiat liittyvät kuitenkin enemmän tämän seminaarin muihin esityksiin, joten en käsittele niitä tämän laajemmin tässä yhteydessä. 3 Materiaalit Tämä kappale käsittelee materiaalien vaikutusta objektien lopulliseen ulkoasuun. 3.0.1 Materiaalit Objektit ja niiden verteksit määrittävät, millaiset kolmiulotteiset kappaleet ovat muodoiltaan, mutta lopullisen ulkonäön, sen miltä kappaleet todellisuudessa näyttävät, määrittävät niiden materiaalit. Materiaaleja voisi kuvata ryhmäksi erilaisia määrityksiä kappaleen reagoimisesta valoon. Varjostimet (shader), tekstuurit ja heijastuvuus kuuluvat lähes jokaiseen materiaalimääritykseen [WWJ05, s. 450]. Materiaalien tarkka sisältö on todella paljon 3D-moottorista (3D engine) riippuvaista, eikä siksi voida sanoa mitään yleispätevää määritystä materiaaleille. Seuraavissa kappaleissa selvennetään eri materiaalien osien tehtäviä ja näin tämä hieman epämääräinen määritelmä selkiytyy. 3.0.2 Tekstuurit Periaatteessa jokainen 3D-objektin pintapikselin ulkonäkö (surface pixel) määräytyy pikselin väristä. Yleisin tapa määrittää tämä väri on kääriä objektin pintaan bittikarttakuva, josta kopioidaan jokaisen pikselin perusväri materiaaliin. Tätä väriä sitten myöhemmin muutetaan varjostimilla sekä valoilla niin, että saadaan aikaan tilanteeseen sopiva valotustasapaino [WWJ05, s. 450, 463-470]. Tekstuurien sisältö talletetaan tekseleihin (texel), jotka ovat käytännössä kolmen tai neljän väriarvon pikseleitä, joiden osavärit koostuvat RGB tai RGBA arvoista, joissa R on punainen, G on vihreä ja B on sininen. Lisäksi saatetaan käyttää A arvoa, joka tarkoittaa

läpinäkyvyyttä (alpha). Varjostin ohjelmat saattavat muuttaa näitä arvoja varsin vapaasti tai jopa vaihtaa käyttötarkoituksia tarpeidensa mukaisesti. 8 3.0.3 Varjostimet Varjostimet ovat pieniä ohjelmia, jotka määrittävät miten kukin pikseli lopulta piirretään ruudulle. Ohjelmoitavat varjostinyksiköt yleistyivät tietokoneiden näytönohjaimissa muutamia vuosia sitten. Sitä ennen kiinnitetty renderöintiliukuhihna huolehti tästä aika automaattisesti. Ohjelmoitavia varjostimia käytetään varsin laajasti esimerkiksi turkin, hiusten, veden sekä erilaisten tuliefektien aikaansaamiseksi [WaL01, s. 463-470]. Uusimmat kehitelmät käyttävätkin näytönohjaimien graikkatehoja myös pelien fysiikan mallintamiseen, mutta koska tämä on vielä hyvin harvinaista, emme keskity siihen tässä seminaariartikkelissa. 4 Valaistus Valaistus on oleellinen osa uskottavan 3D-maailman muodostamista. Tämä kappale käsittelee valaistuksen muodostusta pintapuolisesti. 4.0.4 Kuvan muodostuminen silmälle Oikean valon reitin simulointi verkkokalvolle on aivan liian hidasta tehdä reaaliaikaisesti. Reaalimaailmassa valon fotonit kimpoilevat esineistä ja silmä rekisteröi kaikki siihen tulleet fotonit. Silmä on varsin tarkka tässä ja on ymmärrettävää, että tätä ei ole mahdollista laskea kovin tehokkaasti [Rab05, s. 470-484]. Radiositeetti (radiosity) järjestelmässä pyritään laskemaan vain ne fotonit, jotka lopulta saapuvat verkkokalvolle hyödyntämällä käänteislaskentaa. Tällöin lasketaan valittu joukko fotoneja, jotka lähtevätkin silmästä ja katsotaan, miten ne kimpoilevat kappaleisiin ja minkä värin ne lopulta saavat. Näin ei tarvitse laskea liikkeitä fotoneille, jotka eivät koskaan saavu verkkokalvolle. Radiositeettilaskelmat ovat tehtävissä tietokoneella ja näitä käytetäänkin hyvin yleisesti tietokonepelien mallien luonnissa 3D-mallinnusohjelmissa. Tämäkään tekniikka ei ole vain hyödynnettävissä reaaliai-

9 kaisesti, joten pelien reaaliaikainen valaistus tehdään simuloinneilla, jotka eivät todellisuudessa ole kovin realistia. Seuraavissa kappaleissa käsittelen näitä tekniikoita pinnallisesti. 4.0.5 Pistevalo Pistevalo (point light) on perinteinen pelien valotekniikka. Siinä simuloidaan pistemäistä valonlähdettä siten, että valotuksen määrä vaihtelee arvovälillä [0,1]. Laskennassa käytetään kaavaa, jossa pisteen valoisuus arvoa muutetaan sen mukaan, miten kaukana se sijaitsee valonlähteestä: ilmentyvä väri = valonvari valonkirkkaus etaisyysvaloon 2 s. 470-484] [WWJ05, 4.0.6 Useat valon lähteet On hieman ongelmallista, että jos 3D maailmassa on esimerkiksi 10 eri valonlähdettä, niin kaikkien valonlähteiden valon laskeminen on liian raskasta tehdä reaaliaikaisesti. Onneksi usein riittää, että laskemme vain 1-4 eniten kohteeseen vaikuttavan valon vaikutuksen. Usein valinta tehdään puhtaasti valon ja pinnan välisen etäisyysvektorin suhteen. Näiden pistevalojen lisäksi käytetään usein ympäristöä ympäröivää yleisvaloa (ambient light). Tämä antaa kevyen valotuksen päivänvalon tapaisesti jokaiselle valotettavalle objektille. 4.0.7 Staattiset valotukset Usein käytetty ja varsin tehokas valotustapa on laskea kohteen valot etukäteen esimerkiksi radiositeettilaskennalla erilliselle valotuskartalle (lightmap). Valotuskartta voidaan mieltää erilliseksi tekstuuriksi, jossa on jokaisen valonlähteen vaikutus laskettuna tarkasti jokaiselle pikselille. Menetelmällä saadaan varsin hyvännäköisiä valotuksia esimerkiksi huoneisiin, mutta menetelmän ongelmana on, että se on tarkoitettu staattisille valonlähteille. On kehitetty myös menetelmiä, joissa valosta tallennetaan enemmänkin tietoa, mutta näiden ongelmana on valtava muistin käyttö, aivan kuten perus valokarttatekniikoissakin.

5 Piirtoliukuhihna 10 Laitteiston piirtoliukuhihnat vaihtelevat varsin paljon toisistaan, mutta kaikilla niillä on joitain yhteisiä ominaisuuksia, vaikka järjestykset saattavatkin vaihdella runsaasti eri toteutuksissa. Tässä kappaleessa pyritään valottamaan hieman näitä yleisimpiä piirron vaiheita. 5.1 Laitteistossa toteutettu piirtoliukuhihna Aikaisemmin piirtoliukuhihnat (rendering pipeline) olivat laitteen sisäisen toteutuksen varassa, eikä sovellusohjelmoija voinut vaikuttaa liukuhihan toimintaan kovinkaan paljon. Nykyisin kuitenkin kaikki merkittävät näytönohjainvalmistajat tukevat ohjelmoitavia pikselivarjostinyksiköitä ja sekä NVIDIA että ATI ovat tällä hetkellä pikselivarjostimissaan versiossa 3.0. Jokainen uusi versio on lisännyt ohjelmoitavuutta ja pidentänyt ohjelmointirajapintojen käskykantoja. Varjostinrajapintojen kehityksessä myös pisimmän mahdollisen ohjelman tai aliohjelman pituus on perinteisesti kasvanut. Näin voidaan tehdä yhä monimutkaisempia varjostusohjelmia. 5.1.1 Piirtoliukuhihnat yleisesti Piirtoliukuhihnan tehtävä on tuottaa kappaleiden vertekseistä ja niiden materiaaleista lopulliset kappaleet ruudulle. Tämä tapahtuu useassa osassa, eikä voida puhua mistään tietystä piirtoliukuhihnasta, sillä toteutukset vaihtelevat paljon eri sovelluksissa, mutta tässä käymme läpi yleisimmän tapauksen, jota enemmän ja vähemmän toteutukset mukailevat. Ensiksi kappaleista on olemassa vain geometria- sekä materiaalitiedot, josta usein saadaan tekstuuri kappaleen pinnalle. Aluksi kappaleet siirretään paikoilleen 3Davaruudessa ja pyöritetään ja skaalataan oikeaan kokoonsa. Seuraava vaihe on kappaleiden geometrian muuttaminen ensin mallin sisäisestä avaruudesta 3D-maailman avaruuteen ja siitä edelleen näkymän avaruuteen. Tämän jälkeen päästään itse kappaleiden piirtämiseen. Aluksi suoritetaan taustapuolen poisto (backface culling), sillä jokaisella kolmiolla ja muilla monikulmioilla on myötäpäivään ja vastapäivään mää-

11 rittyvät puolet. Usein vain toinen puolista halutaan piirtää tehosyistä. Tämä puoli on luonnollisesti se, joka on kameraan päin. Taustojen poiston jälkeen suoritetaan leikkaus (clipping), jossa poistetaan ne kolmiot, jotka eivät ole näkyvissä. Kun kolmiot ja muut monikulmiot on leikattu, projisoidaan monikulmiot leikkausavaruudesta ruutuavaruuteen (screen space), jotta saadaan kolmiot mahtumaan ruudulle [Rab05, s. 491-494]. Seuraavaksi vuorossa on rasterointi. Tässä vaiheessa selvitetään, mihin pikseleihin kukin monikulmio muodostuu ruudulla. Lopulta pikselit voidaan varjostaa. Kuten edellisistä kappaleista huomattiin, niin varjostettavien pikselien joukko on aika paljon harventunut alkuperäisestä edellisten työvaiheiden takia. Viimeinen vaihe on rosoisuuden poisto (antialiasing), jossa useista yhdistetyistä pikseleistä muodostetaan ruudulla lopulta näkyvät pikselit. Tämä poistaa käytännössä monikulmioiden reunakohtien kontrastia ja kuvasta saadaan alemmalla resoluutiolla pehmeämmän näköinen. 6 Yhteenveto Tietokonepelien graikka on viimeisen kymmenen vuoden aikana kehittynyt 2Dgraikasta 3D-graikkaan. 3D-graikan yleistymisen on mahdollistanut graikkakorttien huima kehitys. Näytöllä näkyvä graikka luetaan piirtopuskurista. 3D-graikassa piirtoprosessi on monivaiheinen, joten kuva piirretään ensin taustapuskuriin, joka aina uuden kuvan valmistuttua siirretään piirtopuskuriin. Vaikka näyttökortit ovat varsin tehokkaita, joudutaan piirtoa optimoimaan paljon ja pyritään tietysti piirtämään 3D-maailman osista vain ne, jotka ovat näkyvillä kulloisestakin kuvakulmasta. Tähän käytetään useita eri menetelmiä kuten syvyyspuskuria. Kolmiot ovat yleisimpiä alkeiskuvioita 3D-tietokonegraikassa, sillä kolmioilla on useita todella hyviä ominaisuuksia. Ensinnäkin kolmiot ovat yksinkertaisimpia alkeiskuvioita, jotka määrittävät pinnan avaruudessa. Myöskin kolmioiden päätepis-

12 teiden välisiä pisteitä on varsin helppo interpoloida ja kolmiot muodostavat helposti monimutkaisempia kolmiulotteisia objekteja. Objektiverkot koostuvat usein jostain kolmiorakenteesta. Yleisimmät kolmirakenteet, joilla objektiverkkoja kuvataan ovat kolmioviuhka ja kolmionauha. Nämä rakenteet kuvaavat kappaleita hyvin tehokkaasti, mikä on tärkeää, sillä näitä rakenteita käsitellään useasti piirtoliukuhihnan suorituksen aikana. Objektit ja niiden verteksit määrittävät, millaiset kolmiulotteiset kappaleet ovat muodoiltaan, mutta lopullisen ulkonäön, sen miltä kappaleet todellisuudessa näyttävät, määrittävät niiden materiaalit. Materiaaleja voisi kuvata ryhmäksi erilaisia määrityksiä kappaleen reagoimisesta valoon - varjostimet (shareder), tekstuurit ja heijastuvuus kuuluvat lähes jokaiseen materiaalimääritykseen. Materiaalien tarkka sisältö on todella paljon 3D-moottorista (3D engine) riippuvaista. Jokaisen 3D-objektin pintapikselin ulkonäkö (surface pixel) määräytyy pikselin väristä. Yleisin tapa määrittää tämä väri on kääriä objektin pintaan bittikarttakuva, josta kopioidaan jokaisen pikselin perusväri materiaaliin. Tätä väriä sitten myöhemmin muutetaan varjostimilla sekä valoilla niin, että saadaan aikaan tilanteeseen sopiva valotustasapaino. Varjostimet ovat pieniä ohjelmia, jotka määrittävät miten kukin pikseli lopulta piirretään ruudulle. Ohjelmoitavat varjostinyksiköt yleistyivät tietokoneiden näytönohjaimissa muutamia vuosia sitten. Sitä ennen kiinnitetty renderöintiliukuhihna huolehti tästä aika automaattisesti. Ohjelmoitavia varjostimia käytetään varsin laajasti esimerkiksi turkin, hiusten, veden sekä erilaisten tuliefektien aikaansaamiseksi. Oikean valon reitin simulointi verkkokalvolle on aivan liian hidasta tehdä reaaliaikaisesti. Reaalimaailmassa valon fotonit kimpoilevat esineistä ja silmä rekisteröi kaikki siihen tulleet fotonit. Silmä on varsin tarkka tässä ja on ymmärrettävää, että tätä ei ole mahdollista laskea kovin tehokkaasti reaaliaikaisesti. Pistevalo (point light) on perinteinen pelien valotekniikka. Siinä simuloidaan pistemäistä valonlähdettä siten, että valotuksen määrä vaihtelee arvovälillä [0,1]. Laskennassa käytetään kaavaa, jossa pisteen valoisuusarvoa muutetaan sen mukaan, miten

13 kaukana se sijaitsee valonlähteestä. Pistevalon lisäksi käytetään yleensä yhtä yleisvaloa. Pistevalojen ja yleisvalon yhteisvaikutus lasketaan tehosyistä usein niin, että vain muutama lähin valo lasketaan mukaan. Staattisella valotuksella voidaan laskea mallinnusohjelmissa etukäteen hienoja valoefektejä erillisille tekstuurille. Laitteiston piirtoliukuhihnat vaihtelevat varsin paljon toisistaan, mutta kaikilla niillä on joitain yhteisiä ominaisuuksia, vaikka järjestykset saattavatkin vaihdella runsaasti eri toteutuksissa. Prosessi on hyvin monivaiheinen ja sisältää paljon laskentaa. Tarkoituksena monilla näistä operaatioista on vähentää seuraavissa vaiheissa suoritettavaa laskentaa. Lähteet Rab04 Rabin, S., AI Game Programming Wisdom 2. Charles River Media, Hingham, 2004. Rab05 WaL01 WWJ05 Rabin, S., Introduction to Game Development. Charles River Media, Hingham, Massachusetts, 2005. Walsh, P. ja A., L., The Zen of Direct3D Game Programming. Prima Publishing, Roseville, California 95661, 2001. Walker, J., C., W. ja J., K., Making A Game Demo From Concept to Demo Gold. Woldware Publishing Inc.

Kuva 1: Yksinkertainen kolmio 2D avaruudessa [WaL01, s. 423]

Kuva 2: Yksinkertainen kolmionauha, jolla voidaan muodostaa monimutkaisempia kappaleita [WaL01, s. 425]. Kuva 3: Kuvattuna erilaisia alkeiskappaleiden tallennusrakenteita (vasemmalta oikealle): kolmiolista, kolmioviuhka, kolmionauha, viivalista ja viivanauha [WWJ05, s. 459-463].