19

Gra ikka yleisesti tietokonepeleissä · 2006-02-22 · lähtökohdaksi on alittuv kolmiulotteiset tietokonepelit ja aihealueen laajuuden ja rajallisen sivumäärän vuoksi äsittelyk

  • Upload
    others

  • View
    1

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Gra ikka yleisesti tietokonepeleissä · 2006-02-22 · lähtökohdaksi on alittuv kolmiulotteiset tietokonepelit ja aihealueen laajuuden ja rajallisen sivumäärän vuoksi äsittelyk

Gra�ikka yleisesti tietokonepeleissä

Mikko Heilimo

Helsinki 22.2.2006

Seminaaritutkielma

HELSINGIN YLIOPISTO

Tietojenkäsittelytieteen laitos

Page 2: Gra ikka yleisesti tietokonepeleissä · 2006-02-22 · lähtökohdaksi on alittuv kolmiulotteiset tietokonepelit ja aihealueen laajuuden ja rajallisen sivumäärän vuoksi äsittelyk

Matemaattis-luonnontieteellinen Tietojenkäsittelytieteen laitos

Mikko Heilimo

Gra�ikka yleisesti tietokonepeleissä

Tietojenkäsittelytiede

Seminaaritutkielma 22.2.2006 13 sivua

kolmiulotteinen gra�ikka, varjostus, tietokonepelit

Tämä seminaariartikkeli käsittelee tietokonepelien gra�ikkaa 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 osa-

alueeseen perehdytä pintaa syvemmin.

Ensimmäisessä kappaleessa käsitellään kuvan yleistä muodostusta ruudulle, 3D-

gra�ikan eri piirtokerroksia ja kappaleiden näkyvyyksiä. Tämän lisäksi käsitellään

erilaisia kuvanmuodostuksen teknisiä apuvälinepuskureita ja 3D-gra�ikassa käytet-

tyjä 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. Selvite-

tää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 liuku-

hihnan 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 Classi�cation System (CCS):

I.2.1 [Arti�cial Intelligence, Applications and Expert Systems, Games]

Tiedekunta/Osasto � Fakultet/Sektion � Faculty Laitos � Institution � Department

Tekijä � Författare � Author

Työn nimi � Arbetets titel � Title

Oppiaine � Läroämne � Subject

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

Tiivistelmä � Referat � Abstract

Avainsanat � Nyckelord � Keywords

Säilytyspaikka � Förvaringsställe � Where deposited

Muita tietoja � övriga uppgifter � Additional information

HELSINGIN YLIOPISTO � HELSINGFORS UNIVERSITET � UNIVERSITY OF HELSINKI

Page 3: Gra ikka yleisesti tietokonepeleissä · 2006-02-22 · lähtökohdaksi on alittuv kolmiulotteiset tietokonepelit ja aihealueen laajuuden ja rajallisen sivumäärän vuoksi äsittelyk

ii

Sisältö

1 Johdanto 1

2 Yleistä tietokonegra�ikasta 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

Page 4: Gra ikka yleisesti tietokonepeleissä · 2006-02-22 · lähtökohdaksi on alittuv kolmiulotteiset tietokonepelit ja aihealueen laajuuden ja rajallisen sivumäärän vuoksi äsittelyk

iii

4.0.7 Staattiset valotukset . . . . . . . . . . . . . . . . . . . . . . . 9

5 Piirtoliukuhihna 10

5.1 Laitteistossa toteutettu piirtoliukuhihna . . . . . . . . . . . . . . . . 10

5.1.1 Piirtoliukuhihnat yleisesti . . . . . . . . . . . . . . . . . . . . 10

6 Yhteenveto 11

Lähteet 13

Page 5: Gra ikka yleisesti tietokonepeleissä · 2006-02-22 · lähtökohdaksi on alittuv kolmiulotteiset tietokonepelit ja aihealueen laajuuden ja rajallisen sivumäärän vuoksi äsittelyk

1

1 Johdanto

Tietokonepelien gra�ikka on kehittynyt viimeisen kymmenen vuoden aikana kaksiu-

lotteisesta pikseligra�ikasta näyttäviin 3D-maailmoihin, joissa illuusio todellisuuden

kaltaisista virtuaalimaailmoista on ajoittain varsin uskottavan oloista. Tämän kai-

ken on mahdollistanut 3D-gra�ikkapiirien nopea kehitys. Merkittävimpänä kehityk-

sen harppauksena voidaan pitää aivan viime vuosina yleistyneitä sovellusohjelmoi-

jien itse muokattavia pikselivarjostinyksiköitä, joiden ansiosta peleihin on saatu ensi

kertaa toteutettua näyttäviä erikoistehosteita reaaliaikaisesti.

2 Yleistä tietokonegra�ikasta

Tässä kappaleessa esitellään 3D-gra�ikan 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ä prosesso-

rin kanssa tehnyt paljon työtä muodostaakseen esitettävän kuvan kaksiulotteiseen

pikselimatriisiin NxK, jossa N on kuvan leveys ja K on kuvan korkeus. Esimerkik-

si kolmiulotteisen gra�ikan kohdalla kolmiulotteinen maailman näkymä on tarvin-

nut projisoida tälle kaksiulotteiselle pikseliavaruudelle. Jatkossa tässä artikkelissa

kutsumme näitä avaruuksien ulottuvuuksia yleisillä merkinnöillä 2D ja 3D. Mer-

kinnä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.

Page 6: Gra ikka yleisesti tietokonepeleissä · 2006-02-22 · lähtökohdaksi on alittuv kolmiulotteiset tietokonepelit ja aihealueen laajuuden ja rajallisen sivumäärän vuoksi äsittelyk

2

2.2 Piirtokerrokset ja näkyvyys

2.2.1 Piirtopuskuri

Piirtopintapuskuri (frame bu�er) on se NxK-matriisi, joka on kuvattu kappaleessa

2.1. Puhuttaessa piirtopintapuskurista matriisina, tulee ottaa huomioon, että ky-

se on ainoastaan abstraktista mallista, eikä kyseinen puskuri ole fyysisessä mieles-

sä useinkaan kaksiulotteinen. Puskuri on todellisuudessa useimmissa toteutuksissa

yhtenäinen yksiulotteinen muistialue, joka sijaitsee lähes poikkeuksetta näytönoh-

jaimen muistissa. Tämän muistialueen ulkopuolella on vain kuvattu näytön ulot-

tuvuudet 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ä kaksiu-

lotteisessa gra�ikassa 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än-

nö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ä odot-

tamaan 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 gra�ikassa kuva muo-

dostetaan useassa työvaiheessa ja näin kuvaa ei voida piirtää edes yhdellä pyyhkäi-

syllä ruudulle. Usein piirretään ruudulle paljon kolmiulotteisia elementtejä, jotka

jäävät lopulta jonkin toisen elementin taakse. Esimerkiksi ruudun taka-alalle saate-

taan 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 ruu-

dulle 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 tie-

tysti saisi käydä. Tätä ongelmaa ratkaisemaan on peleihin kehitetty tekniikka, jossa

Page 7: Gra ikka yleisesti tietokonepeleissä · 2006-02-22 · lähtökohdaksi on alittuv kolmiulotteiset tietokonepelit ja aihealueen laajuuden ja rajallisen sivumäärän vuoksi äsittelyk

3

taustapuskuria (frame bu�er) hyödynnetään näkyvien pikselien määrittämiseksi.

2.2.2 Taustapuskuri

Taustapuskurin käytössä ollessa piirtojärjestelmä (rendering prosessing system) piir-

tää kuvan aluksi taustapuskuriin, josta koko kuvan valmistuttua se vaihdetaan piir-

topuskuriksi ja entinen piirtopuskuri tulee näin ollen taustapuskuriksi. Nykyisin näy-

tönohjaimien tehot ovat niin suuria, että usein ei enää vain vaihdeta puskureita vaan

ne todella kopioidaan toisiinsa. Tämä mahdollistaa datan käsittelyn kopioinnin ai-

kana. 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 optimoin-

tialgoritmeja, 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äte-

tää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, jois-

sa 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 (piir-

retää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

Page 8: Gra ikka yleisesti tietokonepeleissä · 2006-02-22 · lähtökohdaksi on alittuv kolmiulotteiset tietokonepelit ja aihealueen laajuuden ja rajallisen sivumäärän vuoksi äsittelyk

4

molemmat osat häkistä ovat nyt sivuttain ja huomataan, että ratkaisu ei toimi. Näi-

hin tilanteihin on kehitetty varsin hyvä menetelmä jota kutsutaan syvyyspuskuriksi

(Depth Bu�er) [Rab05, s. 445].

2.2.4 Syvyys- ja kaaviopuskurit

Syvyyspuskurissa on tarkoitus laskea jokaisen pikselin etäisyys kameran tarkastelu-

pisteestä. Tämä tapahtuu siten, että ensin piirretään objekteja käänteisessä etäisyys-

järjestyksessä kameraan, kaukaisin ensin periaatteella. Jokaisen piirrettävän pikselin

kohdalla tarkistetaan, että onko pikselin syvyyspuskurissa oleva vanha etäisyysar-

vo 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ä jatke-

taan kunnes koko kuva on piirretty valmiiksi [Rab05, s. 445-446]. Tekniikasta käyte-

tää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 bu�er) 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ä syvyyspus-

kuria 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-

Page 9: Gra ikka yleisesti tietokonepeleissä · 2006-02-22 · lähtökohdaksi on alittuv kolmiulotteiset tietokonepelit ja aihealueen laajuuden ja rajallisen sivumäärän vuoksi äsittelyk

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-gra�ikan 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 monimutkai-

sempia 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 ei-

vät ole tavallisia pisteitä avaruudessa, joilla on ainoastaan paikka (x,y,z). Vertek-

seillä 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ä mo-

nimutkaisemmat kappaleet koostuvat useista vierekkäisistä kolmioista. Esimerkiksi

nelikulmio koostuu kahdesta kolmiosta, jotka jakavat yhden sivun nelikulmion lävis-

täjällä. Suurempi suorakaide koostuu nelikulmioista ja niin edelleen. Kuvasta 2 huo-

maamme, että tällä tavoin muodostettavat kolmionauhat sisältävät paljon toistuvia

verteksejä eri kolmioita määritettäessä. Yksinkertaisin tapa tallentaa nuo nauhat oli-

si 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 kolmionau-

ha (triangle stip) ja kolmioviuhka (triangle fan) tallennusrakenteissa. Nämä ovat-

kin yleisimmät tallennusrakenteet juuri niiden tehokkuuden vuoksi. Kuvassa 3 on

kuvattuna nämä rakenteet sekä vielä erikoistapauksina viivalista (line list) ja viiva-

nauha (line strip), joilla voidaan kuvata tehokkaasti esimerkiksi tekoälyn ja pelin

Page 10: Gra ikka yleisesti tietokonepeleissä · 2006-02-22 · lähtökohdaksi on alittuv kolmiulotteiset tietokonepelit ja aihealueen laajuuden ja rajallisen sivumäärän vuoksi äsittelyk

6

muiden rakenteiden tarvitsemia tietoja gra�ikan 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 ih-

misten kasvoja. Kolmioviuhka vastaavasti kuvaa myötäpäivää kiertäen kolmiot siten,

että edellisen kolmion viimeinen verteksi on seuraavan kolmion ensimmäinen vertek-

si. Tämä menetelmä on myös varsin tehokas ja kuten kuvasta 3 voi huomata niin

kolmen vierekkäisen kolmion kuvaaminen onnistuu kolmiolistassa yhdeksällä ver-

teksillä 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ä muo-

dostuneita monimutkaisia kolmirakenteita kutsutaan objektiverkoiksi (mesh). On

hieman ohjelmointirajapinnasta riippuvaista, mitä kaikkea määritetään objektiverk-

koon kuuluvaksi, mutta yleisesti rajaus tehdään geometrisiin rakenteisiin. Kuiten-

kin 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ö-

Page 11: Gra ikka yleisesti tietokonepeleissä · 2006-02-22 · lähtökohdaksi on alittuv kolmiulotteiset tietokonepelit ja aihealueen laajuuden ja rajallisen sivumäärän vuoksi äsittelyk

7

dyllistä pitää erillisinä maailma-koordinaattiavaruus (world space) sekä objektien

sisäinen avaruus (object space). Objektien verteksien topologiat on määritetty sisäi-

sessä 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äyt-

tävät, määrittävät niiden materiaalit. Materiaaleja voisi kuvata ryhmäksi erilaisia

määrityksiä kappaleen reagoimisesta valoon. Varjostimet (shader), tekstuurit ja hei-

jastuvuus kuuluvat lähes jokaiseen materiaalimääritykseen [WWJ05, s. 450]. Ma-

teriaalien 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äy-

tyy 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 punai-

nen, G on vihreä ja B on sininen. Lisäksi saatetaan käyttää A arvoa, joka tarkoittaa

Page 12: Gra ikka yleisesti tietokonepeleissä · 2006-02-22 · lähtökohdaksi on alittuv kolmiulotteiset tietokonepelit ja aihealueen laajuuden ja rajallisen sivumäärän vuoksi äsittelyk

8

läpinäkyvyyttä (alpha). Varjostin ohjelmat saattavat muuttaa näitä arvoja varsin

vapaasti tai jopa vaihtaa käyttötarkoituksia tarpeidensa mukaisesti.

3.0.3 Varjostimet

Varjostimet ovat pieniä ohjelmia, jotka määrittävät miten kukin pikseli lopulta piir-

retään ruudulle. Ohjelmoitavat varjostinyksiköt yleistyivät tietokoneiden näytönoh-

jaimissa muutamia vuosia sitten. Sitä ennen kiinnitetty renderöintiliukuhihna huo-

lehti tästä aika automaattisesti. Ohjelmoitavia varjostimia käytetään varsin laajas-

ti esimerkiksi turkin, hiusten, veden sekä erilaisten tuliefektien aikaansaamiseksi

[WaL01, s. 463-470]. Uusimmat kehitelmät käyttävätkin näytönohjaimien gra�ikka-

tehoja myös pelien fysiikan mallintamiseen, mutta koska tämä on vielä hyvin harvi-

naista, 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ä reaaliaikai-

sesti. Reaalimaailmassa valon fotonit kimpoilevat esineistä ja silmä rekisteröi kaik-

ki 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 saapu-

vat verkkokalvolle hyödyntämällä käänteislaskentaa. Tällöin lasketaan valittu jouk-

ko fotoneja, jotka lähtevätkin silmästä ja katsotaan, miten ne kimpoilevat kappa-

leisiin ja minkä värin ne lopulta saavat. Näin ei tarvitse laskea liikkeitä fotoneille,

jotka eivät koskaan saavu verkkokalvolle. Radiositeettilaskelmat ovat tehtävissä tie-

tokoneella 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-

Page 13: Gra ikka yleisesti tietokonepeleissä · 2006-02-22 · lähtökohdaksi on alittuv kolmiulotteiset tietokonepelit ja aihealueen laajuuden ja rajallisen sivumäärän vuoksi äsittelyk

9

kaisesti, joten pelien reaaliaikainen valaistus tehdään simuloinneilla, jotka eivät to-

dellisuudessa ole kovin realistia. Seuraavissa kappaleissa käsittelen näitä tekniikoita

pinnallisesti.

4.0.5 Pistevalo

Pistevalo (point light) on perinteinen pelien valotekniikka. Siinä simuloidaan piste-

mäistä valonlähdettä siten, että valotuksen määrä vaihtelee arvovälillä [0,1]. Lasken-

nassa käytetään kaavaa, jossa pisteen valoisuus arvoa muutetaan sen mukaan, miten

kaukana se sijaitsee valonlähteestä: ilmentyvä väri = valonvari�valonkirkkausetaisyysvaloon2 [WWJ05,

s. 470-484]

4.0.6 Useat valon lähteet

On hieman ongelmallista, että jos 3D maailmassa on esimerkiksi 10 eri valonlähdet-

tä, niin kaikkien valonlähteiden valon laskeminen on liian raskasta tehdä reaaliaikai-

sesti. Onneksi usein riittää, että laskemme vain 1-4 eniten kohteeseen vaikuttavan

valon vaikutuksen. Usein valinta tehdään puhtaasti valon ja pinnan välisen etäisyys-

vektorin suhteen. Näiden pistevalojen lisäksi käytetään usein ympäristöä ympäröi-

vää 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 esi-

merkiksi radiositeettilaskennalla erilliselle valotuskartalle (lightmap). Valotuskart-

ta 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 tar-

koitettu staattisille valonlähteille. On kehitetty myös menetelmiä, joissa valosta tal-

lennetaan enemmänkin tietoa, mutta näiden ongelmana on valtava muistin käyttö,

aivan kuten perus valokarttatekniikoissakin.

Page 14: Gra ikka yleisesti tietokonepeleissä · 2006-02-22 · lähtökohdaksi on alittuv kolmiulotteiset tietokonepelit ja aihealueen laajuuden ja rajallisen sivumäärän vuoksi äsittelyk

10

5 Piirtoliukuhihna

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 toteutuk-

sen varassa, eikä sovellusohjelmoija voinut vaikuttaa liukuhihan toimintaan kovin-

kaan paljon. Nykyisin kuitenkin kaikki merkittävät näytönohjainvalmistajat tukevat

ohjelmoitavia pikselivarjostinyksiköitä ja sekä NVIDIA että ATI ovat tällä hetkel-

lä pikselivarjostimissaan versiossa 3.0. Jokainen uusi versio on lisännyt ohjelmoi-

tavuutta ja pidentänyt ohjelmointirajapintojen käskykantoja. Varjostinrajapintojen

kehityksessä myös pisimmän mahdollisen ohjelman tai aliohjelman pituus on perin-

teisesti kasvanut. Näin voidaan tehdä yhä monimutkaisempia varjostusohjelmia.

5.1.1 Piirtoliukuhihnat yleisesti

Piirtoliukuhihnan tehtävä on tuottaa kappaleiden vertekseistä ja niiden materiaa-

leista lopulliset kappaleet ruudulle. Tämä tapahtuu useassa osassa, eikä voida puhua

mistään tietystä piirtoliukuhihnasta, sillä toteutukset vaihtelevat paljon eri sovelluk-

sissa, 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 3D-

avaruudessa ja pyöritetään ja skaalataan oikeaan kokoonsa. Seuraava vaihe on kap-

paleiden 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 kap-

paleiden 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ää-

Page 15: Gra ikka yleisesti tietokonepeleissä · 2006-02-22 · lähtökohdaksi on alittuv kolmiulotteiset tietokonepelit ja aihealueen laajuuden ja rajallisen sivumäärän vuoksi äsittelyk

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 leikkausa-

varuudesta ruutuavaruuteen (screen space), jotta saadaan kolmiot mahtumaan ruu-

dulle [Rab05, s. 491-494]. Seuraavaksi vuorossa on rasterointi. Tässä vaiheessa sel-

vitetään, mihin pikseleihin kukin monikulmio muodostuu ruudulla. Lopulta pikse-

lit 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ä pik-

seleistä 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 gra�ikka on viimeisen kymmenen vuoden aikana kehittynyt 2D-

gra�ikasta 3D-gra�ikkaan. 3D-gra�ikan yleistymisen on mahdollistanut gra�ikka-

korttien huima kehitys.

Näytöllä näkyvä gra�ikka luetaan piirtopuskurista. 3D-gra�ikassa 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 syvyys-

puskuria.

Kolmiot ovat yleisimpiä alkeiskuvioita 3D-tietokonegra�ikassa, sillä kolmioilla on

useita todella hyviä ominaisuuksia. Ensinnäkin kolmiot ovat yksinkertaisimpia al-

keiskuvioita, jotka määrittävät pinnan avaruudessa. Myöskin kolmioiden päätepis-

Page 16: Gra ikka yleisesti tietokonepeleissä · 2006-02-22 · lähtökohdaksi on alittuv kolmiulotteiset tietokonepelit ja aihealueen laajuuden ja rajallisen sivumäärän vuoksi äsittelyk

12

teiden välisiä pisteitä on varsin helppo interpoloida ja kolmiot muodostavat helposti

monimutkaisempia kolmiulotteisia objekteja.

Objektiverkot koostuvat usein jostain kolmiorakenteesta. Yleisimmät kolmiraken-

teet, joilla objektiverkkoja kuvataan ovat kolmioviuhka ja kolmionauha. Nämä ra-

kenteet kuvaavat kappaleita hyvin tehokkaasti, mikä on tärkeää, sillä näitä raken-

teita 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äyt-

tä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 piir-

retään ruudulle. Ohjelmoitavat varjostinyksiköt yleistyivät tietokoneiden näytönoh-

jaimissa muutamia vuosia sitten. Sitä ennen kiinnitetty renderöintiliukuhihna huo-

lehti 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ä reaaliaikai-

sesti. 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 piste-

mäistä valonlähdettä siten, että valotuksen määrä vaihtelee arvovälillä [0,1]. Lasken-

nassa käytetään kaavaa, jossa pisteen valoisuusarvoa muutetaan sen mukaan, miten

Page 17: Gra ikka yleisesti tietokonepeleissä · 2006-02-22 · lähtökohdaksi on alittuv kolmiulotteiset tietokonepelit ja aihealueen laajuuden ja rajallisen sivumäärän vuoksi äsittelyk

13

kaukana se sijaitsee valonlähteestä. Pistevalon lisäksi käytetään yleensä yhtä yleis-

valoa. 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 niil-

lä on joitain yhteisiä ominaisuuksia, vaikka järjestykset saattavatkin vaihdella run-

saasti eri toteutuksissa. Prosessi on hyvin monivaiheinen ja sisältää paljon lasken-

taa. 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 Rabin, S., Introduction to Game Development. Charles River Media,

Hingham, Massachusetts, 2005.

WaL01 Walsh, P. ja A., L., The Zen of Direct3D Game Programming. Prima

Publishing, Roseville, California 95661, 2001.

WWJ05 Walker, J., C., W. ja J., K., Making A Game Demo From Concept to

Demo Gold. Woldware Publishing Inc.

Page 18: Gra ikka yleisesti tietokonepeleissä · 2006-02-22 · lähtökohdaksi on alittuv kolmiulotteiset tietokonepelit ja aihealueen laajuuden ja rajallisen sivumäärän vuoksi äsittelyk

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

Page 19: Gra ikka yleisesti tietokonepeleissä · 2006-02-22 · lähtökohdaksi on alittuv kolmiulotteiset tietokonepelit ja aihealueen laajuuden ja rajallisen sivumäärän vuoksi äsittelyk

Kuva 2: Yksinkertainen kolmionauha, jolla voidaan muodostaa monimutkaisempiakappaleita [WaL01, s. 425].

Kuva 3: Kuvattuna erilaisia alkeiskappaleiden tallennusrakenteita (vasemmalta oi-kealle): kolmiolista, kolmioviuhka, kolmionauha, viivalista ja viivanauha [WWJ05,s. 459-463].