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) esim. iso taustakuva piirretään jokaisen ruudun pohjalle ja sen jälkeen silmukassa pelin objekteja esittävät kuvat (spritet) spritet nelikulmaisia mutta osin läpinäkyviä spritejä voi siirtää, skaalata, kiertää nykyisillä 3D-rajapinnoilla teksturoitu nelikulmio Kun kuva on valmis, vaihdetaan piirtopuskuri näkyviin ja piirretään alusta uudelleen
2D-piirto Objektien animointi piirtämällä etukäteen useita versioita ja valitsemalla niistä sopiva yleensä tallennetaan yhteen kuvaan saman objektin kaikki versiot Tile-based: pelimaailma rakennetaan monesti toistuvista palasista, joita piirretään säännölliseen ristikkoon toimii myös 2.5D:ssä, kun piirretään takaa eteen yhteensovittaminen työlästä, kombinatorinen räjähdys kerrostaminen auttaa jonkin verran
3D: grafiikkaliukuhihna 3d-grafiikan piirto tapahtuu liukuhihnamallin (pipeline) mukaisesti. Piirrettävä data kulkee useiden peräkkäisten vaiheiden läpi ennen ruudulle piirtoa Eri vaiheet rinnakkaistetaan nopeuden saavuttamiseksi Pullonkaula määrää koko liukuhihnan nopeuden Liukuhihnassa kiinteitä ja sävyttimillä ohjelmoitavia vaihteita
Sovellusvaihe Liukuhihnan sovellusvaihe: Luetaan/luodaan mallit, kootaan piirrettävä data maailmankoordinaatistoon Karsinta, level of detail ja muut optimoinnit Voidaan tehdä myös osin myöhemmin sävyttimillä Lähetetään piirrettäväksi Muuttumattomasta datasta vain piirtokäsky Nykyraudalla olennaista minimoida API-kutsut ja piirtoraudan tilanvaihdokset Batching, piirtojärjestys
Geometriavaihe Liukuhihnan geometriavaihe: GPU tekee työn Verteksisävyttimillä: Siirrytään katsojan koordinaatistoon, jossa usein lasketaan vektoreita esim. valaistukseen Projektio Geometriasävyttimillä: Muunnetut kulmapisteet muutetaan sopivaksi määräksi kolmioita (tessellointi) Kiinteässä vaiheessa leikkaus ja valmistelu rasterointiin
Rasterointivaihe Liukuhihnan rasterointivaihe: Kiinteä vaihe kutsuu kullekin syntyvälle pikseliehdokkaalle pikselisävytintä interpoloiduin vektoriarvoin Lasketaan pikselin väri tekstuurien ja valaistusmallin avulla Z-puskuri (ja muut kiinteän vaiheen testit) ennen tai jälkeen pikselisävyttimen ajamisen Päivitetään videopuskuria
Geometriasävyttimet Geometriasävyttimet ottavat sisään yhden verteksisävyttimellä muokatun primitiivin pisteet ja siihen liittyvät muut tiedot Tuottavat mahdollisesti useampia monikulmioita Tesselloinnissa voidaan esim. antaa sisään vain pieni määrä ohjauspisteitä ja GS tuottaa sopivan määrän monikulmioita niiden pohjalta näin voidaan toteuttaa esim. LoD Myös varjoalueet voidaan luoda GS:llä
Epäsuora valaistus Realistinen grafiikka vaatii nykyään epäsuoran valaistuksen ottamista huomioon perinteinen tapa: ambientti termi 2000-luvulla: esilasketut valokartat tekstuureissa, varjokartat 2010-luku: dynaamiset ympäristöt estävät staattisten valokarttojen käytön Reaaliaikainen radiositeetti (esim. Frostbite 2) SSAO (screen-space ambient occlusion) Erilaiset 3d-ruudukkoa käyttävät menetelmät esim. Voxel Cone Tracing (Unreal Engine 4)
Varjot Yleensä käytössä varjokartat (shadow maps) piirretään z-puskuri valonlähteen näkökulmasta joss tarkasteltava fragmentti kauempana valosta kuin puskurin lähin este, se on varjossa lisäksi monia laajennoksia ja parannuksia jaettu (cascaded) varjokartta parantaa laatua eri puskurit eri etäisyyksille, resoluutio vaihtelee erilaiset suodatukset pehmeiden varjojen aikaansaamiseksi tekniikasta paljon erilaisia variaatioita
Viivästetty piirtäminen Monet nykyiset enginet käyttävät viivästettyä sävytystä (deferred shading) piirretään ensin geometria ruudun kokoiseen g- puskuriin normaalia z-puskuria käyttäen g-puskuriin laitetaan kaikki tieto, jota värin laskemiseen tarvitaan piirretään ruudun kokoinen neliö pikselin väri lasketaan g-puskurin perusteella tarvitsee ajaa fragmenttisävytin vain kerran/pikseli kukin valo vaikuttaa vain osaan ruudusta voidaan piirtää kutakin kohti monikulmio, jonka sisään valon frustumi jää
Laskostuminen Laskostuminen (aliasing) iso ongelma Useita ratkaisuja (*AA), esim.: FSAA (full screen): koko kuva tarkemmin + blur MSAA (multi-sample): hajanainen termi; kuin FSAA mutta hyödynnetään tulokset moneen pikseliin tai ylinäytteistetään vain Z/stencil MLAA (morphological): etsitään L:n muotoisia reunoja lopullisesta kuvasta; oletetaan että ne ovat syntyneet kolmioista ja pehmitetään vastaavasti Lisäksi temporal aliasing, ottaa ajan huomioon
Screen space -temput Muotia on tehdä monenlaisia efektejä näyttökoordinaatistossa (screen space, SS) Usein hyödynnetään kuvaa ja z-puskuria Näyttäviä efektejä halvalla, esim: MLAA edellä SSAO (SS Ambient Occlusion), SSDO SS self-shadowing (CryEngine) SS shadow mapping SS subsurface scattering
Uudelleenprojisointi Tallennetaan edellisen kuvan kameramatriisi Nyt voidaan laskea, missä kohtaa ruutua annettu fragmentti sijaitsi edellisessä kuvassa Voidaan hyödyntää edellistä kuvaa: jopa väri suoraan sieltä Liike-epäterävyys: lasketaan tämän perusteella fragmentin nopeus ruudulla; sumennetaan sen mukaan (suunta + mitä nopeampi, sitä sumeampi)
Kikkaesimerkki: heijastukset (CryEngine 3)
Mobiililaitteet Monissa mobiililaitteissa käytössä laatikkopohjainen (tile-based) piirto Ruutu jaetaan vakiokokoisiin suorakulmioihin, joista yksi käsitellään kerrallaan nopeassa muistissa Usein viivästetty piirto kaikki monikulmiot ensin talteen, päätellään mitkä näkyvät, pikselisävytin ajetaan vasta lopuksi Verteksi- ja pikselisävyttimet ehkä eri yksiköillä API-kutsujen minimointi kriittistä esim. tilanvaihdot (järjestä materiaalin mukaan)
Mobiililaitteet Iso kirjo erilaisia laitteita (erityisesti Android) näytön resoluutiot epämääräiset ajurit, pakkausstandardit Tasapainoilu CPU/GPU Akun käyttö yhtenä huolenaiheena 32-bit värikanavat usein liikaa Ei aina automaattista gammakorjausta Shaderien generointi eri ympäristöihin tarpeen
Sisä/ulkotilojen tekniikat Tässä kohtaa käsitellään Puhakan kalvoja...
Lisää ulkotiloista Ulkotilojen näkyvyys peittävyyspuskurilla (coverage buffer, CryEngine 3): pohjaksi edellisen kuvan z-puskuri pienennettynä max-suotimella CPU:lla testataan esineiden rajauslaatikko sitä vasten ja hylätään jos ei voi näkyä koska kamera on voinut liikkua, lasketaan missä puskurin pikselit sijaitsevat nyt + sumeutus jos ja kun jää kattamatonta aluetta, kaikki sillä näkyvä joudutaan piirtämään