Säteenseuraajarenderöijän implementointi ja optimointi
|
|
- Aune Lehtinen
- 8 vuotta sitten
- Katselukertoja:
Transkriptio
1 Olli Koskinen Säteenseuraajarenderöijän implementointi ja optimointi Metropolia Ammattikorkeakoulu Insinööri (AMK) Tietotekniikka Insinöörityö
2 Tiivistelmä Tekijä(t) Otsikko Sivumäärä Aika Olli Koskinen Säteenseuraajarenderöijän implementointi ja optimointi 29 sivua + 1 liitettä Tutkinto insinööri (AMK) Koulutusohjelma Tietotekniikan koulutusohjelma Suuntautumisvaihtoehto Ohjelmistotekniikka Ohjaaja(t) Miikka Mäki-Uuro, lehtori Juha Kopu, lehtori Tämän insinöörityön tavoitteena oli syventyä säteenseuraajarenderöinnin teoriaan, sen toteutukseen ja optimointiin. Säteenseuranta on apuväline, jolla voidaan projisoida 3D-maailma 2D-kuvaksi. Työn toteutukseen käytettiin NVIDIA:n rinnakkaislaskentaa varten kehitettyä CUDA-ohjelmointikieltä. Työn pääpaino oli näytönohjaimella tehtävän rinnakkaislaskennan haasteissa sekä säteen/kolmion törmäystarkistuksen toteutuksessa. Työn alussa kerrotaan säteenseurannan teoriasta. Tämän jälkeen kerrotaan teoriaa eri rajapinnoista, joita on käytetty työssä säteenseurantarenderöijän toteuttamiseen. Työn toteutusosassa käydään läpi koodiesimerkein säteenseurantarenderöijän implementointi. Työn lopussa perehdytään säteenseurannassa yleisimmin käytettyihin optimointitekniikoihin. Näitä tekniikoita ovat mm. kiihdytystietorakenteet ja eri muistityyppien käyttäminen. Työn tekijän hypoteesina oli, että noin satatuhatta kolmiota sisältävän 3D-mallin piirtäminen saataisiin reaaliaikaiseksi optimoidulla säteenseurantarenderöijällä. Aiheesta löytyi runsaasti kirjallisuutta ja sen avulla sai koottua kattavan tietopaketin asiasta kiinnostuneille. Samalla opin paljon säteenseurannan teoriasta ja toteutuksesta, sekä näytönohjaimen ohjelmoimisesta CUDA:lla. Optimoinnin osalta saatiin kerättyä paljon tietoa teoriasta, mutta käytännön toteutus vaatii vielä jatkokehitystä. Uskon, että opinnäytetyöni toimii hyvänä tiedonlähteenä säteenseurantarenderöijän ja CUDA:n käytöstä kiinnostuneille. Säteenseuranta, CUDA, Renderöinti
3 Abstract Author(s) Title Number of Pages Date Olli Koskinen Implementation and Optimization of Ray Tracer Renderer 29 pages + 1 appendices 10 May 2014 Degree Bachelor of Engineering Degree Programme Information Technology Specialisation option Software Engineering Instructor(s) Miikka Mäki-Uuro, senior lecturer Juha Kopu, senior lecturer The aim of the study was to find out about the theory, implementation and optimization of ray tracer renderer. Ray tracing is a tool for projecting 3D-world to 2D-image. The implementation of the ray tracer renderer was done with NVIDIA s parallel computing architecture CUDA. The main challenge in the study were the problems of parallel execution of code and the implementation of ray/triangle intersection. The study starts with the theory of ray tracing. After this, different interfaces used in the implementation of the ray tracer are introduced. In the implementation part of the study, certain code examples for the basic ray tracer are explained. In the end, a few basic concepts for optimizing the ray tracer renderer are introduced e.g. accelerator data structures and using different memory architecture for storing data. The hypothesis of the study was that an optimized ray tracer renderer should achieve approximately real time rendering speed with a 3D-model that has 100k triangles. There are quite a lot of studies and literature about the topic and therefore a rather comprehensive package for anyone interested could be gathered. The study serves as a good beginner level guide to ray tracing and CUDA programming. Ray tracing, CUDA, Rendering
4 Sisällys Lyhenteet 1 Johdanto 1 2 Renderöintitekniikat Yleistä Säteenseuranta ja rasterointi 2 3 Ohjelmointirajapinnat OpenGL CUDA CUDA-arkkitehtuuri Kernel -funktiot CUDA:n ja OpenGL:n yheistyö 9 4 Renderöijän implementointi Säteenseuraajan kernel-funktio Kolmion törmäystarkistus Wavefront OBJ -tiedoston lataus Mallien sävytys 19 5 Optimointi Bounding Volume Hierarchy CUDA Texture Memory 24 6 Pohdinta 25 Lähteet 27 Liitteet Möller-Trumbore-kolmion törmäystarkistus näytönohjaimella.
5 Lyhenteet Renderöinti Kuvan luominen malleista tietokoneohjelman avustuksella. Ray tracing Säteenseuranta, kuvantamistekniikka, jossa 3D-maailma projisoidaan näytölle katsojan näkökulmasta säteiden avulla. Säde Jana kamerasta ulospäin, jonka avulla tarkistetaan, onko ruudulla näkyviä malleja. OpenGL Open Graphics Library, avoin grafiikkakirjasto. Käytetään yksinkertaistamaan grafiikan piirtämistä ruudulle. CUDA Compute Unified Device Architecture, NVIDIA:n kehittämä C-ohjelmointikielen kaltainen näytönohjainten ohjelmointirajapinta. SM Streaming Multiprocessor, näytönohjaimen osa, joka sisältää CUDA-ytimiä, käytettiin Tesla- ja Fermi-arkkitehtuurissa. SMX Next Generation Streaming Multiprocessor, uudistettu SM Kepler -arkkitehtuurissa. PTX Parallel Thread execution, pseudo Assembly, jonka näytönohjaimen ajuri kääntää binääriksi ennen suoritusta. Kernel Ydin, näytönohjaimella rinnakkain suoritettava ohjelma, joka on kirjoitettu C-, C++ tai Fortran-ohjelmointikielillä. Pikseli Suorakulmion muotoinen kuvan osa, jonka koko on suoraan verrannollinen kuvan resoluutioon. Tunnetaan myös kuvapisteenä. PBO Pixel Buffer Object, näytönohjaimen muistissa sijaitseva pikselipuskuri, johon tallennetaan pikseleitä näyttämistä varten. API Application Programming Interface, ohjelmointirajapinta. Assembly Matalan tason ohjelmointikieli.
6 1 1 Johdanto Tämän insinöörityön tavoitteena oli syventyä säteenseurantarenderöinnin teoriaan, toteutukseen ja optimointiin. Säteenseuranta on apuväline, jolla voidaan projisoida 3Dmaailma 2D-kuvaksi. Työn toteutukseen käytettiin NVIDIA:n rinnakkaislaskentaa varten kehitettyä CUDA-ohjelmointikieltä. Kiinnostuksen kohteena oli erityisesti CUDA:n rinnakkaislaskentaominaisuudet. Uskon, että näytönohjaimella tehty rinnakkaislaskenta tulee olemaan tärkeä osa tietotekniikan kehitystä. Henkilökohtaisena tavoitteenani oli oppia OpenGL:n, CUDA:n ja säteenseurannan perusteita. Työn pääpaino oli kuitenkin näytönohjaimella tehtävän rinnakkaislaskennan haasteissa sekä säteen/kolmion törmäystarkistuksen toteutuksessa. Työn alussa luvussa 2 kerrotaan säteenseurannan ja rasteroinnin teoriasta ja siitä, miten nämä tekniikat eroavat toisistaan. Luvussa 3 kerrotaan OpenGL- ja CUDA-rajapinnoista, joita käytetään työssäni säteenseurantarenderöijän toteuttamiseen. Luvussa 3.1 tutustutaan pintapuolisesti OpenGL:n teoriaan. Luku 3.2 käsittelee CUDA:n arkkitehtuuria, yleistä kernel-funktioista ja CUDA:n yhteistyötä OpenGL:n kanssa. Luvussa 4 tutustutaan koodiesimerkein säteenseurantarenderöijän implementointiin. Tässä luvussa perehdytään tarkemmin mm. säteenseuranta CUDA kernel -funktioon, kolmion törmäystarkistukseen, 3D-mallien lataamiseen muistiin ja 3D-mallien sävytykseen. Luvussa 5 perehdytään säteenseurannassa yleisimmin käytettyihin optimointitekniikoihin. Näitä ovat mm. kiihdytystietorakenteet ja eri muistityyppien käyttäminen. Kiihdytystietorakenteista käsitellään Bounding Volume Hierarchya (BVH). Luvun lopussa tutustutaan Texture Memoryn käyttöön ohjelman suorituksen nopeuttamisessa. Luvussa 6 pohditaan säteenseurantarenderöijän implementoinnin onnistumista ja haasteita. Pohdintaosuudessa otetaan myös kantaa jatkokehittelymahdollisuuksiin sekä siihen mitä olisi voitu tehty toisin. Työn hypoteesina oli, että noin satatuhatta kolmiota sisältävän 3D-mallin piirtäminen saataisiin reaaliaikaiseksi optimoidulla säteenseuranta-
7 2 renderöijällä. Tässä reaaliaikaisella tarkoitetaan vähintään 24 ruutua sekunnissa. Hypoteesini perustuu edeltäviin tutkimuksiin, joiden mukaan puuhierarkian käyttö nopeuttaa huomattavasti säteenseurantarenderöijän suorituskykyä [16]. Uskon, että opinnäytetyöni toimii hyvänä tiedonlähteenä säteenseurantarenderöijän ja CUDA:n käytöstä kiinnostuneille. 2 Renderöintitekniikat 2.1 Yleistä Yksi tietokonegrafiikan päätavoitteesta on realistisen kuvan piirtäminen. Tavoite pyritään saavuttamaan vertaamalla ympäröivää fysikaalista maailmaa tämän hetken edistyneimpiin tietokoneilla luotuihin kuviin. Havaitut puutteet tietokoneella luodussa kuvassa pyritään ratkaisemaan tutkimalla fysikaalisia ilmiöitä. Tietokonegrafiikan alkuhetkillä kuvaa saatiin paranneltua nopeasti. Näihin parannuksiin kuuluvat monet, nykyään jo standardina olevat tekniikat kuten objektin valonläpäisevyys, pintojen valontaittokyky ja heijastavuus. [9.] Säteenseuraajarendereröijä pyrkii havainnollistamaan valonlähteen ja havaitsijan välillä kulkevia säteitä. Tarkasteltavan kohteen väri määräytyy pohjamateriaalin väristä ja potentiaalisista valon absorboitumisesta ja heijastumisesta. 2.2 Säteenseuranta ja rasterointi Säteenseuranta ja rasterointi ovat renderöintitekniikoita. Säteenseuranta on apuväline, jolla voidaan projisoida 3D-maailmaa 2D-kuvaksi. Kun halutaan piirtää 2D-projektio 3Dmaailmasta mahdollisimman realistisesti, täytyy pystyä laskemaan, kuinka paljon valoa kukin pikseli vastaanottaa [10]. Säteenseurannan metodien sanotaan saaneen alkunsa fysiikan kirjallisuudesta, jossa tutkittiin valon kulkemista linssien läpi. Linssejä suunniteltaessa fyysikot piirsivät usein säteen valon lähteestä linssin läpi. Tätä prosessia kutsuttiin säteenseurannaksi. [9.] Tällä hetkellä rasterointi on kuitenkin yleisin apuväline esitettäessä 3D-maailmaa 2Dkuvana ja sitä varten on suunniteltu suurin osa tällä hetkellä markkinoilla olevista näytönohjaimista. Fundamentaalinen ero säteenseurannan ja rasteroinnin välillä on seuraavanlainen: säteenseurantarenderöinnissä valitaan yksi pikseli kerrallaan, josta
8 3 sitten ammutaan säde kohti kaikkia muistissa olevia geometrisiä objekteja (kuva 1), kun taas rasteroinnissa valitaan yksi kolmio, jonka 3D-koordinaatit pyritään muuttamaan ruudun 2D-koordinaateiksi ja näin sovittamaan ruutuun (kuva 2). Kuva 1. Säteenseurannan perusperiaate. [25] Pseudokoodina ajateltuna säteenseurannan uloin silmukka käy läpi pikselin yksi kerrallaan, kun rasteroinnissa uloimmassa silmukassa tutkittaisiin esimerkiksi kolmioita. Kuva 2. Rasteroinnin peruskäsite. [24]
9 4 Vaikka molemmat renderöintitekniikat ovat olleet käytössä jo 1960-luvulla, rasterointi yleistyi näytönohjaimissa, koska sen avulla voitiin toteuttaa isompia 3D-malleja käyttämällä säteenseurantatekniikkaa vähemmän muistia. Reaaliaikaisen suorituskyvyn parantamisen nimissä hyväksyttiin, että valon realistinen simulointi ei olisi mahdollista. Realistisen valon simuloinnin sijasta käytettiin approksimaatiotekniikoita, joilla päästiin tyydyttävään lopputulokseen. Säteenseuranta soveltuu kuitenkin approksimaatiotekniikoita paremmin valon realistiseen simulointiin. Säteenseurantaa toteutettaessa tulee mieleen, onko prosessia mahdollista optimoida ampumalla säde kaikista pikseleistä samaan aikaan? Juuri tähän kysymykseen otetaan kantaa työssäni. 3 Ohjelmointirajapinnat Ohjelmointirajapinnalla tarkoitetaan tässä työssä kahta eri koodikirjastoa, joiden avulla näytönohjaimella voidaan suorittaa sekä laskentaa että graafisia toimintoja, kuten näytölle piirtämistä. OpenGL- ja CUDA-rajapinnoista, joita käytetään säteenseurantarenderöijän toteuttamiseen. Luvussa 3.1 tutustutaan pintapuolisesti OpenGL:n teoriaan. Luku 3.2 käsittelee CUDA:n arkkitehtuuria, yleistä kernel-funktioista ja CUDA:n yhteistyötä OpenGL:n kanssa. 3.1 OpenGL OpenGL on alustariippumaton API-spesifikaatio tietokonegrafiikan renderöintiä varten [7]. Alustariippumattomuuden takia OpenGL-implementaatiot toimivat monen eri valmistajan näytönohjaimella nyt ja tulevaisuudessa. Moderni OpenGL-spesifikaatio toteuttaa ainoastaan grafiikan renderöinnin, mutta se ei määrittele mitään animointiin, ajoituksiin, tiedosto-operaatioihin, graafisiin käyttöliittymiin tai siirto-operaatioihin liittyvää [8]. Työssäni oli käytössä OpenGL:n lisäksi SDL-apukirjastoa ikkunointiin sekä syötteiden käsittelyyn. Tämän lisäksi työssä käytettiin myös GLEW-apukirjasto, jotta Windows- ja Unix-pohjaisia käyttöjärjestelmiä voitaisiin tukea ilman lisävaivaa. Työtä aloittaessani en aivan ymmärtänyt kuinka vähän loppujen lopuksi tarvitsisin itse OpenGL:n toimintoja. Työssäni ei tarvittu OpenGL:n shadereita, vaan ohjelmoijan tuli ainoastaan tarjota CUDA:lle pikselipuskuri, johon tulisi kirjoittaa pikselien väriarvot ja tämän jälkeen piirtää
10 5 kyseinen puskuri ruudulle. Asiaa käsitellään tarkemmin osiossa CUDA:n ja OpenGL:n yheistyö. 3.2 CUDA CUDA-arkkitehtuuri Compute Unified Device Architecture on NVIDIA:n kehittämä C-ohjelmointikielen kaltainen näytönohjainten rajapinta, jonka avulla voidaan ajaa rinnakkain funktioita monella eri säikeellä [21]. Nicholas Wilt (2013) kertoo kirjassaan The Cuda Handbook näytönohjaimella rinnakkain suoritettavista funktioista, joita kutsutaan CUDA:ssa kernel-funktioiksi. Kerneleitä ajetaan joko ohjelmoijan tai kääntäjän järjestämissä ruudukoissa ( grids ) jotka taas koostuvat säieblokeista ( thread blocks ) (kuva 3). [1.] Kuva 3. CUDA-säie- ja muistihierarkia. [3]
11 6 Jokainen säie yhdessä säieblokissa suorittaa instanssin kernel-funktiosta. Tähän säikeeseen assosioidaan myös yksilöllinen säie- ja blokki-id, rekistereitä, säiekohtainen muisti ( per-thread private memory ), funktion parametrit ( inputs ) ja laskennan tulokset ( output results ). Säie- ja blokki-id:hin voidaan kernel-funktion sisällä viitata niille varatuilla avainsanoilla. Lisää säie- ja blokki-id:stä kerrotaan luvussa 4.1 Säteenseuranta kernel -funktio. Yhden säieblokin säikeet voivat kommunikoida vain saman blokin säikeiden kanssa käyttämällä hyväksi blokin jaettua muistia ( per-block Shared Memory ). Jokaisen globaalin kernel-funktion synkronisoinnin jälkeen ( kernel-wide global synchronization ) blokit kommunikoivat keskenään globaalin muistin välityksellä ( per-application Context Global Memory ). Kaikki tämä yhdistyy NVIDIA:n uusimpien näytönohjainten Kepler-arkkitehtuurin SMX-yksikössä, jossa voidaan suorittaa 2048 rinnakkaista säiettä. [1.] CUDA kääntäjä (NVCC) pitää huolen siitä, että.cu -päätteiset tiedostot jaetaan kahteen osaan heti käännösvaiheessa. Tiedostosta erotellaan näytönohjaimella ja prosessorilla ajettava koodi, jonka jälkeen kummatkin osat käännetään erikseen (kuva 4). Prosessorilla ajettava koodi käännetään omaan omaksi suoritettavaksi ohjelmakseen, ja CUDA käännetään niin sanotuksi PTX pseudo Assemblyksi, joka lisätään juuri luotuun suoritettavaan ohjelmaan merkkijonona. Vasta näytönohjaimen ajuri kääntää PTX:n binääriksi. Näin varmistutaan, että CUDA-ohjelmat toimivat myös tulevaisuudessa julkaistavilla näytönohjaimilla. [1.]
12 7 Kuva 4. CUDA-käännösprosessi. [1] Juuri ennen ohjelman suoritusta näytönohjaimen ajuri kääntää itse PTX:n binääriksi. Tämän ansiosta konekäskyt ovat aina ajan tasalla, vaikka kyseistä näytönohjainta ei olisi ollut olemassa vielä ohjelmaa kirjoitettaessa. [1.] Kernel -funktiot NVIDIA on toteuttanut CUDA kernel -funktioiden ohjelmoinnin käyttäen C-,C++- tai Fortran-ohjelmointikieliä. C- ja C++-kielien tuet ovat melko kattavat, ja NVIDIA pyrkii joka CUDA-version mukana laajentamaan tukea entistä enemmän. Pieniä eroja kuitenkin on, esimerkiksi itse CUDA kernel -funktion kutsuminen tapahtuu NVIDIA:n itsensä lisäämällä laajennuksella, jossa käytetään erisuuruusmerkkejä (koodiesimerkki 1). Koodiesimerkki 1. CUDA kernel -funktiokutsun syntaksi. Funktion nimen jälkeen tulevat erisuuruusmerkit sulkevat sisäänsä kaksi parametria, joista ensimmäinen muuttuja määrää, montako säieblokkia ohjelmamme suorittaa, ja toinen parametri määrittää säikeiden määrän säieblokkia kohden. Esimerkiksi jos blocks
13 8 -muuttujan arvo on 1 ja threads -muuttujan arvo on 10, suoritamme tällöin vain 10 rinnakkaista säiettä. Kernel-funktioiden määritteleminen tapahtuu muuten samalla tavalla kuin C++:ssa, mutta funktion palautusarvon tyypin eteen lisätään global -avainsana (koodiesimerkki 2). Myös seuraavat avainsanat ovat käytössä CUDA-funktioiden kanssa; device ja host. Device-avainsana määrittelee funktion, jota voidaan kutsua kernel-funktion sisältä, jolloin se suoritetaan vain näytönohjaimella. Host-avainsanalla tarkoitetaan tietokoneen prosessorilla ajettavaa funktiota. Nämä kaksi avainsanaa voidaan myös yhdistää funktiokutsussa, jolloin funktiota voidaan käyttää sekä tietokoneen prosessorilla että näytönohjaimella. Koodiesimerkki 2. CUDA kernel -funktion määrittely. CUDA-koodi kirjoitetaan erilliseen.cu -päätteiseen tiedostoon, joka saa sisältää sekä tavallista C-, C++-, Fortran- että CUDA-koodia. Kernel-funktiot voivat hyödyntää prosessorin tuottamaa dataa varaamalla ensin tarpeeksi muistia näytönohjaimelta, siirtämällä tarvittava datan käyttäen muistin kopiointia ( memcopy ) ja antamalla tämän jälkeen kernerille osoitin tähän juuri varattuun muistiin (koodiesimerkki 3). Koodiesimerkki 3. Muistin varaus ja siirto näytönohjaimelle. Koodiesimerkki 3:ssa esiteltyä osoitinta s voidaan käyttää viittaamaan näytönohjaimen muistissa sijaitsevaan dataan, kuten koodiesimerkki 2:ssa on tehty. Erityisesti tulisi kiinnittää huomiota CUDA:n omiin malloc- ja memcopy-funktioihin, joilla tehdään muistin varaus ja siirto näytönohjaimelle.
14 9 3.3 CUDA:n ja OpenGL:n yheistyö CUDA:n ja OpenGL:n yheistyöllä (Graphics Interoperability tai graphics interop ) tarkoitetaan toiminnallisuutta, jossa CUDA kernel -funktiot kirjoittavat dataa näytönohjaimen muistissa sijaitseviin OpenGL:n tietorakenteisiin, joita käytetään grafiikan piirtämiseen. Tämän yhteistyön ansiosta tietokoneen ei tarvitse tehdä prosessorin ja näytönohjaimen välillä hidasta muistin kopiointia PCI-E -väylän kautta. [1.] Tämä on tärkeää ohjelman suorituskyvyn kannalta, sillä näytönohjaimen sisäisen muistin siirtonopeus on parhaimmillaan G/s [3], kun taas PCI-E-väylä harvoin ylittää 8G/s-nopeutta [4]. Näytönohjaimen ja OpenGL:n ajurit voivat koordinoida toimintaansa paremmin (koodiesimerkki 4), jos heti ohjelman alustusvaiheessa tehdään selväksi, että käytetään graphics interop -toimintoa. Koodiesimerkki 4. CUDA:n ja OpenGL:n yhteistyön alustaminen. Yhteistyön alustamisen jälkeen ohjelmoijan tulee varata Pixel Buffer Object (PBO) kernel -funktion ajon ajaksi CUDA:n käyttöön (koodiesimerkki 5). Jos OpenGL yrittää päästä käsiksi CUDA:lle varattuun resurssiin, seuraukset ovat arvaamattomat. Kun CUDA varaa PBO:n, cudagraphicsmapresources()-funktio varmistaa, että kaikki OpenGL -grafiikkakutsut on suoritettu loppuun asti ennen lopullista varausta [6].
15 10 Koodiesimerkki 5. CUDA-ja OpenGL-yhteistyö, grafiikkaresurssien varaaminen. 4 Renderöijän implementointi Työn toteutusosan tarkoituksena oli implementoida säteenseurantarenderöijä käyttämällä CUDA- ja OpenGL-rajapintoja. Toteutus alkoi määrittelemällä näytönohjaimella suoritettava säteenseuraajan kernel-funktio. Kernel-funktion määrittelyn jälkeen implementoitiin säteenseurannassa käytettävä kolmioiden törmäystarkistus, jonka jälkeen ladataan 3D-malli muistiin. Lopuksi malli sävytetään käyttäen Lambertian diffuse -funktiota. 4.1 Säteenseuraajan kernel-funktio Säteenseuranta koostuu yhdestä pääfunktiosta nimeltä raytrace (käsitelty aikaisemmin koodiesimerkissä 2, luku 3.2.2). Tämä kernel-funktio ottaa vastaan ensimmäisenä parametrina osoittimen OpenGL:n alustamaan PBO:iin, johon lopuksi kirjoitetaan tarvittavat väritiedot kuvaa varten. Kernel-funktion toinen parametri on osoitin taulukkoon, joka sisältää Object-luokan olioita. Kolmas parametri on renderöitävien kolmioiden lukumäärä.
16 11 Jokaisella säikeellä ja säieblokilla on oma uniikki id, jonka ansiosta funktiossa ensimmäisenä voidaan laskea ammuttavan säteen ja pikselin x- ja y-koordinaatit. Tässä laskennassa hyödynnetään säikeen ja säieblokin omaa numerointia (koodiesimerkki 6). Koodiesimerkki 6. Lasketaan säteen aloituskoordinaatit. Koordinaattien laskennan suorittamisen jälkeen voidaan lasketut pisteet keskittää niin, että origo on aina keskellä ruutua (koodiesimerkki 7). Koodiesimerkki 7. Säteiden keskittäminen. Koska työn toteutuksessa käytetään suorakulmaista perspektiiviä ( orthogonal perspective ), ja kamera on toistaiseksi kiinnitetty yhteen paikkaan avaruudessa, voidaan mielivaltaisesti määrittää säteiden z-komponentin kulkemaan z-akselilla aina negatiiviseen suuntaan. Täten kamera katsoo aina negatiivista z-akselia pitkin siten, että x-akseli on vaakasuorassa ja y-akseli pystysuorassa.
17 12 Säteenseuraajan pääsilmukka on loppujen lopuksi hyvin yksinkertainen. Pääsilmukassa käydään läpi kaikki geometriset objektit ja tarkistetaan, osuuko kyseessä oleva säde objektiin. Osuman tapahtuessa tallennetaan säteen ja kolmion törmäyskohdan väri talteen. Object-tietorakenteeseen kuuluu materiaalien määrittely, josta voidaan päätellä osumakohdan väri ennen varjojen tai muiden efektien laskemista. Pikselin lopullinen väri voidaan määritellä annettujen olosuhteiden mukaan, jos maailmassa on valoja, tulisi tässä kohtaa laskea potentiaaliset varjo- ja heijastus-kohdat. Sama prosessi käydään läpi jokaiselle kolmiolle. Vain kameraa lähimpänä oleva osumakohta tallennetaan piirtämistä varten (koodiesimerkki 8). Koodiesimerkki 8. Säteenseuraajan kernel-funktion pääsilmukka törmäyksien tarkistusta varten.
18 13 Tällä saadaan esiin objektien asettuminen toisiinsa nähden syvyyssuunnassa (kuva 5). Kuva 5. Tallennetaan vain viimeisen osumakohdan väri, jotta objektien syvyyserot näkyisivät kuvassa. Kun varmistutaan, että juuri kyseessä olevan pikselin takana on jokin objekti, voidaan tarpeen tullessa ampua uusi säde esimerkiksi heijastuksien laskemiseksi (koodiesimerkki 9). Jos mallin lisäksi avaruudessa ei ole erillistä valonlähdettä, voi maailma näyttää liian tasaiselta (valo jakautuu tasaisesti mallin pinnalle), eikä monimutkaisia muotoja voida erottaa mallin pinnalla. Tämä ongelma voidaan ratkaista kolmioiden sävytyksellä. Olen alustavasti toteuttanut sävytyksen käyttämällä Lambertin kosinilakia [11]. Lambertin kosinilain avulla pikselin väri voidaan tallentaa OpenGL:n tarjoamaan PBOobjektiin piirtämistä varten. Koodiesimerkki 9. Lasketaan heijastus ja sävytys. Tallennetaan väritieto PBO:hon.
19 14 PBO voidaan piirtää heti kun säteenseurantaan käytetty kernel-funktio on palauttanut suorituksen prosessorille. Säteenseurantaan käytetty kernel-funktion debuggaus ei ollut niin yksinkertaista. Yksi suurimmista ongelmista oli itse kernel-funktion suoritusaika. Windows-käyttöjärjestelmään on määritelty, että näytönohjain saa suorittaa oletuksena maksimissaan 2 sekuntia kerrallaan, ennen kuin Windows keskeyttää suorituksen ja käynnistää näytönohjaimen ajurit uudelleen ( TDR, Timeout Detection and Recovery) [1; 12]. Tilanne on hankala varsinkin, kun kernel-funktioni pyörii ilman optimointeja ja debugprofiililla noin s ajan. Jopa release-profiililla suoritus kestää 5 20 s ajan. Tämä oli mahdollista kiertää muuttamalla TDR -aikaa korkeammaksi. Huono puoli tässä on se, että tietokone on toimintakyvytön niin kauan, kunnes kernel-funktion suoritus on saatu loppuun. 4.2 Kolmion törmäystarkistus Olen valinnut työhöni kolmion törmäystarkistukseksi yhden tämän hetken parhaimmista algoritmeista nimeltään Möller-Trumbore: Fast, Minimum Storage Ray/Triangle intersection [13; 14; 15]. Useat kolmion ja säteen törmäystarkistusalgoritmit käyttävät laskuihin tason kaavoja. Möller-Trumbore ei näin tee, ja tästä syystä sen käyttö vie hieman vähemmän muistia. Ainoastaan kolmion kulmapisteet säilötään muistissa, jolloin saadaan parhaimmillaan 50 % muistisäästöt [13]. Möller-Trumbore onkin siis erinomainen kompromissi muistin ja nopeuden kannalta. Törmäystarkistusalgoritmit perinteisesti laskevat, osuuko säde tasolle, jolla itse kolmio sijaitsee, ja vasta tämän jälkeen, osuuko säde kolmion rajaaman alueen sisälle [13]. Möller-Trumboren tekniikassa kolmion kärki asetetaan origoon, ja muut kärkipisteet esitetään y- ja z-akseleilla yksikkövektoreina. Samalla myös säde käännetään kulkemaan x-akselin suuntaisesti. Voimme esittää säteen kaavalla 1. R(t) = O + td (1)
20 15 Kaavassa O on säteen alkupiste ( Origin ), t on säteen pituus ja D säteen suunta ( Direction ). Tämän yhtälön avulla voidaan esittää säteen osumakohta barysentrisillä koordinaateilla (u,v), koska piste T(u,v) kolmiolla saadaan kaavasta 2, jossa V 0, V 1 ja V 2 ovat kolmion kärkipistevektorit (kaava 2). T(u, v) = (1 u v)v 0 + uv 1 + vv 2 (2) Kaavassa u ja v ovat barysentrisiä koordinaatteja, joiden arvo vaihtelee välillä u 0, v 0 ja u + v 1. Törmäyspisteen barysentrisiä koordinaatteja hyödynnetään myös teksturoimiseen. Säteen, R(t), ja kolmion, T(u,v), törmäyspiste saadaan seuraavasti: R(t) = T(u,v), josta saadaan kaava 3. O + td = (1 u v)v 0 + uv 1 + vv 2 (3) Järjestämällä termit uudelleen saadaan kaava 4. t [ D, V 1 V 0, V 2 V 0 ] [ u] = O V 0 v (4) Kaavasta 4 nähdään, että barysentriset koordinaatit (u,v) ja etäisyys (t) säteen lähtöpaikasta törmäyskohtaan saadaan ratkomalla lineaarinen yhtälöryhmä (kaava 4).
21 16 Merkitsemällä M = [ D, V 1 V 0, V 2 V 0 ] saadaan algoritmista kuvan 6 tapainen esitys (kuva 6). Kuva 6. Kolmion pingottaminen y- ja z-akseleille. Säde O suuntaan D käännetään x-akselin suuntaisesti. (Kuva muokattu Möller-Trumbore -työn mukaan [13]) Implementaatiooni Möller-Trumbore-algoritmistä voi tutustua liitteessä Wavefront OBJ -tiedoston lataus Lopputyöni aiheena oli implementoida säteenseurantarenderöijä, joten en nähnyt tarpeelliseksi lähteä itse implementoimaan 3D-mallien lataamista. Sen sijaan päädyin käyttämään mahdollisimman yksinkertaistettua latauskirjastoa. Kirjaston nimi on Tiny obj loader, jonka päämäärä on yksinkertainen: yhden tiedoston obj-lataus muistiin mahdollisimman tehokkaasti [22]. Kirjasto on toteutettu käyttämällä ainoastaan C++-standardikirjastoa. Työtä varten oli toteutettu oma tietorakenne kolmion esittämistä varten, koska kolmioiden törmäystestaus aloitettiin ennen 3D-mallien latausta. Tästä aiheutui, että jouduin ensin lataamaan OBJ-tiedostot tietokoneen muistiin käyttäen Tiny obj loaderia, jonka jälkeen ladattu data täytyi muuttaa käyttämääni muotoon. OBJ-tiedostoilla mallinnetaan 3D-objektia käyttämällä sen kulmapisteitä. OBJ-spesifikaatio on pelkistettynä seuraavan lainen: Data esitetään ASCII-muotoisena tekstitiedostona. Kommenttirivit alkavat risuaidalla (#).
22 17 Jokainen kulmapiste rivi alkaa kirjaimella v ( Vertex ). Kolmion/monikulmion pintaa kuvataan f-kirjaimella ( Face ). OBJ-tiedostossa jokainen viittaus kulmapisteisiin indeksoidaan alkaen numerosta 1 (kuva 7). Kuva 7. Pelkistetty Wavefront OBJ -tiedosto. Kolmion pinta kuvataan kolmen kärkipisteen avulla. Käyttäessäni Tiny obj loader -kirjastoa ongelmaksi muodostui, että kirjasto ei aivan noudattanut OBJ-tiedostospesifikaatioita, vaan latasi tiedot niin, että indeksointi alkoi yhden sijaan nollasta. Tiedostoa ladatessani oletin, että käyttämäni Tiny obj loader -kirjasto noudattaisi OBJ-tiedostospesifikaatiota, vaikka myöhemmin selvisi, ettei näin ollutkaan. Toinen ongelma tiedostojen lataamisessa oli oma virheellinen käsitys pintojen indeksoinnista. OBJ -spesifikaation mukaan pintamäärittelyt (f-rivit) eivät välttämättä viittaa kulmapisteisiin täysin lineaarisessa järjestyksessä vaan esimerkiksi pinta saattaa muodostua aivan satunnaisista kulmapisteistä. Naiivi tapa yrittää ladata kaikki kulmapisteet järjestyksessä ei siis aivan toiminut. Lähdin selvittämään ongelmia kirjoittamalla datakonversion uudelleen ottaen huomioon kaksi edellä mainittua ongelmaa (koodiesimerkki 10).
23 18 Koodiesimerkki 10. Konvertoidaan Tiny obj loader -kirjaston lataama data yhteensopivaksi renderöijän kanssa kolmion kärkipisteiden eri indeksien järjestyksestä välittämättä. Ongelman korjauksen jälkeen selvisi, että osa kolmion kärkipisteistä skaalautui väärin (kuva 8). Tätä ei näkynyt vielä alkuperäisessä muutaman kolmion testimallissani, jonka olin kovakoodannut mukaan ohjelman alustukseen. Monistin tämän testimallin omaan OBJ -tiedostoon, jonka latauduttua selvisi, että ammuttu säde ei kulje aivan z-komponentin suuntaisesti niin kuin oli tarkoitus. Ongelma ilmeni säteen suuntavektorin z-komponentin ollessa pienempi kuin -1. Kuvassa tämä näkyi kärkipisteiden skaalautumisena virheellisesti origoa kohti. Kärkipisteet, joiden paikkavektorin z-komponentti oli < -1, skaalautuivat pienemmiksi suhteessa etäisyyteen. Tästä johtui, että ladatut monimutkaiset mallit näyttivät mallin silhuetin oikein muiden pisteiden ollessa väärin. Kuva 8. Vasen kuva: kolmioiden kärkipisteet skaalautuvat virheellisesti origoa kohti säteen suuntavektorin määrittelyvirheen takia. Oikea kuva: skaalaus korjattu, säde kulkee vain z- komponentin suuntaisesti.
24 19 Kaikki nämä ongelmat johtuivat työssä käytetystä staattisesta ja ortogonaalisesta kamerasta, joka katsoi vain negatiivista z-akselia pitkin. Näin jokaisen säteen tuli kulkea vain z-akselin suuntaisesti. Alkuperäisessä versiossa asetin säteelle x- ja y- komponentit säikeiden juoksevan numeroinnin mukaan ja laskin tästä säteen suunnan. Ongelma ratkesi asettamalla säteen paikkavektori säikeiden juoksevien numeroiden mukaan, mutta pakottamalla suuntavektorin ainoaksi komponentiksi z = -1. Tämän jälkeen mallit näkyivät oikein ruudulla (kuva 5, oikea kuva). Wavefront OBJ -tiedoston latauksessa ilmenneiden kolmen ongelman korjauksen seurauksena onnistuin piirtämään ladattuja 3D-malleja näytölle. Seuraava ongelma olikin mallien valaistuksen puuttuminen, ja tästä johtuva mallien yksityiskohtien vaikea hahmottaminen. 4.4 Mallien sävytys Mallien yksityiskohtien näkyvyyden kannalta on tärkeää, että samassa tilassa mallin kanssa on ainakin yksi valonlähde tuomassa sävyeroja mallin pinnalle. Tämä olikin seuraava askel työssäni. Toteutin sävytyksen tekniikalla nimeltä Lambertian Diffuse, joka perustuu Johann Heinrich Lambertn kehittämään Lambertin kosinilakiin [11]. Laki määrittää, että pinnan sävy on suoraan verrannollinen valonsäteen ja pinnan normaalin kulman kosiniin [11]. L N = N L cos α = cos α (5) Toistaiseksi mallissani on vain yksi staattinen valonlähde, mutta jatkokehityksenä on tarkoitus mahdollistaa täysin dynaamiset valonlähteet (koodiesimerkki 11). Koodiesimerkki 11. Lambertin sävytys. Kolmion pintanormaalin ja valonsäteen suunnan kosini.
25 20 Sävytyksessä varmistetaan myös, että sävy on aina vähintään 0. Sävytyksen tuloksena on huomattavasti tarkempi 3D-malli, jossa yksityiskohdat ovat erotettavissa (kuva 9). Kuva 9. Kuvan lohikäärme on toteutettu Lambertian diffuse -sävytyksellä. Tätä sävytystä kutsutaan flat shadingiksi. Lambertian diffuse on ns. flat shading -tekniikka, joka toteuttaa sävytyksen kolmioiden avulla pehmentämättä niiden reunoja luoden karkean näköisen pinnan. On olemassa myös ns. Phong shading -tekniikka, joka pehmentää kolmioiden ääriviivoja saaden sävytyksen huomattavasti tasaisemmalta [23]. 5 Optimointi Optimoinnilla tarkoitetaan toiminnan suorittamisen nopeuttamista toimintatapoja muuttamalla. Tässä luvussa käsitellään kahta yleisintä optimointitapaa, joita käytetään näytönohjaimella suoritettavassa säteenseurannassa: Bounding Volume Hierarchyä (BVH) ja CUDA:n Texture memoryä. BVH on kiihdytystietorakenne ja Texture memory on NVI- DIA:n kehittämä muistiarkkitehtuuri. Näitä menetelmiä voidaan käyttää nopeuttamaan törmäystarkistukseen käytettävien kolmioiden etsimistä.
26 Bounding Volume Hierarchy Bounding Volume Hierarchy eli BVH on säteenseurannassa tällä hetkellä eniten käytetty kiihdytystietorakenne [17]. BVH koostuu solmuista. Nämä solmut sisältävät aina ns. bounding volumen eli rajatun alueen, joka sulkee sisäänsä kaikki muut sen alueen lapsisomut. Nämä rajatut alueet voivat olla esimerkiksi neliöitä, kuutioita tai palloja. Tässä mallissa lopulta lehtisolmut sulkevat sisäänsä aina objektin, jota vastaan törmäystarkistus halutaan suorittaa. Näitä objekteja voivat olla neliöt, kolmiot tai vaikka kokonaiset 3Dmallit (kuva 10). BVH:ta rakennettaessa pyritään maailma jakamaan osiin niin, että objektit, jotka ovat fyysisesti rinnakkain, tulisivat myös puurakenteessa samoihin tai vierekkäisiin solmuihin. Kuva 10. Kolmitasoinen Bounding Volume Hierarchy sulkee sisäänsä kolmiot. Jokainen taso on tässä tapauksessa ympyrä, joka sulkee sisäänsä lapsisolmujen rajaavat muodot. Kiihdytystietorakenteet, kuten BVH, on kehitetty vähentämään säteenseurannassa tehtävien törmäystarkistuksien määrää. Naiivissa törmäystarkistuksessa jokaisen säteen tulee tehdä törmäystarkistus jokaista objektia vastaan. Tällä törmäystarkistus määrittää, mihin kolmioon säde osuu, jos se ylipäänsä osuu ollenkaan. Puurakenteen myötä renderöijän dynamiikka hieman muuttuu. Aikaisemmin törmäystarkistukset tehtiin vain kolmioita vastaan, kun taas puurakenteen myötä suurin osa törmäystarkistuksista tehdään rajattuja alueita vastaan. Sädettä ammuttaessa tulee ohjelman kulkea puuta pitkin tutkien samalla kumpaan lapsihaaraan, jos kumpaankaan, tulisi siirtyä. Oikea
27 22 haara päätetään tekemällä yksinkertainen törmäystesti solmun rajaavia muotoja kohtaan (kuva 11). Kuva 11. Jos säde osuu BVH:n suureen juurisolmuun, osuu se mahdollisesti myös muihin objekteihin. Primitiivimuotojen, kuten kolmioiden, etsiminen puusta on yksi BVH:n tärkeimmistä osista [18]. Puu tulee rakentaa siten, että se toimii mahdollisimman tehokkaasti. Tehokkaan puun rakennukseen kuuluvat seuraavat vaiheet: Jokaiselle primitiivimuodolle lasketaan sen ympäröivä rajausalue. Jaetaan maailma siten, että samalla alueella olevat primitiivit suljetaan saman rajausalueen sisään. Toistetaan rekursiivisesti kunnes jäljellä on vain yksi iso laatikko. Tuloksena on puuhierarkia, jossa jokainen solmu viittaa sisältämiinsä lapsisolmuihin tai primitiiviin.
28 23 Puun rakenteen takia sen yksittäisten solmujen sijainti muistissa ei ole aina täysin ideaali. Tästä johtuen puu tulee muuttaa vielä yksiulotteiseksi taulukoksi. Taulukkomuotoon muutettaessa BVH:n rakenteesta tulee huomattavasti tiiviimpi, mikä parantaa välimuistiin tehtävien hakujen määrää ja samalla suorituskykyä (kuva 12) [18]. Kuva 12. BVH tiivistetään käyttäen syvyys-ensin-hakua. Tiivistyksen jälkeen ensimmäinen lapsisolmu löytyy heti seuraavana muistista. [19] Tiivistyksen jälkeen ensimmäinen lapsisolmu löytyy muistista heti seuraavasta paikasta, ja toinen lapsisolmu löytyy sille annetun siirtoluvun (offset) päästä.
29 CUDA Texture Memory CUDA Texture Memory on NVIDIA:n Kepler-näytönohjaimilla sijaitseva erikoismuisti, joka on tarkoitettu vain lukua varten. Tämä soveltuu hyvin BVH:n säilyttämiseen, sillä sitä vasten tehdään suuria määriä lukuja, mutta ei kirjoituksia. Ensimmäinen haku tekstuurimuistista on kohtalaisen hidas, mutta kaikki hakujen tulokset säilytetään huomattavasti nopeammassa 48 KT:n kokoisessa vain lukuun tarkoitetussa välimuistissa seuraavia hakuja varten [20]. Tämä muisti on täysin erillinen esimerkiksi L1- ja Sharedmuistista (kuva 13). Kuva 13. Kuvaus Kepler-arkkitehtuurin muistirakenteesta. [20] Muistin lokaalisuuden ollessa heikko muistiin tehtäviä hakuja tulee myös huomattavasti enemmän.
30 25 Tekstuurimuistin käyttäminen on helppoa CUDA:lla. Määritellään tekstuurireferenssi, jota käytetään näytönohjaimella ajattavassa kernel -funktiossa, ja kiinnitetään tekstuurireferenssi haluttuun dataan (koodiesimerkki 12). Koodiesimerkki 12. Tekstuurimuistin alustaminen ennen käyttämistä. Alustus tapahtuu prosessorin puolella. Tekstuurimuistista voidaan hakea tietoa heti alustuksen jälkeen käyttäen yhtä ainoaa funktiota CUDA kernel -funktiossa (koodiesimerkki 13). Koodiesimerkki 13. Tiedon hakeminen CUDA-tekstuurimuistista. Tekstuurimuistia käyttämällä varmistetaan tarvittavan tiedon pysyminen välimuistissa, mikä nopeuttaa ohjelman suoritusta vältyttäessä turhilta muistihauilta. Projektissa toteutettiin Bounding Volume Hierarchy -kiihdytystietorakenne, mutta sen tuomat edut eivät päässeet esille viimehetken bugien takia. 6 Pohdinta Työn tavoitteena oli syventyä säteenseurannan teoriaan, sen toteutukseen ja optimointiin. Aiheista löytyy runsaasti kirjallisuutta, ja sen avulla sain koottua kattavan tietopaketin asiasta kiinnostuneille. Samalla opin paljon säteenseurannan teoriasta ja toetutuksesta,
31 26 sekä näytönohjaimen ohjelmoimisesta CUDA:lla. Optimoinnin osalta sain kerättyä paljon tietoa teoriasta, mutta käytännön toteutus vaatii vielä jatkoperehtymistä. Varsinkin Bounding Volume Hierarchyn implementointi oli odotettua haastavampaa. Puurakenteen oikeellisuuden tarkistaminen on hyvin työlästä sen monimutkaisuuden takia. Toinen ongelma BVH:n kanssa oli myös itse kolmioiden etsiminen puusta riittävän tehokkaasti. Työn edetessä huomasin, että itse BVH:n rakentamisen ja etsinnän tutkimiseen olisi ollut hyvä käyttää enemmän aikaa ennen ohjelmoinnin aloittamista. Käytetyt tietorakenteet eivät täysin sopineet käytettyihin optimointitekniikoihin, mikä tuotti ylimääräistä päänvaivaa työn loppuvaiheessa. Työtä tehdessä kiinnostuin myös näytönohjaimen muistiarkkitehtuurista ja myös siihen olisi ollut hyvä tutustua enemmän jo heti työn alkuvaiheessa. Uskon työstäni olevan hyötyä henkilöille, jotka ovat vasta tutustumassa säteenseurannan konsepteihin ja haluavat tutusta näytönohjaimella suoritettuun säteenseurantaan. Työssäni käsitellyt koodinpätkät ovat vain ohjenuoria tärkeimpiin konsepteihin sekä säteenseurannassa että CUDA:n suorituksessa.
32 27 Lähteet 1 Wilt N The Cuda Handbook. Crawfordsville, Indiana: RR Donnelley. 2 NVIDIA s Next Generation CUDA Compute Architecture: Kepler GK110, [PDF], < Whitepaper.pdf>, Viitattu: GeForce GTX 670 Specifications, [verkkodokumentti] < Viitattu: PCI Express Base Specification Revision 3.0, [PDF] < Viitattu: Whitepaper NVIDIA GeForce GTX 680 The fastest, most efficient GPU ever built, [PDF]< Viitattu: CUDA Toolkit Documentation, [verkkodokumentti] < dia.com/cuda/cuda-runtime-api/group CUDART INTE- ROP.html#group CUDART INTE- ROP_1gb7064fb72e54d89d0666e192b45d35cc > Viitattu: What is OpenGL, [verkkodokumentti] < Viitattu What is NOT OpenGL?, [verkkodokumentti] < Viitattu: Glassner AS. An Introduction to Ray Tracing, 9. painos. San Francisco, CA 2002: Morgan Kaufmann Publishers, Inc. Saatavissa: < 10 Hughes JF, van Dam A, McGuire M, Sklar DF, Foley JD, Feiner SK, Akeley K. Computer Graphics Principles And Practice, 3. painos. Willard, Ohio 2014:RR Donneley. 11 Lambert s cosine law, [verkkodokumentti] Viitattu: Timeout Detection and Recovery of GPUs (TDR), [verkkodokumentti] < Viitattu:
33 28 13 Möller T, Trumbore B. Fast, Minimum Storage Ray/Triangle Intersection, Saatavissa: [PDF] < Viitattu Shumskiy V, Parshin A. GPU Ray Tracing Comparative Study of Ray-Triangle Intersection, GraphiCon Saatavissa: [PDF] < Viitattu: Segure RJ, Feito FR. Algorithms To Test Ray-Triangle Intersection. Comparative Study, Departamento de Informática, Universidad de Jaén Saatavissa: [PDF] < Viitattu: Rubin SM, Whitted T. A 3-Dimensional Representation for Fast Rendering of Complex Scenes, ACM Saatavissa: [PDF] < > Viitatu: Karras T, Aila T. Fast Parallel Construction of High-Quality Bounding Volume Hierarchies, NVIDIA Saatavissa: [PDF] < > Viitattu: Chang AY. A survey of Geometric Data Structures for Ray Tracing, Department of Computer and Information Science, Polytechnic University, Brooklyn, Saatavissa: [PDF] < > Viitattu: Pharr M, Humphreys G. Kappale 4: Primitives and Intersection Acceleration, kirjassa: Physically Based Rendering, Saatavissa: [PDF] < > Viitattu NVIDIA s Next Generation CUDA Compute Architecture: Kepler GK110, [PDF] < Whitepaper.pdf> Viitattu NVIDIA s CUDA Page, [verkkodokumentti] < Viitattu: Tiny obj loader, [verkkodokumentti] < Viitattu: Illumination & Shading, [PDF] < Viitattu: Introduction to 3D-graphics, [verkkodokumentti] < 3d-graphics/> Viitattu:
34 25 Real-Time Raytracing, [verkkodokumentti] < Viitattu:
35 Liite 1 1 (1) Möller-Trumbore-kolmion törmäystarkistus näytönohjaimella.
CUDA. Moniydinohjelmointi 17.4.2012 Mikko Honkonen
CUDA Moniydinohjelmointi 17.4.2012 Mikko Honkonen Yleisesti Compute Unified Device Architecture Ideana GPGPU eli grafiikkaprosessorin käyttö yleiseen laskentaan. Nvidian täysin suljetusti kehittämä. Vuoden
Luku 6: Grafiikka. 2D-grafiikka 3D-liukuhihna Epäsuora valaistus Laskostuminen Mobiililaitteet Sisätilat Ulkotilat
2D-grafiikka 3D-liukuhihna Epäsuora valaistus Laskostuminen Mobiililaitteet Sisätilat Ulkotilat 2D-piirto 2-ulotteisen grafiikan piirto perustuu yleensä valmiiden kuvien kopioimiseen näyttömuistiin (blitting)
Concurrency - Rinnakkaisuus. Group: 9 Joni Laine Juho Vähätalo
Concurrency - Rinnakkaisuus Group: 9 Joni Laine Juho Vähätalo Sisällysluettelo 1. Johdanto... 3 2. C++ thread... 4 3. Python multiprocessing... 6 4. Java ExecutorService... 8 5. Yhteenveto... 9 6. Lähteet...
Algoritmit 2. Luento 6 To Timo Männikkö
Algoritmit 2 Luento 6 To 28.3.2019 Timo Männikkö Luento 6 B-puun operaatiot Nelipuu Trie-rakenteet Standarditrie Pakattu trie Algoritmit 2 Kevät 2019 Luento 6 To 28.3.2019 2/30 B-puu 40 60 80 130 90 100
Luku 8. Aluekyselyt. 8.1 Summataulukko
Luku 8 Aluekyselyt Aluekysely on tiettyä taulukon väliä koskeva kysely. Tyypillisiä aluekyselyitä ovat, mikä on taulukon välin lukujen summa tai pienin luku välillä. Esimerkiksi seuraavassa taulukossa
Yleisen PSCR-menetelmän toteutus ohjelmoitavalla näytönoh
Yleisen n toteutus ohjelmoitavalla näytönohjaimella Mirko Myllykoski mirko.myllykoski@jyu.fi 15.2.2011 Mitä teen? Tarkoituksena toteuttaa (ja osin jo toteutettukin) stä versio ohjelmoitavalle näytönohjaimelle
Luento 6: Piilopinnat ja Näkyvyys
Tietokonegrafiikan perusteet T-111.4300 3 op Luento 6: Piilopinnat ja Näkyvyys Janne Kontkanen Geometrinen mallinnus / 1 Johdanto Piilopintojen poisto-ongelma Syntyy kuvattaessa 3-ulotteista maailmaa 2-ulotteisella
Tampereen yliopisto Tietokonegrafiikka 2013 Tietojenkäsittelytiede Harjoitus
Tampereen yliopisto Tietokonegrafiikka 2013 Tietojenkäsittelytiede Harjoitus 2 7.2.2013 1. Matematiikan lukiokurssissa on esitetty, että ylöspäin aukeavan paraabelin f(x) = ax 2 +bx+c,a > 0,minimikohtasaadaan,kunf
Tietorakenteet ja algoritmit - syksy 2015 1
Tietorakenteet ja algoritmit - syksy 2015 1 Tietorakenteet ja algoritmit - syksy 2015 2 Tietorakenteet ja algoritmit Johdanto Ari Korhonen Tietorakenteet ja algoritmit - syksy 2015 1. JOHDANTO 1.1 Määritelmiä
Tietokonegrafiikka. Jyry Suvilehto T Johdatus tietoliikenteeseen ja multimediatekniikkaan kevät 2014
Tietokonegrafiikka Jyry Suvilehto T-110.1100 Johdatus tietoliikenteeseen ja multimediatekniikkaan kevät 2014 1. Sovellusalueita 2. Rasterigrafiikkaa 3. Vektorigrafiikkaa 4. 3D-grafiikkaa 1. Säteenheitto
10.2. Säteenjäljitys ja radiositeettialgoritmi. Säteenjäljitys
10.2. Säteenjäljitys ja radiositeettialgoritmi Säteenjäljitys Säteenjäljityksessä (T. Whitted 1980) valonsäteiden kulkema reitti etsitään käänteisessä järjestyksessä katsojan silmästä takaisin kuvaan valolähteeseen
Tietorakenteet ja algoritmit Johdanto Lauri Malmi / Ari Korhonen
Tietorakenteet ja algoritmit Johdanto Lauri Malmi / Ari 1 1. JOHDANTO 1.1 Määritelmiä 1.2 Tietorakenteen ja algoritmin valinta 1.3 Algoritmit ja tiedon määrä 1.4 Tietorakenteet ja toiminnot 1.5 Esimerkki:
Vektorien pistetulo on aina reaaliluku. Esimerkiksi vektorien v = (3, 2, 0) ja w = (1, 2, 3) pistetulo on
13 Pistetulo Avaruuksissa R 2 ja R 3 on totuttu puhumaan vektorien pituuksista ja vektoreiden välisistä kulmista. Kuten tavallista, näiden käsitteiden yleistäminen korkeampiulotteisiin avaruuksiin ei onnistu
Peilaus pisteen ja suoran suhteen Pythonin Turtle moduulilla
Peilaus pisteen ja suoran suhteen Pythonin Turtle moduulilla ALKUHARJOITUS Kynän ja paperin avulla peilaaminen koordinaatistossa a) Peilaa pisteen (0,0) suhteen koordinaatistossa sijaitseva - neliö, jonka
Algoritmit 2. Luento 6 Ke Timo Männikkö
Algoritmit 2 Luento 6 Ke 29.3.2017 Timo Männikkö Luento 6 B-puun operaatiot B-puun muunnelmia Nelipuu Trie-rakenteet Standarditrie Pakattu trie Algoritmit 2 Kevät 2017 Luento 6 Ke 29.3.2017 2/31 B-puu
PRINCIPLES OF PROGRAMMING LANGUAGES - DEBUGGER
PRINCIPLES OF PROGRAMMING LANGUAGES - DEBUGGER Group 16 Ville Laatu Henri Myllyoja - i SISÄLLYSLUETTELO 1. DEBUGGERI YLEISESTI... II 1.1 Debuggerin käyttämien... ii 1.2 Debuggerin käynnistäminen... ii
Chapel. TIE Ryhmä 91. Joonas Eloranta Lari Valtonen
Chapel TIE-20306 Ryhmä 91 Joonas Eloranta Lari Valtonen Johdanto Chapel on Amerikkalaisen Cray Inc. yrityksen kehittämä avoimen lähdekoodin ohjelmointikieli. Chapel on rinnakkainen ohjelmointikieli, joka
TAMPEREEN TEKNILLINEN YLIOPISTO Digitaali- ja tietokonetekniikan laitos. Harjoitustyö 4: Cache, osa 2
TAMPEREEN TEKNILLINEN YLIOPISTO Digitaali- ja tietokonetekniikan laitos TKT-3200 Tietokonetekniikka I Harjoitustyö 4: Cache, osa 2.. 2010 Ryhmä Nimi Op.num. 1 Valmistautuminen Cache-työn toisessa osassa
Luento 10: Näkyvyystarkastelut ja varjot. Sisältö
Tietokonegrafiikka / perusteet T-111.300/301 4 ov / 2 ov Luento 10: Näkyvyystarkastelut ja varjot Marko Myllymaa / Lauri Savioja 10/04 Näkyvyystarkastelut ja varjot / 1 Näkyvyystarkastelu Solurenderöinti
2 Pistejoukko koordinaatistossa
Pistejoukko koordinaatistossa Ennakkotehtävät 1. a) Esimerkiksi: b) Pisteet sijaitsevat pystysuoralla suoralla, joka leikkaa x-akselin kohdassa x =. c) Yhtälö on x =. d) Sijoitetaan joitain ehdon toteuttavia
Tekijä Pitkä matematiikka Suoran pisteitä ovat esimerkiksi ( 5, 2), ( 2,1), (1, 0), (4, 1) ja ( 11, 4).
Tekijä Pitkä matematiikka 4 9.12.2016 212 Suoran pisteitä ovat esimerkiksi ( 5, 2), ( 2,1), (1, 0), (4, 1) ja ( 11, 4). Vastaus esimerkiksi ( 5, 2), ( 2,1), (1, 0), (4, 1) ja ( 11, 4) 213 Merkitään pistettä
Luku 6. Dynaaminen ohjelmointi. 6.1 Funktion muisti
Luku 6 Dynaaminen ohjelmointi Dynaamisessa ohjelmoinnissa on ideana jakaa ongelman ratkaisu pienempiin osaongelmiin, jotka voidaan ratkaista toisistaan riippumattomasti. Jokaisen osaongelman ratkaisu tallennetaan
Luento 3: 3D katselu. Sisältö
Tietokonegrafiikan perusteet T-.43 3 op Luento 3: 3D katselu Lauri Savioja Janne Kontkanen /27 3D katselu / Sisältö Kertaus: koordinaattimuunnokset ja homogeeniset koordinaatit Näkymänmuodostus Kameran
A274101 TIETORAKENTEET JA ALGORITMIT
A274101 TIETORAKENTEET JA ALGORITMIT PERUSTIETORAKENTEET LISTA, PINO, JONO, PAKKA ABSTRAKTI TIETOTYYPPI Tietotyyppi on abstrakti, kun se on määritelty (esim. matemaattisesti) ottamatta kantaa varsinaiseen
11/20: Konepelti auki
Ohjelmointi 1 / syksy 2007 11/20: Konepelti auki Paavo Nieminen nieminen@jyu.fi Tietotekniikan laitos Informaatioteknologian tiedekunta Jyväskylän yliopisto Ohjelmointi 1 / syksy 2007 p.1/11 Tämän luennon
Datatähti 2019 loppu
Datatähti 2019 loppu task type time limit memory limit A Summa standard 1.00 s 512 MB B Bittijono standard 1.00 s 512 MB C Auringonlasku standard 1.00 s 512 MB D Binääripuu standard 1.00 s 512 MB E Funktio
Tilanhallintatekniikat
Tilanhallintatekniikat 3D grafiikkamoottoreissa Moottori on projektin osa joka vastaa tiettyjen toiminnallisuuksien hallinnasta hallitsee kaikki vastuualueen datat suorittaa kaikki tehtäväalueen toiminnot
Epäyhtälöt 1/7 Sisältö ESITIEDOT: yhtälöt
Epäyhtälöt 1/7 Sisältö Epäyhtälö Epäyhtälöllä tarkoitetaan ehtoa, missä kahdesta lausekkeesta toinen on suurempi tai mahdollisesti yhtä suuri kuin toinen: f(x) < g(x), f(x) g(x).merkit voidaan luonnollisesti
Tekijä Pitkä matematiikka b) Kuvasta nähdään, että b = i 4 j. c) Käytetään a- ja b-kohtien tuloksia ja muokataan lauseketta.
Tekijä Pitkä matematiikka 4 9.1.016 79 a) Kuvasta nähdään, että a = 3i + j. b) Kuvasta nähdään, että b = i 4 j. c) Käytetään a- ja b-kohtien tuloksia ja muokataan lauseketta. 5a b = 5(3i + j) ( i 4 j)
Algoritmit 2. Luento 2 To Timo Männikkö
Algoritmit 2 Luento 2 To 14.3.2019 Timo Männikkö Luento 2 Tietorakenteet Lineaarinen lista, binääripuu Prioriteettijono Kekorakenne Keko-operaatiot Keon toteutus taulukolla Algoritmit 2 Kevät 2019 Luento
ELM GROUP 04. Teemu Laakso Henrik Talarmo
ELM GROUP 04 Teemu Laakso Henrik Talarmo 23. marraskuuta 2017 Sisältö 1 Johdanto 1 2 Ominaisuuksia 2 2.1 Muuttujat ja tietorakenteet...................... 2 2.2 Funktiot................................
Videon tallentaminen Virtual Mapista
Videon tallentaminen Virtual Mapista Kamera-ajon tekeminen Karkean kamera ajon teko onnistuu nopeammin Katseluohjelmassa (Navigointi > Näkymät > Tallenna polku). Liikeradan ja nopeuden tarkka hallinta
Rinnakkaisuuden hyväksikäyttö peleissä. Paula Kemppi
Rinnakkaisuuden hyväksikäyttö peleissä Paula Kemppi 24.4.2008 Esityksen rakenne Johdantoa Rinnakkaisuus Pelimoottorien rinnakkaisuuden mallit Funktionaalisen rinnakkaisuuden malli Rinnakkaisen tiedon malli
Algoritmit 1. Luento 3 Ti Timo Männikkö
Algoritmit 1 Luento 3 Ti 17.1.2017 Timo Männikkö Luento 3 Algoritmin analysointi Rekursio Lomituslajittelu Aikavaativuus Tietorakenteet Pino Algoritmit 1 Kevät 2017 Luento 3 Ti 17.1.2017 2/27 Algoritmien
Tampereen yliopisto Tietokonegrafiikka 2013 Tietojenkäsittelytiede Harjoitus
Tampereen yliopisto Tietokonegrafiikka 201 Tietojenkäsittelytiede Harjoitus 6 1..201 1. Tarkastellaan Gouraudin sävytysmallia. Olkoon annettuna kolmio ABC, missä A = (0,0,0), B = (2,0,0) ja C = (1,2,0)
MAA4 Abittikokeen vastaukset ja perusteluja 1. Määritä kuvassa olevien suorien s ja t yhtälöt. Suoran s yhtälö on = ja suoran t yhtälö on = + 2. Onko väittämä oikein vai väärin? 2.1 Suorat =5 +2 ja =5
Rinnakkaistietokoneet luento S
Rinnakkaistietokoneet luento 5 521475S Silmukalliset ohjelmat Silmukat joissa ei ole riippuvuussyklejä voidaan vektoroida eli suorittaa silmukan vektorointi Jokainen yksittäinen käsky silmukan rungossa
Tässä tehtävässä käsittelet metodeja, listoja sekä alkulukuja (englanniksi prime ).
Tehtävä 1: Metodit, listat, alkuluvut (4p) Tässä tehtävässä käsittelet metodeja, listoja sekä alkulukuja (englanniksi prime ). Alkuluvut ovat lukuja, jotka ovat suurempia kuin yksi ja jotka ovat jaollisia
MAB3 - Harjoitustehtävien ratkaisut:
MAB - Harjoitustehtävien ratkaisut: Funktio. Piirretään koordinaatistoakselit ja sijoitetaan pisteet:. a) Funktioiden nollakohdat löydetään etsimällä kuvaajien ja - akselin leikkauspisteitä. Funktiolla
5. HelloWorld-ohjelma 5.1
5. HelloWorld-ohjelma 5.1 Sisällys Lähdekoodi. Lähdekoodin (osittainen) analyysi. Lähdekoodi tekstitiedostoon. Lähdekoodin kääntäminen tavukoodiksi. Tavukoodin suorittaminen. Virheiden korjaaminen 5.2
Tekijä Pitkä matematiikka Poistetaan yhtälöparista muuttuja s ja ratkaistaan muuttuja r.
Tekijä Pitkä matematiikka 4 16.12.2016 K1 Poistetaan yhtälöparista muuttuja s ja ratkaistaan muuttuja r. 3 r s = 0 4 r+ 4s = 2 12r 4s = 0 + r+ 4s = 2 13 r = 2 r = 2 13 2 Sijoitetaan r = esimerkiksi yhtälöparin
811312A Tietorakenteet ja algoritmit, , Harjoitus 3, Ratkaisu
811312A Tietorakenteet ja algoritmit, 2018-2019, Harjoitus 3, Ratkaisu Harjoituksessa käsitellään algoritmien aikakompleksisuutta. Tehtävä 3.1 Kuvitteelliset algoritmit A ja B lajittelevat syötteenään
Algoritmit 2. Luento 13 Ti Timo Männikkö
Algoritmit 2 Luento 13 Ti 30.4.2019 Timo Männikkö Luento 13 Simuloitu jäähdytys Merkkijonon sovitus Horspoolin algoritmi Ositus ja rekursio Rekursion toteutus Algoritmit 2 Kevät 2019 Luento 13 Ti 30.4.2019
Osoita, että kaikki paraabelit ovat yhdenmuotoisia etsimällä skaalauskuvaus, joka vie paraabelin y = ax 2 paraabelille y = bx 2. VASTAUS: , b = 2 2
8. Geometriset kuvaukset 8.1. Euklidiset kuvaukset 344. Esitä muodossa x = Ax + b se avaruuden E 3 peilauskuvaus, jonka symmetriatasona on x 1 3x + x 3 = 6. A = 1 3 6 6 3, b = 1 1 18. 3 6 6 345. Tason
Toinen harjoitustyö. ASCII-grafiikkaa
Toinen harjoitustyö ASCII-grafiikkaa Yleistä Tehtävä: tee Javalla ASCII-merkkeinä esitettyä grafiikkaa käsittelevä ASCIIArt-ohjelma omia operaatioita ja taulukoita käyttäen. Työ tehdään pääosin itse. Ideoita
T-110.1100 Johdatus tietoliikenteeseen ja multimediatekniikkaan Tietokonegrafiikka
Johdatus tietoliikenteeseen ja multimediatekniikkaan Tietokonegrafiikka Timo Tossavainen Mediatekniikan laitos, Aalto-yliopiston perustieteiden korkeakoulu Timo.Tossavainen@tkk.fi 25.3.2011 Sisältö Historiaa
T-111.4310 Vuorovaikutteinen tietokonegrafiikka Tentti 14.12.2011
T-111.4310 Vuorovaikutteinen tietokonegrafiikka Tentti 14.12.2011 Vastaa kolmeen tehtävistä 1-4 ja tehtävään 5. 1. Selitä lyhyesti mitä seuraavat termit tarkoittavat tai minkä ongelman algoritmi ratkaisee
Visualisoinnin perusteet
1 / 12 Digitaalisen arkkitehtuurin yksikkö Aalto-yliopisto Visualisoinnin perusteet Mitä on renderöinti? 2 / 12 3D-mallista voidaan generoida näkymiä tietokoneen avulla. Yleensä perspektiivikuva Valon
Ohjelmoinnin perusteet Y Python
Ohjelmoinnin perusteet Y Python T-106.1208 2.3.2011 T-106.1208 Ohjelmoinnin perusteet Y 2.3.2011 1 / 39 Kertausta: tiedoston avaaminen Kun ohjelma haluaa lukea tai kirjoittaa tekstitiedostoon, on ohjelmalle
TIEP114 Tietokoneen rakenne ja arkkitehtuuri, 3 op. Assembly ja konekieli
TIEP114 Tietokoneen rakenne ja arkkitehtuuri, 3 op Assembly ja konekieli Tietokoneen ja ohjelmiston rakenne Loogisilla piireillä ja komponenteilla rakennetaan prosessori ja muistit Prosessorin rakenne
IDL - proseduurit. ATK tähtitieteessä. IDL - proseduurit
IDL - proseduurit 25. huhtikuuta 2017 Viimeksi käsiteltiin IDL:n interaktiivista käyttöä, mutta tämä on hyvin kömpelöä monimutkaisempia asioita tehtäessä. IDL:llä on mahdollista tehdä ns. proseduuri-tiedostoja,
5. HelloWorld-ohjelma 5.1
5. HelloWorld-ohjelma 5.1 Sisällys Lähdekoodi. Lähdekoodin (osittainen) analyysi. Lähdekoodi tekstitiedostoon. Lähdekoodin kääntäminen tavukoodiksi. Tavukoodin suorittaminen. Virheiden korjaaminen 5.2
815338A Ohjelmointikielten periaatteet Harjoitus 3 vastaukset
815338A Ohjelmointikielten periaatteet 2015-2016. Harjoitus 3 vastaukset Harjoituksen aiheena ovat imperatiivisten kielten muuttujiin liittyvät kysymykset. Tehtävä 1. Määritä muuttujien max_num, lista,
Lohkot. if (ehto1) { if (ehto2) { lause 1;... lause n; } } else { lause 1;... lause m; } 16.3
16. Lohkot 16.1 Sisällys Tutustutaan lohkoihin. Muuttujien ja vakioiden näkyvyys sekä elinikä erityisesti operaation lohkossa. Nimikonfliktit. Muuttujat operaation alussa vai myöhemmin? 16.2 Lohkot Kaarisulut
ATK tähtitieteessä. Osa 3 - IDL proseduurit ja rakenteet. 18. syyskuuta 2014
18. syyskuuta 2014 IDL - proseduurit Viimeksi käsiteltiin IDL:n interaktiivista käyttöä, mutta tämä on hyvin kömpelöä monimutkaisempia asioita tehtäessä. IDL:llä on mahdollista tehdä ns. proseduuri-tiedostoja,
Tekijä Pitkä matematiikka
K1 Tekijä Pitkä matematiikka 5 7..017 a) 1 1 + 1 = 4 + 1 = 3 = 3 4 4 4 4 4 4 b) 1 1 1 = 4 6 3 = 5 = 5 3 4 1 1 1 1 1 K a) Koska 3 = 9 < 10, niin 3 10 < 0. 3 10 = (3 10 ) = 10 3 b) Koska π 3,14, niin π
yleisessä muodossa x y ax by c 0. 6p
MAA..0 Muista kirjoittaa jokaiseen paperiin nimesi! Tee vastauspaperin yläreunaan pisteytysruudukko! Valitse kuusi tehtävää! Perustele vastauksesi välivaiheilla! Jussi Tyni Ratkaise: a) x x b) xy x 6y
4.12.2005. SEPA REFAKTOROINTI Antti Ahvenlampi, 57408L Erik Hakala, 57509T
SEPA REFAKTOROINTI Antti Ahvenlampi, 57408L Erik Hakala, 57509T SEPA: REFAKTOROINTI 2 (9) SEPA: REFAKTOROINTI 3 (9) VERSIOHISTORIA Version Date Author Description 0.1 2.12.2005 Erik Hakala Ensimmäinen
Tutoriaaliläsnäoloista
Tutoriaaliläsnäoloista Tutoriaaliläsnäolokierroksella voi nyt täyttää anomuksen läsnäolon merkitsemisestä Esim. tagi ei toiminut, korvavaltimon leikkaus, yms. Hyväksyn näitä omaa harkintaa käyttäen Tarkoitus
TIEA341 Funktio-ohjelmointi 1, kevät 2008
TIEA34 Funktio-ohjelmointi, kevät 2008 Luento 3 Antti-Juhani Kaijanaho Jyväskylän yliopisto Tietotekniikan laitos 2. tammikuuta 2008 Ydin-Haskell: Syntaksi Lausekkeita (e) ovat: nimettömät funktiot: \x
ITKP102 Ohjelmointi 1 (6 op)
ITKP102 Ohjelmointi 1 (6 op) Tentaattori: Antti-Jussi Lakanen 20. huhtikuuta 2018 Vastaa kaikkiin tehtäviin. Tee kukin tehtävä omalle konseptiarkille. Noudata ohjelmointitehtävissä kurssin koodauskäytänteitä.
z 1+i (a) f (z) = 3z 4 5z 3 + 2z (b) f (z) = z 4z + 1 f (z) = 12z 3 15z 2 + 2
BM20A5700 - Integraauunnokset Harjoitus 2 1. Laske seuraavat raja-arvot. -kohta ratkeaa, kun pistät sekä yläkerran että alakerran muotoon (z z 1 )(z z 2 ), missä siis z 1 ja z 2 ovat näiden lausekkeiden
Algoritmit 1. Luento 8 Ke Timo Männikkö
Algoritmit 1 Luento 8 Ke 1.2.2017 Timo Männikkö Luento 8 Järjestetty binääripuu Solmujen läpikäynti Binääripuun korkeus Binääripuun tasapainottaminen Graafit ja verkot Verkon lyhimmät polut Fordin ja Fulkersonin
Visma Fivaldi. Ohjeet Java web startin ja HTML5-työkalun aktivointiin
Visma Fivaldi Ohjeet Java web startin ja HTML5-työkalun aktivointiin Visma Software Oy pidättää itsellään oikeuden mahdollisiin parannuksiin ja/tai muutoksiin tässä oppaassa ja/tai ohjelmassa ilman eri
T740103 Olio-ohjelmointi Osa 5: Periytyminen ja polymorfismi Jukka Jauhiainen OAMK Tekniikan yksikkö 2010
12. Periytyminen Johdantoa Käytännössä vähänkään laajemmissa ohjelmissa joudutaan laatimaan useita luokkia, joiden pitäisi pystyä välittämään tietoa toisilleen. Ohjelmien ylläpidon kannalta olisi lisäksi
Sisällys. 3. Muuttujat ja operaatiot. Muuttujat ja operaatiot. Muuttujat. Operaatiot. Imperatiivinen laskenta. Muuttujat. Esimerkkejä: Operaattorit.
3. Muuttujat ja operaatiot Sisällys Imperatiivinen laskenta. Muuttujat. Nimi ja arvo. Muuttujan nimeäminen. Muuttujan tyyppi.. Operandit. Arvon sijoitus muuttujaan. Aritmeettiset operaattorit. Arvojen
Muutamia peruskäsitteitä
Muutamia peruskäsitteitä Huom. 1: nämä peruskäsitteet eivät muodosta hyvin määriteltyä keskenään yhteensopivien käsitteiden joukkoa, vaan käsitteet ovat osittain päällekkäisiä ja eri yhteyksissä niillä
TIEP114 Tietokoneen rakenne ja arkkitehtuuri, 3 op. Assembly ja konekieli
TIEP114 Tietokoneen rakenne ja arkkitehtuuri, 3 op Assembly ja konekieli Tietokoneen ja ohjelmiston rakenne Loogisilla piireillä ja komponenteilla rakennetaan prosessori ja muistit Prosessorin rakenne
Yleistä vektoreista GeoGebralla
Vektoreita GeoGebralla Vektoreilla voi laskea joko komentopohjaisesti esim. CAS-ikkunassa tai piirtämällä piirtoikkunassa. Ensimmäisen tavan etuna on, että laskujen tueksi muodostuu kuva. Tästä on varmasti
Esimerkkiprojekti. Mallivastauksen löydät Wroxin www-sivuilta. Kenttä Tyyppi Max.pituus Rajoitukset/Kommentit
Liite E - Esimerkkiprojekti E Esimerkkiprojekti Olet lukenut koko kirjan. Olet sulattanut kaiken tekstin, Nyt on aika soveltaa oppimiasi uusia asioita pienen, mutta täydellisesti muotoiltuun, projektiin.
Diplomi-insinööri- ja arkkitehtikoulutuksen yhteisvalinta 2017 Insinöörivalinnan matematiikan koe , Ratkaisut (Sarja A)
Diplomi-insinööri- ja arkkitehtikoulutuksen yhteisvalinta 017 Insinöörivalinnan matematiikan koe 30..017, Ratkaisut (Sarja A) 1. a) Lukujen 9, 0, 3 ja x keskiarvo on. Määritä x. (1 p.) b) Mitkä reaaliluvut
Luento 7: Lokaalit valaistusmallit
Tietokonegrafiikan perusteet T-111.4300 3 op Luento 7: Lokaalit valaistusmallit Lauri Savioja 11/07 Lokaalit valaistusmallit / 1 Sävytys Interpolointi Sisältö Lokaalit valaistusmallit / 2 1 Varjostustekniikat
Mb8 Koe Kuopion Lyseon lukio (KK) sivu 1/2
Mb8 Koe 0.11.015 Kuopion Lyseon lukio (KK) sivu 1/ Kokeessa on kaksi osaa. Osa A ratkaistaan tehtäväpaperille ja osa B ratkaistaan konseptipaperille. Osa A: saat käyttää taulukkokirjaa mutta et laskinta.
3. Muuttujat ja operaatiot 3.1
3. Muuttujat ja operaatiot 3.1 Sisällys Imperatiivinen laskenta. Muuttujat. Nimi ja arvo. Muuttujan nimeäminen. Muuttujan tyyppi. Operaattorit. Operandit. Arvon sijoitus muuttujaan. Aritmeettiset operaattorit.
Demo 1: Simplex-menetelmä
MS-C2105 Optimoinnin perusteet Malliratkaisut 3 Ehtamo Demo 1: Simplex-menetelmä Muodosta lineaarisen tehtävän standardimuoto ja ratkaise tehtävä taulukkomuotoisella Simplex-algoritmilla. max 5x 1 + 4x
MATEMATIIKAN KOE, LYHYT OPPIMÄÄRÄ HYVÄN VASTAUKSEN PIIRTEITÄ
MATEMATIIKAN KOE, LYHYT OPPIMÄÄRÄ 24.9.2019 HYVÄN VASTAUKSEN PIIRTEITÄ Alustavat hyvän vastauksen piirteet on suuntaa-antava kuvaus kokeen tehtäviin odotetuista vastauksista ja tarkoitettu ensisijaisesti
Algoritmit 2. Luento 2 Ke Timo Männikkö
Algoritmit 2 Luento 2 Ke 15.3.2017 Timo Männikkö Luento 2 Tietorakenteet Lineaarinen lista, binääripuu Prioriteettijono Kekorakenne Keko-operaatiot Keon toteutus taulukolla Algoritmit 2 Kevät 2017 Luento
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.
Tietorakenteet, laskuharjoitus 11, ratkaisuja 1. Leveyssuuntaisen läpikäynnin voi toteuttaa rekursiivisesti käsittelemällä jokaisella rekursiivisella kutsulla kaikki tietyllä tasolla olevat solmut. Rekursiivinen
.NET ajoympäristö. Juha Järvensivu 2007
.NET ajoympäristö Juha Järvensivu juha.jarvensivu@tut.fi 2007 Käännösprosessi C# lähdekoodi C# kääntäjä CILtavukoodi JITkäännös Ajettava natiivikoodi Kehitysympäristössä ohjelmoijan toimesta Ajonaikana.NET
58131 Tietorakenteet ja algoritmit (syksy 2015)
58131 Tietorakenteet ja algoritmit (syksy 2015) Harjoitus 2 (14. 18.9.2015) Huom. Sinun on tehtävä vähintään kaksi tehtävää, jotta voit jatkaa kurssilla. 1. Erään algoritmin suoritus vie 1 ms, kun syötteen
1 Kertaus. Lineaarinen optimointitehtävä on muotoa:
1 Kertaus Lineaarinen optimointitehtävä on muotoa: min c 1 x 1 + c 2 x 2 + + c n x n kun a 11 x 1 + a 12 x 2 + + a 1n x n b 1 a 21 x 1 + a 22 x 2 + + a 2n x n b 2 (11) a m1 x 1 + a m2 x 2 + + a mn x n
Tietorakenteet ja algoritmit syksy Laskuharjoitus 1
Tietorakenteet ja algoritmit syksy 2012 Laskuharjoitus 1 1. Tietojenkäsittelijä voi ajatella logaritmia usein seuraavasti: a-kantainen logaritmi log a n kertoo, kuinka monta kertaa luku n pitää jakaa a:lla,
Digitaalisen arkkitehtuurin alkeet
1 / 18 Digitaalisen arkkitehtuurin yksikkö Aalto-yliopisto Digitaalisen arkkitehtuurin alkeet Miten tehdä mallin loppuosat? 2 / 18 Patch on helppo tehdä sisäosille, mutta alueen rajan ja korkeuskäyrien
BM20A5800 Funktiot, lineaarialgebra ja vektorit Harjoitus 4, Syksy 2016
BM20A5800 Funktiot, lineaarialgebra ja vektorit Harjoitus 4, Syksy 2016 1. Hahmottele karkeasti funktion f : R R 2 piirtämällä sen arvoja muutamilla eri muuttujan arvoilla kaksiulotteiseen koordinaatistoon
Toinen harjoitustyö. ASCII-grafiikkaa 2017
Toinen harjoitustyö ASCII-grafiikkaa 2017 Yleistä Tehtävä: tee Javalla ASCII-merkkeinä esitettyä grafiikkaa käsittelevä ASCIIArt17-ohjelma omia operaatioita ja taulukoita käyttäen. Työ tehdään pääosin
Arkkitehtuurikuvaus. Ratkaisu ohjelmistotuotelinjan monikielisyyden hallintaan Innofactor Oy. Ryhmä 14
Arkkitehtuurikuvaus Ratkaisu ohjelmistotuotelinjan monikielisyyden hallintaan Innofactor Oy Ryhmä 14 Muutoshistoria Versio Pvm Päivittäjä Muutos 0.4 1.11.2007 Matti Eerola 0.3 18.10.2007 Matti Eerola 0.2
Ohjelmoinnin perusteet Y Python
Ohjelmoinnin perusteet Y Python T-106.1208 2.3.2009 T-106.1208 Ohjelmoinnin perusteet Y 2.3.2009 1 / 28 Puhelinluettelo, koodi def lue_puhelinnumerot(): print "Anna lisattavat nimet ja numerot." print
6.5. Renderöintijärjestys
6.5. Renderöintijärjestys Näkymän käsittelyjärjestyksiä on kahta tyyppiä. Ensimmäinen on monikulmioittainen käsittely, jossa kukin monikulmio prosessoidaan vuorollaan välittämättä muista. Toinen on selaussuorajärjestys,
Tietorakenteet ja algoritmit
Tietorakenteet ja algoritmit Rekursio Rekursion käyttötapauksia Rekursio määritelmissä Rekursio ongelmanratkaisussa ja ohjelmointitekniikkana Esimerkkejä taulukolla Esimerkkejä linkatulla listalla Hanoin
Osoitin ja viittaus C++:ssa
Osoitin ja viittaus C++:ssa Osoitin yksinkertaiseen tietotyyppiin Osoitin on muuttuja, joka sisältää jonkin toisen samantyyppisen muuttujan osoitteen. Ohessa on esimerkkiohjelma, jossa määritellään kokonaislukumuuttuja
Luento 4: Näkyvyystarkastelut ja varjot
Tietokonegrafiikan jatkokurssi T-111.5300 4 op Luento 4: Näkyvyystarkastelut ja varjot Lauri Savioja 02/07 Näkyvyystarkastelut ja varjot / 1 Näkyvyystarkastelu Solurenderöinti Portaalirenderöinti Quad-/Octtree
Ohjelmoinnin perusteet Y Python
Ohjelmoinnin perusteet Y Python T-106.1208 2.2.2009 T-106.1208 Ohjelmoinnin perusteet Y 2.2.2009 1 / 43 Funktiot Tähän asti esitetyt ohjelmat ovat oleet hyvin lyhyitä. Todellisessa elämässä tarvitaan kuitenkin
Sisällys. 16. Lohkot. Lohkot. Lohkot
Sisällys 16. ohkot Tutustutaan lohkoihin. Muuttujien ja vakioiden näkyvyys sekä elinikä erityisesti operaation lohkossa. Nimikonfliktit. Muuttujat operaation alussa vai myöhemmin? 16.1 16.2 ohkot aarisulut
Lohkot. if (ehto1) { if (ehto2) { lause 1;... lause n; } } else { lause 1;... lause m; } 15.3
15. Lohkot 15.1 Sisällys Tutustutaan lohkoihin. Muuttujien ja vakioiden näkyvyys sekä elinikä erityisesti operaation lohkossa. Nimikonfliktit. Muuttujat operaation alussa vai myöhemmin? 15.2 Lohkot Aaltosulkeet
Computing Curricula 2001 -raportin vertailu kolmeen suomalaiseen koulutusohjelmaan
Computing Curricula 2001 -raportin vertailu kolmeen suomalaiseen koulutusohjelmaan CC1991:n ja CC2001:n vertailu Tutkintovaatimukset (degree requirements) Kahden ensimmäisen vuoden opinnot Ohjelmistotekniikan
10. Esitys ja kuvaus
10. Esitys ja kuvaus Kun kuva on ensin segmentoitu alueisiin edellisen luvun menetelmin, segmentoidut pikselit kootaan esittämään ja kuvaamaan kohteita muodossa, joka sopii hyvin jatkokäsittelyä varten.
Hannu Mäkiö. kertolasku * jakolasku / potenssiin korotus ^ Syöte Geogebran vastaus
Perusohjeita, symbolista laskentaa Geogebralla Kielen vaihtaminen. Jos Geogebrasi kieli on vielä englanti, niin muuta se Options välilehdestä kohdasta Language suomeksi (finnish). Esittelen tässä muutaman
Sisällys. 15. Lohkot. Lohkot. Lohkot
Sisällys 15. Lohkot Tutustutaan lohkoihin. Muuttujien ja vakioiden näkyvyys sekä elinikä erityisesti operaation lohkossa. Nimikonfliktit. Muuttujat operaation alussa vai myöhemmin? 15.1 15.2 Lohkot Aaltosulkeet