Skip to article
RSS

~neon/thoughts

A blog about games, programming, and computers in general.

Sävytyksen ja rasteroinnin erottaminen reaaliaikaisessa kolmiohahmontamisessa

Posted on 2024-04-11 by Jens Pitkänen

This post is my undergrad thesis written in Finnish: a literature review on shading, rasterization, and how they may or may not be intertwined in real-time rendering. I wrote it between September and December 2021. The thesis contains an introduction to how real-time renderers tend to work, and brief overviews of the differences between regular old forward rendering, deferred and visibility-buffer-based rendering, as well as texture-space shading.

Notably missing is any mention of clustered approaches to either forward or deferred rendering, which I was vaguely aware of, but didn’t end up mentioning or studying further. That said, it’s not particularly tightly related to the rasterization-shading connection this thesis focuses on, more just a recent way to render stuff more efficiently, so I’m not too bothered. Just a little.

I originally intended to translate the whole thing into English (and I still might, one day), but now that I’ve not done it for two years, I thought I’d just post it in Finnish. One of the main things I like about the thesis are the translated terms anyway, so at least they’ll be on the internet now.

Finally, just as a little disclaimer, there may be typos or errors, I’m blind to the text after reading it so many times. Some might have been in the published thesis, other may have been introduced in the LaTeX to Markdown translation. In any case, I’d be glad to hear of any issues, and maintain some kind of errata here.

Tiivistelmä

Reaaliaikainen kolmiulotteisen grafiikan piirtäminen on 1970–luvulta asti tutkittu ongelma, jolle on keksitty tehostusratkaisuja sekä laitteiston että ohjelmiston kannalta. Suurin osa reaaliaikaisesta kolmiulotteisesta grafiikasta nykyään piirretään kolmiohahmontamisella, jossa kaksi merkittävää osaa ovat rasterisaatio, eli prosessi jolla kolmiot muutetaan pikseleiksi, ja sävytys, eli pikseleiden värien laskeminen.

Tässä tutkielmassa selvitetään kirjallisuuskatsauksen menetelmällä mitä kolmiohahmontaminen, sävytys ja rasterisaatio tarkalleen ovat, miksi sävytys ja rasterisaatio haluttaisiin erottaa ja miten menetelmät tämän toteuttamiseksi ovat kehittyneet ajan kanssa. Kirjallisuutena käytetään pääosin kirjoja, jotka kertovat reaaliaikaisesta kolmiohahmontamisesta yleisesti, sekä artikkeleita ja esitelmiä joissa aiheeseen liittyviä löytöjä on esitelty, erityisesti SIGGRAPH- ja Eurographics-konferensseissa.

Katsauksen tuloksena selviää, että rasterisaatio on ollut historiallisesti hyvin tehokas menetelmä kolmiohahmontamiseen, mutta sen hyödyt ovat ajan kanssa pienentyneet kolmiomäärien sekä näytönohjaimien tehojen noustessa. Rasterisaation ja sävytyksen erottaminen vaikuttaa olevan tehokas metodi rasterisaation ongelmien minimoimiseksi, säästäen kuitenkin sen hyviä puolia, kuten sen laskennallisen tehokkuuden laitteistokiihdytyksen seurauksena. Huomataan myös säteenseurantaprosessorien mahdollinen vaikutus rasterisaatiolaitteiston tarpeen vähentymiselle tulevaisuudessa.

1 Johdanto

Reaaliaikainen kolmiulotteinen grafiikka on nykyään jokapäiväinen näky. Kolmiulotteisia pelejä on saatavilla puhelimille, konsoleille ja tietokoneille. Useimmilla älypuhelimilla pystyy suorittamaan lisätyn todellisuuden sovelluksia, jotka voivat piirtää reaaliajassa esimerkiksi huonekaluja kameralla kuvattuun oikeaan ympäristöön. Viime vuosina yleistyneet virtuaalikonsertit ovat usein myös luotu reaaliaikaisella kolmiulotteisella grafiikalla, jossain tapauksissa jopa esiintyjää myöten. Elokuvissa tunnetusti käytetään tietokoneilla luotuja kuvia, mutta ne ovat historiallisesti laskettu kuvauksien jälkeen käyttäen huomattavasti aikaa. Viime vuosina reaaliaikainen grafiikka on kuitenkin kehittynyt tarpeeksi, että Mandalorian-sarjan [11] kuvauksissa käytettiin reaaliaikaista kolmiulotteista grafiikkaa sci-fi ympäristöjen valaistuksen simuloimiseksi.

Kolmiulotteinen grafiikka on laskennallisesti hyvin raskasta piirtää. Tietokoneiden ja puhelimien näytöille tyypillinen 1920 × 1080 resoluutio antaa jo suuntaa: jos pikselin värin laskemiseksi olisi jokin ohjelma, sitä pitäisi suorittaa noin kaksi miljoonaa kertaa yhden kuvan luomiseksi. Näyttöjen virkistystaajuudet vaihtelevat 30–240 Hz välillä, joten edellä mainittu kaksi miljoonaa kertautuukin mahdollisesti sadoiksi miljooniksi suorituksiksi sekunnissa. Nykyiset suorittimet suorittavat muutamia miljardeja syklejä sekunnissa, mutta noin sata sykliä pikseliä kohden riittää vain hyvin yksinkertaisen kuvan luomiseen, kymmenen ei siihenkään.

Pikselien laskenta on kuitenkin hyvin rinnakkaisesti laskettavissa. Tästä syystä kolmiulotteisen grafiikan laskentaan käytetään usein näytönohjaimia, apusuorittimia jotka sisältävät nykyään jopa tuhansia samanaikaisesti käytettävissä olevia laskentayksikköjä. Näytönohjaimet erityisesti sisältävät prosessoreita rasterointia varten, jonka avulla voidaan piirtää kolmiopohjaista grafiikkaa hyvin tehokkaasti.

Tässä tutkielmassa selvitetään kirjallisuuskatsauksen menetelmällä, mitä rasterisaatio ja sävytys tarkoittavat reaaliaikaisessa kolmiohahmontamisessa, miksi ne halutaan erottaa toisistaan hahmontamisprosessissa, millä menetelmillä ne on erotettu ja miten nämä menetelmät ovat muuttuneet ajan kanssa. Luvussa 2 esitellään reaaliaikaisen kolmiohahmontamisen rasterisaatiopohjainen arkkitehtuuri ja alustetaan syitä rasterisaation sekä sävytyksen erottamiselle. Luvuissa 3–5 esitellään menetelmiä joilla erottaminen voidaan tehdä, ja vertaillaan niiden vaikutuksia hahmontamisprosessiin.

2 Reaaliaikaisen kolmiohahmontamisen perusteet

Kolmiohahmontaminen (eng. triangle rendering) viittaa prosessiin, jossa muunnetaan kolmioista koostuva ympäristö pikseleiden väreistä koostuvaksi puskuriksi, joka voidaan näyttää kuvana esimerkiksi tietokoneen tai puhelimen ruudulla. Tässä luvussa kuvaillaan reaaliaikaisen kolmiohahmontamisen eri vaiheet pohjautuen Akenine-Möller et al. kirjaan Real-Time Rendering [1, s. 11–23, 103–148].

2.1 Kolmioihin pohjautuvat kolmiulotteiset ympäristöt ja rasterointi

Kuvan hahmontamista varten tarvitaan vähintään itse ympäristön koostavat kolmiot, sekä kamera. Kolmiohahmontamisessa kameralla viitataan sen ominaisuuksiin kolmiulotteisessa avaruudessa: missä se on, mihin se osoittaa, ja kuinka suuri kuvakulma sillä on. Kuvakulma vastaa oikeassa kamerassa linssin polttoväliä. Kuvassa 2.1 näkyy kolmiot, valo ja kamera jotka muodostavat ympäristön, jonka hahmontamista tarkastellaan tässä luvussa.

Kuva 2.1: Esimerkkiympäristön koostavat kolmiot, valo ja kamera.

Jokainen kolmio koostuu kolmesta verteksistä. Verteksi viittaa yhteen kolmion kulmaan liittyviin tietoihin, ja niihin sisältyy ainakin koordinaatti kolmiulotteisessa avaruudessa, ja yleensä jonkin verran kolmiokohtaisia ominaisuuksia joita käsitellään alempana. Kolmion sisäiset koordinaatit ja muut luvut voidaan laskea myöhemmin interpoloimalla arvot näiden kolmen verteksin luvuista.

Hahmontamisprosessi alkaa lähettämällä kameran ja kolmioiden tiedot näytönohjaimelle. Näytönohjaimella ensimmäisenä ajetaan verteksiohjelma (eng. vertex shader), joka ottaa sisääntulona yhden verteksin, tekee jonkinlaista laskentaa ja lopulta palauttaa mahdollisesti muunnetun verteksin. Verteksiohjelma voi myös käyttää verteksistä riippumattomia yhtenäismuuttujia (eng. uniform variables), jotka lähetetään näytönohjaimelle kolmioiden kanssa samaan aikaan. Verteksiohjelma ajetaan kaikkien kolmioiden vertekseille.

Verteksiohjelmalle annetaan yhtenäismuuttujana projektiomatriisi, joka voidaan laskea edellämainituista kameran ominaisuuksista. Projektiomatriisin avulla verteksiohjelmassa käännetään kolmiulotteiset kolmioiden koordinaatit kaksiulotteisiksi ruudulla oleviksi koordinaateiksi, vastaamaan virtuaalimaailmassa olevan kameran näkymää. Kuvassa 2.2 näkee esimerkkiympäristön projektion jälkeen.

Kuva 2.2: Projektion jälkeinen näkymä esimerkkiympäristöstä.
Kuva 2.3: Rasterisaation löytämät pikselit yhden kolmion osalta, ja sävytyksen jälkeen. Kolmannessa kuvassa näkyy, miten kuva alkaa täyttyä kun kolmioita käsitellään lisää.

Kun kolmiot ovat muunnettu kaksiulotteiseen koordinaatistoon, ne muutetaan pikseleiksi rasteroimalla. Rasteroinnissa selvitetään, mitä pikseleitä kukin kolmio koskee, ja tallennetaan kolmiota vastaava väri ruutupuskuriin (eng. framebuffer) näiden pikselien kohdalle. Näytönohjaimissa on rasterointia varten erityinen prosessori, ja sen toimintaan voi yleensä vaikuttaa vain hyvin rajatusti. Värin valinta tapahtuu erikseen ohjelmoitavassa sävytysohjelmassa (eng. fragment shader tai pixel shader). Kuvassa 2.3 esitellään, miten tämä prosessi alkaa projektion jälkeisistä kolmioista, ja piirtää kolmio kerrallaan lopullista kuvaa.

Kolmiot Verteksiohjelma Kolmioiden rasterointi Sävytysohjelma Pikselit ruudulle
Kuva 2.4: Hahmontamisen eri vaiheet.

Sävytysohjelma laskee värin perustuen esimerkiksi sävytettävän kolmion alkuperäisiin kolmiulotteisiin koordinaatteihin ja sen kuvaaman pinnan ominaisuuksiin, kuten väriin, heijastuvuuteen ja normaalivektoreihin. Näihin pinnan ominaisuuksiin viitataan usein termillä materiaali. Yleensä sävytyksessä otetaan huomioon myös joitain yksityiskohtia kolmion ympäriltä, kuten ympäristössä olevien valojen koordinaatit ja kirkkaudet. Nämä tiedot voidaan antaa yhtenäismuuttujina sävytysohjelmalle, samoin kuin kameran tiedot annetaan verteksiohjelmalle. Kolmion tietoihin ja ympäristöä kuvaaviin yhtenäismuuttujiin perustuen voidaan lopulta laskea, minkä väristä ja kuinka kirkasta valoa pinta heijastaa kohti kameraa, josta saadaan pikselin lopullinen väri.

Tässä luvussa käytetyn esimerkkiympäristön sävytyksen lopullinen tulos näkyy kuvassa 2.5. Vaikka tämän luvun aikana on esitelty kuvia eri vaiheista, on tärkeää muistaa, että vastaavia kuvia ei ole varsinaisesti olemassa näytönohjaimen muistissa missään vaiheessa. Kaikki yllämainittu laskenta tapahtuu rinnakkain, joten ainoat näytönohjaimen päämuistissa olevat tiedot ovat kolmiot joista lähdetään, ja näytölle lähetettävä ruutupuskuri.

Kuva 2.5: Hahmontamisen lopputulos esimerkkiympäristölle. Luotu Blender-mallinnusohjelmiston Eevee-hahmontajalla.

2.2 Reunojen aliasointi

Edellisen osion lopussa esitellyssä kuvassa on kuitenkin vielä yksi merkittävä ominaisuus, jota ei ole käsitelty. Rasterisaatiolla ei aina onnistuta luomaan aivan tarkkaa kuvaa annetuista kolmioista, koska kolmioiden reunat usein kulkevat pikselin sisällä. Ongelman näkee kun vertailee kolmioiden pysty- ja vaakasuuntaisia reunoja viistottaisiin reunoihin: pysty- ja vaakasuuntaiset reunat menevät pikseleiden kanssa yhdensuuntaisesti, jolloin kolmion muoto pysyy, mutta viistottaiset reunat jakavat jokaisen pikselin kahteen, jolloin pikselit muodostavat silmään pistävän ‘‘portaikon,’’ joka ei vastaa kolmion suoraa reunaa, kuten kuvassa 2.6 näkyy.

Kuva 2.6: Kuvassa näkyy aliasointia erityisesti kuution kirkkaasti valaistun kolmion ja varjossa olevan kolmion reunalla.

Tätä ongelmaa kutsutaan aliasoinniksi (eng. aliasing), ja sen estämistä antialiasoinniksi (eng. anti-aliasing), josta on esimerkki kuvassa 2.7. Edellisen osan päättänyt kuva 2.5 on myös antialiasoitu, joskin siinä on niin suuri resoluutio, että aliasointia ei välttämättä huomaisikaan. Crow’n artikkelissa [7] aliasoinnista ja sen estämisestä on esitelty kolme ehdotusta ongelman välttämiseksi:

  1. Resoluution nostaminen. Tämä on kuitenkin laskennallisesti hyvin kuormittavaa, koska sävytettävien pikselien määrä nousee. Tämä ei myöskään auta tilanteessa, jossa aliasointia ilmentyy suurimmalla resoluutiolla jota näyttö voi esittää.
  2. Kuvan pehmentäminen (eng. blurring) kokonaisuudessaan, ja reunoihin keskittyvät pehmennysalgoritmit. Nämä metodit kuitenkin saattavat peittää yksityiskohtia, ja yleisesti vähentää kuvan terävyyttä. Tälle alueelle sijoittuu ns. hahmontamisen jälkeiset antialiasointimenetelmät, kuten FXAA, fast approximate anti-aliasing [15], ja SMAA, subpixel morphological anti-aliasing [12]. Nämä ovat usein käytännöllisiä ottaa käyttöön riippumatta muun hahmontamisprosessin ominaisuuksista, koska algoritmi muokkaa lopullista kuvaa, joten kummatkin ovat yleisessä käytössä.
  3. Pikseleiden käsittely neliön muotoisina alueina, eikä yksittäisinä pisteinä. Pikselin väriksi siis määritellään sen sisältämien kolmioiden värien keskiarvo. Analyyttista lähestymistapaa on tutkittu esimerkiksi Catmullin artikkelissa [6], mutta se hidastuu nopeasti kolmioiden määrän noustessa. Numeerinen ratkaisu on usein käytännöllisempi, ja jo muutamalla näytteellä eri kohdista pikselin alueelta saadaan usein hyvä approksimaatio. Korkeammilla resoluutioilla ylimääräisten näytteiden ottaminen jokaiselle pikselille tulee kuitenkin nopeasti liian laskennallisesti raskaaksi. Käytännössä tähän antialiasointikategoriaan kuuluvat metodit ovat siis keskittyneet ottamaan mahdollisimman vähän näytteitä pikseliä kohti, mutta kuitenkin tarpeeksi että aliasoinnilta vältyttäisiin. Kaksi merkittävää lähestymistapaa tähän ovat MSAA [14], jossa otetaan useampia näytteitä vain kolmioiden reunoilta, ja TAA [19], jossa kierrätetään historiallisia näytteitä.
Kuva 2.7: Blender-mallinnusohjelmiston Eevee-hahmontajalla piirretyt kuvat, oikealla antialiasointi on päällä oletusarvojen mukaisesti. Kuvilla on yhtä suuri resoluutio.

MSAA, multi-sample anti-aliasing, on antialiasointimenetelmä joka vaatii pienen muutoksen rasterointiprosessiin: sävytettävä kolmio tarkistetaan useammasta pikselin sisäisestä pisteestä, jonka jälkeen voidaan suorittaa sävytysohjelma jokaiselle pikselin koskemalle kolmiolle erikseen, ja tämän jälkeen laskea sävytettyjen värien painotettu keskiarvo. Jos kaikki näytteet osuvat samaan kolmioon, sävytysohjelma tarvitsee suorittaa vain kerran.

MSAA siis ottaa enemmän näytteitä tarkkuuden vuoksi, mutta vain kolmioiden reunoilla, jotka ovat usein selkeiten aliasoiva kohta. Koska MSAA vaatii muutoksen rasterointiprosessiin, se on määritelty grafiikkaohjelmointirajapinnoille, ja näytönohjaimet on rakennettu vastaamaan sitä. Esimerkiksi OpenGL:n tapauksessa MSAA otetaan käyttöön ARB_multisample-laajennuksella [14].

TAA, temporal anti-aliasing, perustuu samaan konseptiin useammasta pikselin sisäisestä näyttestä kuin MSAA, mutta siinä näytteitä otetaan vain yksi jokaista hahmonnettua pikseliä kohden. Yang, Liu ja Salvi vertailevat erilaisia toteutuksia artikkelissaan [19], mutta ne kaikki pohjaavat samaan perusideaan. Algoritmi pohjautuu siihen, että jokaisessa kuvassa otetaan näyte hieman eri kohdasta jokaisen pikselin kohdalla, yhdistetään piirrettävän kuvan sekä edellisen kuvan painotettu näyte, ja tallennetaan tulos seuraavaa kuvaa varten. Kun näytteitä otetaan aina hieman eri kohdasta pikselin sisällä, ja yhdistetään edellisten painotettuun keskiarvoon, väri lähestyy ajan kanssa haluttua väriä.

TAA:in huono puoli tulee liikkuvista elementeistä, sillä mikäli kuvattu objekti liikkuu, sen alueella olevat pikselit eivät enää sovi algoritmille lisä-näytteiksi niiden pikselien osalta. Verrattuna MSAA:han, TAA parantaa myös kolmioiden sisäistä aliasointia, koska useampia näytteitä otetaan jokaiselle pikselille, ei vain sellaisille joihin vaikuttaa useampi kolmio.

2.3 Takaperin hahmontaminen ja ylipiirtäminen

Edellä kuvailtua prosessia kutsutaan etusuuntaiseksi hahmontamiseksi (eng. forward rendering), koska siinä aloitetaan ympäristön tiedoista, niiden pohjalta lasketaan pikselit jotka halutaan sävyttää, ja värit lasketaan kolmioiden määrittämässä järjestyksessä riippumatta siitä, missä osassa ruutua väritettävä pikseli on. Prosessissa siis siirrytään tunnetuista parametreista haluttuun tulokseen, eli kolmioista pikseleihin, ‘‘etusuuntaisesti.’’

Takaperin hahmontaminen toimii päinvastoin: lähdetään pikseleistä, ja lasketaan ympäristön tietojen pohjalta siihen pikseliin kuuluva väri, eli kuljetaan pikseleistä kolmioihin, ‘‘takaperin.’’ Esimerkki tästä olisi kokonaan säteenseurantaan (eng. raytracing) pohjautuva hahmontaja, joka ‘‘seuraisi sädettä’’ jokaisen pikselin kohdalta kamerasta ympäristöön, ja laskisi sen pohjalta pikselin värin.

Etusuuntainen hahmontaminen on kuitenkin huomattavasti suoraviivaisempi ongelma ratkaista yksinkertaisella aritmetiikalla. Tämä laskennallinen tehokkuus on todennäköinen syy reaaliaikaisen kolmiulotteisen grafiikan pysymiseen rasterisaatiopohjaisena tähän päivään asti.

Etusuuntaisella hahmontamisella on kuitenkin huonot puolensa: kun sävytysohjelmat monimutkaistuvat, hahmontamisen laskennallinen taakka nousee nopeasti. Otetaan esimerkiksi sävytysohjelma, joka on ohjelmoitu ottamaan huomioon paljon valoja ympäristössä. Jos sävytysohjelma laskee kaikkien valojen vaikutuksen pikselin väriin, sävytysohjelman aikavaativuus on suoraan verrannollinen valojen määrään.

Tästä päästään etusuuntaisen hahmontamisen ensimmäiseen heikkouteen: ylipiirtämiseen (eng. overdraw), jota Akenine-Möller et al. käsittelevät kirjassaan [1, s. 801–802]. Ylipiirtäminen viittaa tuhlattuun laskentaan, joka tapahtuu kun sävytysohjelmaa ajetaan kolmioille, joiden päälle myöhemmin sävytetään toinen kolmio. Jos sävytysohjelma on jo valmiiksi laskennallisesti raskas ajaa, sen ajaminen mahdollisesti moninkertaiselle määrälle pikseleitä — jotka eivät edes vaikuta lopputulokseen — tulee olemaan vielä raskaampaa. Hahmontamisen taakka tulee siis lopulta kasvamaan suhteessa valojen määrään, kerrottuna ylipiirtämisen aiheuttamalla kertoimella. Tämä on erityisen vaikea yhdistelmä, kun sekä valojen että kolmioiden määrät ovat tekijöitä, joiden rajoittaminen vaikuttaa suoraan hahmonnettavien ympäristöjen visuaaliseen ilmeeseen.

Ylipiirtämisen hintaa voi kuitenkin keventää jakamalla hahmontamisen useampiin hahmontamiskierroksiin, joista ensimmäisellä kerralla luotua syvyyspuskuria (eng. depth buffer) kierrätetään seuraavien kierroksien aikana, kuten Akenine-Möller et al. kuvailevat kirjassaan [1, s. 881–882]. Syvyyspuskuri sisältää jokaisen pikselin etäisyyden kamerasta, jonka avulla seuraavat hahmontamiskierrokset voivat hypätä taakse jäävien pikselien sävytyksen yli vertaamalla käsiteltävän pikselin syvyyttä syvyyspuskurissa olevaan. Useammissa hahmontamiskierroksissa kuitenkin nousee ongelmaksi ylimääräinen kolmioiden prosessointi: kolmiot on rasteroitava monta kertaa, jotta pystytään toistamaan sävytys-askel erilaisilla sävytysohjelmalla tai perustuen aiemmin hahmonnettuihin puskureihin.

Ylipiirtäminen ja ylimääräinen kolmioiden prosessointi ovat siis merkittäviä ongelmia, jotka nousevat rasterisaation ja sävytyksen yhteydestä toisiinsa. Huomataan kuitenkin, että rasterisaation tulos on usein sama: ympäristön kolmiot ja kamera eivät muutu kesken hahmontamisen. Olisi siis huomattavasti tehokkaampaa, jos voitaisiin jotenkin jakaa rasterisaation tulos useamman sävytyskierroksen välillä. Jotta rasterisaation tulos voitaisiin jakaa useamman sävytyksen välillä, rasterisaatio pitäisi pystyä tekemään erikseen, ja sävytys pitäisi pystyä tekemään ilman rasterisaatiota. Seuraavissa luvuissa tutkitaan erilaisia lähestymistapoja, joilla tämä voidaan toteuttaa.

3 Viivästetty hahmontaminen

Viivästetty hahmontaminen (eng. deferred rendering) on hahmontamismenetelmä, joka nousi suosioon 2010–luvun alussa, ja on pysynyt laajassa käytössä aina nykypäivään asti. Viivästetyssä hahmontamisessa hahmontamisprosessi jaetaan kahteen vaiheeseen: ensimmäisessä vaiheessa laskennallinen kuorma keskittyy rasterisaatioon, toisessa sävytykseen. Menetelmän on esitellyt mm. Akenine-Möller et al. kirjassaan Real-Time Rendering [1, s. 883–888], ja Sellers, Wright ja Haemel kirjassaan OpenGL SuperBible [17, s. 548–558].

Viivästetyssä hahmontamisessa piirretään aluksi ympäristö muuten samaan tapaan kuin etusuuntaisessa, paitsi että siinä ei oteta valoja vielä huomioon, ja ruutupuskurin sijaan sävytysohjelma tallentaa G-puskuriin (eng. GBuffer). Puskuriin tallennetaan tietoja sävytettävästä kohdasta, kuten sen kolmiulotteinen paikkakoordinaatti, normaalivektorit ja materiaalitiedot. Kuvassa 3.1 nähdään, miten puskureiden sisältö vastaa lopullista ruutupuskuria: jokaisessa koordinaatissa olevan pikselin takana oleva kolmio on sama, tallennetun tiedon merkitys eri.

G-puskurin hahmontamisen jälkeen hahmontamisprosessi toistetaan jokaiselle valolle niin, että sävytysohjelma ajetaan vain kerran jokaiselle pikselille, ja se muokataan käyttämään G-puskurin tietoja alkuperäisten kolmioiden sijaan. Koska G-puskuriin on tallennettu kaikki tarvittu kolmiokohtainen tieto jokaiselle pikselille, valon vaikutus jokaiseen pikseliin voidaan nyt laskea suoraan sen perusteella, ilman että alkuperäisiä kolmioita tarvitsee rasterisoida uudelleen.

Kuva 3.1: Pintojen perusvärit ja normaalivektorit tallennetaan yleisesti G-puskureihin. Normaalivektorit eivät kuvaa minkään tietyn asian väriä, vaan punaisen, sinisen ja vihreän värin arvoihin sijoitetaan normaalivektoreiden x-, y- ja z-komponentit.

Viivästetty hahmontaminen on laskennallisesti tehokkaampaa kuin etusuuntainen hahmontaminen, koska ympäristön koostavat kolmiot täytyy rasteroida vain kerran, riippumatta siitä kuinka monta sävytyskierrosta tehdään valojen laskemiseksi. Ylipiirtäminen ei myöskään haittaa yhtä paljon, koska suurin osa sävytysohjelmien laskennasta tapahtuu jälkimmäisillä sävytyskierroksilla, joilla ylipiirtämistä ei tapahdu ollenkaan. Viivästetty hahmontaminen on siis suhteellisen suoraviivainen tapa välttää edellisessä luvussa esitellyt tehokkuusongelmat, ja sen keskeinen idea on jakaa ympäristön kolmioiden rasterointi ja valojen sävytys eri hahmontamisaskeliin, jolloin ne eivät hidasta toisiaan.

Kolmiot Verteksiohjelma Kolmioiden rasterointi Sävytysohjelma G-puskuri G-puskuri Sävytysohjelma Pikselit ruudulle
Kuva 3.2: Viivästetyn hahmontamisen kaksi vaihetta ja tiedon kulku niiden välillä. Ensimmäinen sävytysohjelma oikealla on muistiliikennepainotteinen, toinen on laskentapainotteinen. Teknisesti myös toista sävytysohjelmaa edeltää verteksiohjelma ja rasterointi, mutta niiden aikavaativuus on vakio: tarkoituksena on vain päästä sävyttämään jokainen pikseli yhden kerran.

Viivästetyssä hahmontamisessa on kuitenkin myös huonot puolensa. Ympäristön kolmioille ajettavan sävytysohjelman tallentamat tiedot pitää tallentaa jokaiselle pikselille, joten muistia tarvitaan paljon. Esimerkiksi Garawanyn esitelmässä [9] Uncharted 4:n valaisumenetelmistä esitellään 64-bittisiä G-puskureita, joita kolmion ominaisuuksista riippuen tarvitaan 2 tai 3, eli 128–196 bittiä pikseliä kohti. Tämä on merkittävä määrä, esimerkiksi verrattuna ruutupuskurille yleiseen 24 bittiin pikseliä kohti. Tämä johtaa suureen määrään varattua muistia sekä tiedonsiirtoa, jota ei nähdä ollenkaan etusuuntaisessa hahmontamisessa.

Lisäksi, koska lopullisen värin sävytyksessä käytetään kuvatusta ympäristöstä riippumattomia kolmioita, viivästetty hahmontaminen ei yleisesti voi hyödyntää MSAA:ta suoraviivaisesti. Aikaisissa versioissa menetelmästä — kuten Engelin [8] esittelemässä — tehtiin vielä viimeinen sävytyskierros varsinaisilla ympäristön kolmioilla, jolloin valojen vaikutus saatiin laskettua tehokkaammin, ja lopullista kuvaa varten saatiin MSAA käyttöön. Viivästetyssä hahmontamisessa kuitenkin jokainen ylimääräinen rasterisaatiokierros on merkittävä hidaste: kaksi rasterisaatiokierrosta verrattuna yhteen johtaa maksimaalisen kolmiomäärän puolittumiseen.

Kuten Lei Yang, Shiqiu Liu ja Marco Salvi kertovat artikkelissaan [19], TAA:ista onkin tullut tyypillisempi valinta viivästetyn hahmontamisen yhteydessä. TAA sopii hyvin viivästetylle hahmontamiselle, koska se on periaatteeltaan samankaltainen kuin MSAA, mutta se ei tarvitse erillistä tukea rasterisaation yhteydessä, joten sen kanssa riittää tehdä yksi rasterisaatiopainotteinen hahmontamiskierros. Myös edellämainittu Uncharted 4 [18] käyttää TAA-menetelmää antialiasointiin.

Lopulta, viivästetty hahmontaminen ei käsittele läpinäkyviä kolmioita ollenkaan: lopullisen värin sävytysvaiheessa tiedetään vain kaikkein lähimpänä olevasta kolmiosta, jonka tiedot tallennettiin G-puskuriin. Läpinäkyvät kolmiot pitää siis hahmontaa kaiken muun jälkeen etusuuntaisesti.

4 Näkyvyys-pohjainen hahmontaminen

Vuonna 2013 Burns ja Hunt esittelivät näkyvyyspuskurin (eng. visibility buffer) artikkelissaan The Visibility Buffer: A Cache-Friendly Approach to Deferred Shading [5]. Näkyvyyspuskuri on variaatio viivästetyn hahmontamisen G-puskurista, joka käyttää huomattavasti vähemmän muistia, mutta maksaa siitä suuremman laskentakuorman muodossa.

Näkyvyyspuskuri ei sisällä kolmioiden tietoja kuten G-puskuri, vaan siihen tallennetaan sävytettävään kolmioon viittaava indeksi, kuten kuvassa 4.1 on visualisoitu. Tämän jälkeen luodaan erillinen lista kolmioista joihin näkyvyyspuskurissa viitataan, joka annetaan yhtenäismuuttujana seuraaville sävytysohjelmille. Lopullisen värin laskevissa sävytysohjelmissa haetaan kolmion tiedot yhtenäismuuttujana annetusta kolmiopuskurista, perustuen näkyvyyspuskurissa olevaan indeksiin.

Perinteisesti sävytysohjelma saa kolmion tiedot valmiiksi interpoloituna näytönohjaimelta: esimerkiksi pikselin koordinaatti kolmiulotteisessa avaruudessa perustuu verteksiohjelman määrittämiin kärkipisteisiin. Näkyvyyspuskurin kanssa tämä pitää tehdä manuaalisesti sävytysohjelmassa, joka nostaa hieman laskennallista taakkaa, mutta Burnsin ja Huntin [5] mukaan tämä ei ole merkittävä hidaste.

Kuva 4.1: Esimerkki näkyvyyspuskurista. Kuten normaalivektoreita tallentavien G-puskurien tapauksessa, pikseliin tallennettava tieto ei kuvaa mitään varsinaista väriä. Näkyvyyspuskurin keskeinen ominaisuus on, että pikseliin tallennettu arvo on — tai siitä on selvitettävissä — pikselin kohdalla näkyvän kolmion indeksi yhtenäismuuttujana annettavaan kolmiopuskuriin.
Valmiiksi muunnetut ympäristön kolmiot Verteksiohjelma Kolmioiden rasterointi Sävytysohjelma Näkyvyyspuskuri Sävytysohjelma Pikselit ruudulle
Kuva 4.2: Näkyvyys-pohjaisen hahmontamisen kaksi vaihetta. Työnjako on samankaltainen kuin viivästetyssä hahmontamisessa, mutta muistiliikenne jakautuu enemmän ensimmäisen ja toisen sävytysohjelman välille.

Näkyvyyspuskurin vaatima yhtenäismuuttujana annettava lista lopullisista kolmioista aiheuttaa kuitenkin jonkin verran ongelmia, jotka voivat selittää sen suhteellisen vähäisen suosion viime vuosiin asti. Normaalisti verteksiohjelmassa muunnetaan kolmioita sävytystä varten ilman, että niitä tarvitsee tallentaa mihinkään puskuriin. Esimerkkinä tästä on projektiomatriisilla tehty projektio-operaatio, mutta myös kolmiomallien animaatiot toteutetaan usein tässä vaiheessa. Koska näkyvyyspuskuri vaatii listan kolmioista lopullisessa muodossaan, nämä muunnokset pitää tehdä erikseen ja tallentaa jonkinlaiseen puskuriin, johon lopulliset sävytysohjelmat voivat viitata. Toinen vaihtoehto on muuntaa verteksit sävytysohjelmassa, mutta vierekkäiset pikselit viittaavat usein samaan kolmioon, joten sävytysohjelmassa toistettaisiin paljon laskentaa turhaan.

On myös huomioitava, että alkuperäisessä artikkelissa [5] esitellyt hyödyt ilmenivät erityisesti alustoilla, joilla on erityisen rajattu kaistanleveys suhteessa laskennalliseen tehokkuuteen. On siis täysin mahdollista, että näkyvyyspuskuri ei yksinkertaisesti parantanut laskentatehokkuutta artikkelin julkaisun jälkeen yleistyneillä alustoilla.

Brian Karis, Rune Stubbe ja Graham Wihlidal käsittelevät näkyvyyspuskurin hyötyjä uudemmasta perspektiivistä esitelmässään Nanite-hahmontajasta [13], jonka motivaationa on mahdollistaa erittäin suurien kolmiomäärien hahmontaminen reaaliajassa. Esitelmässä kerrotaan, että näkyvyyden erottaminen materiaaleihin liittyvästä laskennasta on tärkeä osa Naniten arkkitehtuuria, koska halutaan minimoida ylipiirtämisen ja pikselineliöiden (eng. pixel quad) aiheuttama turha laskenta.

Pikselineliö viittaa neljästä vierekkäisestä pikselistä koostuvaan ryhmään, jonka sisältämät pikselit lasketaan usein samanaikaisesti. Kun kolmioita on useampi kuin yksi pikselineliötä kohti, jokaiselle kolmiolle lasketaan joka tapauksessa kaikki pikselineliön sisältämät neljä pikseliä, vaikka kolmiot olisivat vain yhden pikselin kokoisia. Kun kolmioita on saman verran näkyvillä kuin pikseleitä, pikselineliöt käytännössä nelinkertaistavat laskentakuorman ilman minkäänlaista hyötyä.

Nanite-hahmontaja kuitenkin käyttää näkyvyyspuskuria vain rasterisaation tehostamiseksi: näkyvyyspuskurin pohjalta luodaan toisessa sävytyskierroksessa G-puskuri, ja itse värin laskevat sävytyskierrokset toimivat samoin kuin viivästetyssä hahmontamisessa tämän jälkeen. Esitelmässä mainitaan, että G-puskurilla on vielä hyötynsä näkyvyyspuskurin kanssa, mutta sen tehokkuudesta suhteessa pelkkään näkyvyyspuskuriin ei oteta kantaa.

5 Tekstuuriavarudessa hahmontaminen

Tekstuuriavaruudessa hahmontaminen (eng. texture-space rendering) ja tekselisävyttäminen (eng. texel shading), viittaavat hahmontamismenetelmään, jossa sävytys tehdään ennen rasterisaatiota. Tämä saadaan aikaan sävyttämällä kaikki ympäristössä olevat pinnat valmiiksi tekstuureihin, joista haetaan valmiiksi sävytetty väri varsinaisen rasterisaation yhteydessä. Menetelmä ei ole laajassa käytössä, mutta se on esimerkki hyvin erilaisesta lähestymistavasta sävytyksen ja rasterisaation erotteluun. Variaatioita tekstuuriavaruudessa hahmontamisesta esittelevät Akenine-Möller et al. kirjassaan [1, s. 908–913], Hillesland ja Yang paperissaan [10] ja Baker esitelmässään [3].

Tekstuurilla (eng. texture) viitataan näytönohjaimen muistissa olevaan kuvaan, josta voidaan hakea pikseleiden värejä sävytysohjelman aikana. Yleisesti tekstuureja käytetään pintojen materiaalien määrittelyyn tarkemmin kuin mitä kolmioilla voidaan järkevästi esittää. Esimerkiksi kuvassa 2.5 olevan laatikon sivut koostuvat vain kahdesta kolmiosta, mutta sen pinnassa on silti yksityiskohtainen kuvio. Tämä on saatu aikaan tekstuureilla: kolmioiden vertekseihin on tallennettu UV-koordinaatit, jotka kertovat, mikä osa tekstuurista pitäisi näkyä kolmion alueella. Sävytysohjelmassa voidaan hakea tekstuurin väri UV-koordinaattien määrittämästä kohdasta, ja käyttää sitä pinnan värinä, kuten kuvassa 5.1 esitellään. Tekstuurit ovat tehokas tapa lisätä helposti muokattavia yksityiskohtia kolmioihin, jotka olisivat muuten yksivärisiä tai kokonaan algoritmisesti väritettyjä.

Kuva 5.1: Vasemmalla on kolmio, jonka pikseleitä sävytetään. Keskellä näkyy, mihin tämän kolmion vertekseihin tallennetut UV-koordinaatit viittaavat tekstuurissa. Oikealla olevassa kuvassa kolmio on sävytetty, ja nähdään miten UV-koordinaattien määrittelemä osa tekstuurista päätyy sävytettävän kolmion alueelle.
Valojen tiedot Kolmioiden tiedot Sävytysohjelma Sävytystekstuuri Ympäristön kolmiot Verteksiohjelma Kolmioiden rasterointi Sävytysohjelma Pikselit ruudulle
Kuva 5.2: Tekstuuriavaruudessa hahmontamisen eri vaiheet. Vasemmalla on itse pintojen värit laskeva osa, ja sen sävytysohjelmaan kuluu suurin osa laskennasta. Oikealla oleva sävytysohjelma vain hakee värin sävytystekstuurista. Valojen tiedot annetaan edellisten menetelmien tapaan yhtenäismuuttujana. Kolmioiden tiedot annetaan erillisessä puskurissa G-puskurin ja näkyvyyspuskurin tapaan.

Tekstuuriavaruudessa hahmontamisessa sävytys tehdään omana vaiheenaan, ennen rasterointia kameran perspektiivistä. Sävytysohjelma ajetaan suurelle tekstuurille, jossa on omat alueet kaikille ympäristössä näkyville kolmioille, johon tullaan seuraavaksi viittaamaan sävytystekstuurina. Tekstuurin jakamismenetelmä vaihtelee, ja siinä voidaan laskentatehon säästämiseksi ottaa huomioon esimerkiksi kolmion näkyvyys ja etäisyys kamerasta.

Samaan tapaan kuin viivästetyn hahmontamisen valotusaskeleessa, kolmioiden tiedot eivät ole saatavilla suoraan verteksiohjelmasta, koska tässä yhteydessä ei rasteroida ympäristön kolmioita. Kolmioiden tiedot siis haetaan G-puskurin ja näkyvyyspuskurin kaltaisesta erillisestä puskurista, johon ne on laskettu etukäteen. Tekstuuriavaruudessa hahmontamisessa kolmioiden tiedot tai indeksit sisältävä puskuri ei kuitenkaan vastaa ruutupuskuria, vaan sävytystekstuuria, eli kolmioiden tiedot sisältävässä puskurissa on yksi alkio jokaista sävytystekstuurin pikseliä kohden.

Sävytysohjelma toimii kuten viivästetyn hahmontamisen valottamisvaiheen sävytysohjelma, eli kolmion tiedot haetaan suoraan puskurista, ja väri lasketaan perustuen kolmion ja ympäristön tietoihin. Toisin kuin viivästetyssä hahmontamisessa, väri tallennetaan ruutupuskurin sijaan sävytystekstuuriin. Sävytystekstuuriin siis värittyy jokaiselle kolmiolle valmiiksi sävytetyt pikselit niiden UV-koordinaattien määrittelemille alueille.

Tämän jälkeen kuva hahmonnetaan normaalisti, rasteroiden ympäristön kolmiot kameran perspektiivistä. Tämän jälkimmäisen vaiheen sävytysohjelmassa haetaan valmis väri sävytystekstuurista UV-koordinaattien määrittämästä kohdasta. Varsinainen sävytys siis tapahtuu ennen rasterisaatiota, ja rasterisaatiovaiheessa vain haetaan esiaskeleessa laskettu väri, kuten kuvassa 5.2 nähdään.

Koska rasterisaatiovaihe on merkittävän nopea, korkeat resoluutiot ja MSAA monilla näytteillä sopivat hyvin tähän menetelmään. Baker huomioi myös esitelmässään [3], että sävytysaskeleen voi suorittaa harvemmin kuin rasterisaatioaskeleen, koska sävytyksen tulos ei merkittävästi muutu muutaman peräkkäisen kuvan välillä. Tekstuuriavaruudessa hahmontamisen laskennallista kuormaa on siis helppo keventää sävyttämällä harvemmin, ja sävytystekstuurin resoluutiota voidaan jossain määrin pienentää, säilyttäen silti lopullisen rasteroidun kuvan resoluution. Sävytystekstuurin resoluution pienentäminen toki vaikuttaa kuvan laatuun, ja harvemmin sävyttäminen voi heikentää liikkuvan kuvan illuusiota, kun kamera liikkuu merkittävästi.

Verrattuna muihin tässä tutkielmassa käsiteltyihin menetelmiin, tekstuuriavaruudessa hahmontaminen jakaa sävyttämisen ja rasterisaation eniten erilleen, mutta vaatii myös kaikkein eniten ylimääräistä laskentaa menetelmän mahdollistamiseksi. Tätä erillisyyttä alleviivaa edellä mainitut mahdollisuudet sävyttää eri tahdissa ja vaihtelevilla resoluutioilla, vaikuttamatta varsinaisen ruudulle rasteroitavan kuvan virkistystaajuuteen tai resoluutioon.

Esimerkiksi virtuaalitodellisuudessa on tärkeää, että ruudulle saadaan uusi kuva tasaisesti ja pienellä latenssilla, joten jonkinlainen variaatio tekstuuriavaruudessa hahmontamisesta voisi sopia tähän käyttötapaukseen. Baker toisaalta mainitsee esitelmässään [3], että erityisesti virtuaalitodellisuuden tapauksessa sävytysaskel kannattaa suorittaa mahdollisimman usein, koska liikkuvan kuvan illuusion säilyttäminen on erityisen tärkeää virtuaalitodellisuudessa. Virtuaalitodellisuuden tapauksessa tehostus siis rajoittuu sävytystekstuurin resoluution pienentämiseen.

Tekstuuriavaruudessa hahmontamisessa pintojen värien sävytyksen vaatima laskentateho kuitenkin yleisesti nousee verrattuna muihin hahmontamismenetelmiin, johtuen rasterisaation hyötyjen puutteesta. Rasterisaatio säästää kameran ulkopuolelle jäävien, kamerasta pois päin osoittavien ja joissain määrin myös muiden kolmioiden taakse jäävien pintojen sävyttämisen. Koska tekstuuriavaruudessa hahmontamisessa ei tehdä kameraan pohjautuvaa rasterisaatioaskelta sävytyksen yhteydessä, joudutaan sävyttämään myös nämä piilossa olevat pikselit. Eri toteutukset keventävät taakkaa eri tavoin, mutta tämä tehokkuusongelma on todennäköisesti merkittävä syy tekstuuriavaruudessa hahmontamisen vähäiselle käytölle reaaliaikaisessa kolmiohahmontamisessa.

6 Yhteenveto

Tässä tutkielmassa on esitelty reaaliaikaisen kolmiohahmontamisen eri vaiheet, ja kolme eri menetelmää erottaa rasterisaatio ja sävytys toisistaan. On myös vertailtu niiden hyötyjä ja haittoja, liittyen niiden suhteellisiin tehokkuuksiin erilaisissa tilanteissa.

Joissain määrin viivästynyt hahmontaminen on korvannut perinteisen etusuuntaisen hahmontamisen, ja näkyvyyspuskuri — mahdollisesti G-puskurin kanssa — saattaa tulla korvaamaan pelkän G-puskurin, kun kolmiomalleja aletaan luomaan yksityiskohtaisemmiksi ja kolmiotiheydet suhteessa resoluutioon nousevat. Näitä eri hahmontamismenetelmiä voisi siis kuvailla eri vaiheina reaaliaikaisen kolmiohahmontamisen kehityksessä. Tehostamisen ehdot ovat kuitenkin muuttuneet erilaisten teknologioiden noustessa suosioon: esimerkiksi virtuaalitodellisuutta varten tehdyissä ohjelmissa on siirrytty laajalti pois minkään muotoisesta viivästetystä hahmontamisesta, koska korkeat resoluutiot ja MSAA ovat erityisen tärkeitä virtuaalilasien näyttämän kuvan laatuun, ja nämä kaksi ominaisuutta eivät toimi hyvin viivästetyn hahmontamisen kanssa. Vastaavasti tekstuuriavaruudessa hahmontamisen voisi nähdä näin yleiskatsauksen pohjalta sopivan virtuaalitodellisuuteen, mutta menetelmä ei ole nähnyt laajaa käyttöä tästä huolimatta.

Toisaalta esimerkiksi viimeaikaiset kehitykset näytönohjaimien kiihdyttämässä säteenseurannassa — kuten NVIDIA:n RTX-näytönohjaimissa [4] — ovat tuoneet säteenseurannan muotiin, mutta rajatuilla resoluutioilla. Mahdollisesti säteenseurannan innottamana, viime vuosina on kehitetty hahmontamisen jälkeisiä kuvansuurennusalgoritmeja kuten DLSS [16] ja FSR [2]. Pienempien resoluutioiden mukana myös erilaiset viivästetyt hahmontamismenetelmät muuttuvat jälleen hyvin tehokkaaksi vaihtoehdoksi, kun G-puskurin muistivaatimukset pienenevät. Säteenseuranta on myös vahvasti riippuvainen rasterisaation ja sävytyksen erottamisesta: kun laskentateho juuri riittää muutaman säteen laskemiseksi jokaista pikseliä kohti, ylipiirtämiseen ei kannata tuhlata yhtään säteenseurantalaskentaa.

Yksi perspektiivi reaaliaikaisen kolmiohahmontamisen kehityksessä on myös siirtymä etusuuntaisesta takaperin hahmontamiseen: vanhemmat menetelmät toimivat etusuuntaisesti sen yksinkertaisuuden ja kiihdyttämismahdollisuuksien vuoksi, mutta ajan kanssa on lähestytty takaperin hahmontamista. Rasterisaation ja sävytyksen erottamisen voi nähdä tietynlaisena kompromissina, jossa rasteroimalla haetaan valmiiksi tiedot, joita takaperin toimiva sävytysohjelma voi hyödyntää. Säteenseurantaprosessorien yleistyminen taas suoraan vie tarvetta rasteroinnille, ja tästä näkyykin jo esimerkki varjojen tapauksessa: säteenseurantaan pohjautuvat varjot ovat uusimmissa hahmontajissa korvaamassa perinteisemmät rasteroituihin varjokarttoihin pohjautuvat varjot.

Tässä kirjallisuuskatsauksessa on siis selvitetty, että rasterisaatio ja sävytys ovat kaksi merkittävää osaa reaaliaikaisen kolmiohahmontamisen arkkitehtuurissa, joiden liitännäisyys toisiinsa on keskeinen osa tätä arkkitehtuuria. Niiden erottamiseen on kuvailtu kolme erilaista lähestymistapaa, jotka tekevät vaihtelevia kompromisseja muistin käytön ja sävytyslaskennan tehostamisen välillä. On myös huomattu, että jotkut näistä kompromisseista sopivat eri käyttötapauksiin paremmin kuin toiset, joten perusteltua yleistä paremmuusjärjestystä ei pystytä luomaan.

Lähteet

  1. T. Akenine-Möller, E. Haines, N. Hoffman, A. Pesce, M. Iwanicki ja S. Hillaire. Real-Time Rendering 4th Edition. Boca Raton, FL, USA: A K Peters/CRC Press, 2018. ISBN: 978-1-13862-700-0.
  2. AMD. AMD FidelityFX Super Resolution. 2021. URL: https://gpuopen.com/fidelityfx-superresolution/ (viitattu 24.10.2021).
  3. D. Baker. ”Object Space Lighting”. Game Developers Conference (2016). URL: https://oxidegames.com/wp-content/uploads/2016/03/Object-Space-Lighting-Rev-21.pdf (viitattu 13.12.2021).
  4. J. Burgess. ”RTX on—The NVIDIA Turing GPU”. IEEE Micro 40.2 (2020), s. 36–44. DOI: 10.1109/MM.2020.2971677.
  5. C. A. Burns ja W. A. Hunt. ”The Visibility Buffer: A Cache-Friendly Approach to Deferred Shading”. Journal of Computer Graphics Techniques (JCGT) 2.2 (2013), s. 55–69. ISSN: 2331-7418. URL: http://jcgt.org/published/0002/02/04/ (viitattu 24.10.2021).
  6. E. Catmull. ”A hidden-surface algorithm with anti-aliasing”. Teoksessa: Proceedings of the 5th Annual Conference on Computer Graphics and Interactive Techniques. SIGGRAPH ’78. ACM, 1978, s. 6–11. DOI: 10.1145/800248.807360.
  7. F. C. Crow. ”The Aliasing Problem in Computer-Generated Shaded Images”. Communications of the ACM 20.11 (1977), s. 799–805. ISSN: 0001-0782. DOI: 10.1145/359863.359869.
  8. W. Engel. ”The Light Pre-Pass Renderer: Renderer Design for Efficient Support of Multiple Lights”. Teoksessa: Advances in Real-Time Rendering in 3D Graphics and Games. SIGGRAPH ’09. ACM, 2009. DOI: 10.1145/1667239.1667243.
  9. R. E. Garawany. ”Deferred Lighting in Uncharted 4”. Teoksessa: Advances in Real-Time Rendering in Games. SIGGRAPH ’16. ACM, 2016. DOI: 10.1145/2897826.2940291.
  10. K. E. Hillesland ja J. C. Yang. ”Texel Shading”. Teoksessa: EG 2016 - Short Papers. The Eurographics Association, 2016. DOI: 10.2312/egsh.20161018.
  11. J. Holben. ”The Mandalorian: This Is the Way”. American Cinematographer (2020). URL: https://ascmag.com/articles/the-mandalorian (viitattu 24.10.2021).
  12. J. Jimenez, J. I. Echevarria, T. Sousa ja D. Gutierrez. ”SMAA: Enhanced Morphological Antialiasing”. Computer Graphics Forum 31.2 (2012). ISSN: 1467-8659. DOI: 10.1111/j.1467-8659.2012.03014.x.
  13. B. Karis, R. Stubbe ja G. Wihlidal. ”A Deep Dive into Nanite Virtualized Geometry”. Teoksessa: Advances in Real-Time Rendering in Games. SIGGRAPH ’21. ACM, 2021. URL: https://advances.realtimerendering.com/s2021/index.html (viitattu 24.10.2021).
  14. D. Kirkland, B. Armstrong, M. Gold, J. Leech ja P. Womack. ARB_multisample. Khronos Group, OpenGL ARB Extension #5. 2002. URL: https://www.khronos.org/registry/OpenGL/extensions/ARB/ARB_multisample.txt (viitattu 24.10.2021).
  15. T. Lottes. FXAA. Tekninen raportti. NVIDIA, 2011. URL: http://developer.download.nvidia.com/assets/gamedev/files/sdk/11/FXAA_WhitePaper.pdf (viitattu 24.10.2021).
  16. NVIDIA. NVIDIA DLSS 2.0: A Big Leap In AI Rendering. 2020. url: https://www.nvidia.com/en-us/geforce/news/nvidia-dlss-2-0-a-big-leap-in-ai-rendering/ (viitattu 24.10.2021).
  17. G. Sellers, Richard S. Wright, Jr. ja N. Haemel. OpenGL SuperBible Sixth Edition. Addison-Wesley, 2013. ISBN: 978-0-321-90294-8.
  18. K. Xu. ”Temporal Antialiasing in Uncharted 4”. Teoksessa: Advances in Real-Time Rendering in Games. SIGGRAPH ’16. ACM, 2016. DOI: 10.1145/2897826.2940291.
  19. L. Yang, S. Liu ja M. Salvi. ”A Survey of Temporal Antialiasing Techniques”. Computer Graphics Forum 39.2 (2020). ISSN: 1467-8659. DOI: 10.1111/cgf.14018.