TIES471 Reaaliaikainen renderöinti
Kotitehtävä
2.3.3 Muistin kaistanleveys Koko kaistanleveyden kustannus: B = d * Zr + o(d) * (Z w + C w + T r ) Lisätään vielä tekstuuri välimuisti (texture cache) vaikutus m b = d * Z r + o(d) * (Z w + C w + m * T r ) = d * Z r + o(d) * Z w + o(d) * C w + o(d) * m * T r = B w + B c + B t = rasterointi yhtälö Esimerkki m = 1, d = 6, T r = 128 tavua, C w = Z r = Z w = 4 tavua b = 6 * 4 + (1 + 1 + 1 + 1 + 1 + 1 ) * (4 + 4 + 128) 2 3 4 5 6 = 357 tavua per pikseli Esimerkki m = 0.25 b = 122 tavua per pikseli Rasteroitaessa 72 fps FullHD resoluutiolla 72 * 1920 * 1080 * 122 tavua/s = 18214502400 = 18.2 gigatavua/s Lähde: Real-time rendering, 3rd edition
2.3.4 Latenssi Latenssi on aika kyselyn esittämisestä vastauksen saamiseen. Liukuhihnalla, jolla on n työvaihetta, kestää n kellosykliä päästä koko liukuhihnan päästä toiseen; latenssi n kellosykliä. GPU (233 MHz), jonka liukuhihnalla on 700 työvaihetta päästään läpi 700 kellosyklissä (ideaalinen). 700 / 233 000 000 = 3 µs Taajuus 50 Hz => 1/50 = 20 ms / per kuvakehys EI ongelmaa latenssista Lähde: Real-time rendering, 3rd edition
2.3.5 Suorituskyvyn kehitys Mooren laki: transistorien määrä tuplaantuu kahdessa vuodessa. Prosessorien laskentakyky kasvaa 70 % (?) vuodessa. DRAM:in kaistanleveys kasvaa 25 % (?) vuodessa. Latenssi kasvaa 5 % (?) vuodessa. Puskuripakkausella pyritään säästämään muistikaistaa. Tarkastellaan puskuripakkausta myöhempänä tarkemmin. Lähde: Real-time rendering, 3rd edition
3.2 Grafiikkarajapinnat Grafiikkarajapinnat ovat ohjelmointirajapintoja (API) grafiikkakortin käyttöön. OpenGL ja Direct3D ovat kaksi merkittävintä ohjelmistoteollisuudessa käytettävää grafiikkarajapintaa. Grafiikkarajapintojen ohjelmointimallit olettavat, että piirtoprimitiivit prosessoidaan peräkkäin ja atomisesti. Grafiikkarajapinnat sallivat prosessorilta suorat luku ja kirjoitusoperaatiot kehyspuskurimuistiin.
3.2.1 OpenGL OpenGL on käyttöjärjestelmä ja laitteistoriippumaton ohjelmointirajapinta grafiikkakortin käyttöön. OpenGL on tilakone, joka koostuu CPU:lla (asiakas) ajettavaan rajapintaan ja GPU:lla (palvelin) näytönohjaimen ajurin ohjaaviin suoritusyksiköihin. OpenGL:n viimeisin versio (4.4) on julkaistu heinäkuussa 2013. http://www.opengl.org/documentation/current_version/ Grafiikkakirjasto sisältää yli kaksi sataa funktiota ja proseduuria, jotka mahdollistavat korkeatasoisten kuvien tuottamisen, erityisesti kolmiulotteisista malleista. OpenGL vaatii toimiakseen grafiikkakortin, jossa on näyttöpuskuri.
3.2.1 OpenGL Ohjelmoijalle OpenGL on joukko komentoja, jotka mahdollistavat geometristen kappaleiden esittämisen kaksi tai kolmiulotteisesti ja niiden renderöinnin näyttöpuskuriin. Vastaavasti implementoijalle OpenGL on joukko komentoja, jotka vaikuttavat grafiikkakortin toimintaan. OpenGL:n piirtoprimitiivejä ovat piste (GL_POINTS), viiva (GL_LINES), viivasarja (GL_LINE_STRIP), viivasilmukka (GL_LINE_LOOP), monikulmio (GL_POLYGON), nelikulmio (GL_QUAD) vanha?, nelikulmiosarja (GL_QUAD_STRIP), kolmio (GL_TRIANGLES), kolmiosarja (GL_TRIANGLE_STRIP) ja kolmioviuhka (GL_TRIANGLE_FAN).
3.2.1 OpenGL Primitiivit muodostetaan yhdestä tai useammasta verteksistä. Koordinaatit, värit, normaalit, tekstuurikoordinaatit on liitetty verteksiin ja jokainen verteksi prosessoidaan itsenäisesti, järjestyksessä ja samalla tavalla. Verteksijoukkoa leikattaessa primitiivien pitää kuitenkin sopia tarkasteltavaan alueeseen, joka käytännössä tarkoittaa mahdollisesti verteksidatan muokkausta ja uusien verteksien muodostusta. OpenGL 4 versiossa julkaistiin tessalaatiotekniikka, jolla voidaan uudella tavalla muodostaa pintakuvioita. Tessalaatiotekniikan käyttöön ovat omat suoritinkäskyt. Tessalaatiotekniikalla geometrista mallia ei tarvitse muodostaa monikulmioista vaan malli muodostetaan "tilkuista", jotka voivat olla käyrä tai alue.
3.2.1 OpenGL OpenGL:än johdannaiset (extensions) mahdollistavat yksittäisten valmistajien uusien toiminnallisuuksien lisäämisen OpenGL-standardiin. Johdannaiset voivat sisältää uusia funktioita ja vakioita. Niiden tarkoituksena voi olla olemassa olevien OpenGL-funktioiden rajoitusten poistot. Johdannaiset, jotka ns. arkkitehtuurinkatselmuslautakunta (Architecture Review Board) hyväksyy, saavat etuliitteen ARB.
3.2.2 OpenGL OpenGL ES on tarkoitettu sulautettuihin järjestelmiin; konsoleihin, älypuhelimiin, kulkuneuvoihin ja eri laitteisiin. https://www.khronos.org/news/press/khronos-releases-opengl-es-3.1- specification HTML5 canvasissa toimii WebGL, joka perustuu OpenGL ES 2.0. WebGL:ssä voidaan käyttää GLSL-varjostinohjelmia kuten OpenGL ES 2.0:ssa. https://www.khronos.org/registry/webgl/specs/1.0/
3.2.3 Direct3D Direct3D on osa Microsoftin DirectX ohjelmointirajapintaa (API). Direct3D kehitetty Microsoft Windows käyttöjärjestelmää varten. Sitä voidaan käyttää muissa käyttöjärjestelmissä Wine ohjelmiston kautta. Direct3D sisältää matalantason grafiikkarutiinit grafiikkakortin käyttöön. Direct3D 8.0 : ohjelmoitavat verteksi- ja pikselivarjostimet Direct3D 10.0 : varjostin malli 4.0, geometriavarjostimet lisättiin. Direct3D 11 : tessaatiotekniikka, säikeistetty renderöinti yhteen Direct3D kontekstiin, laskennallisuus lisättiin varjostinohjelmointiin.
3.2.3 Direct3D vs. OpenGL Direct3D- rajapintakirjaston päivitys tapahtuu ajurien päivityksellä. Uusimpien ajurien asennuspaketti ladataan verkkopalvelimelta ja asennetaan. OpenGL:ssä on ns. Plug-in arkkitehtuuri, jossa päivitetään edellä mainittua johdannaisia (extensions). OpenGL:än hyvänä puolena on alustariippumattomuus. Mainittavia eroja renderöinnissä on lankamallimoodissa monikulmioiden käsittely. Direct3D piirtää suorakaiteen kahtena kolmiona, kun taas OpenGL piirtää oikean suorakaiteen. Lähde: Real-time rendering, 3rd edition
3.3 Ohjelmoitavat varjostimet Yleinen varjostinydin (common-shader core) tarjoaa yhteisen ohjelmointimallin verteksi-, pikseli- ja geometriavarjostimille. Yleinen varjostinmalli on rajapinta (API). Yhtenäiset varjostimet on grafiikkaprosessorin ominaisuus. Varjostimien ohjelmointiin tarkoitettuja C-tyylisiä kieliä ovat HLSL, Cg ja GLSL. Ohjelmat käännetään laiteriippumattomaksi välikieleksi (IL) ja edelleen assembleriksi. Jokaisella varjostinohjelmalla on kiinteitä (uniform) syötteitä, jotka pysyvät muuttumattomina piirtokutsun aikana. Verteksi ja pikseli syötteet ovat muuttuvia (varying) syötteittä. Tekstuuri on kiinteä taulukkosyöte. Varjostinohjelmien tulosteet ovat rajattuja. Direct3D:ssä assembler toimii ns. virtuaalikoneena. Virtuaalikone tarjoaa rekisterit eri tyyppisille syötteille ja tulosteille. Lähde: Real-time rendering, 3rd edition
3.3 Varjostin ytimen virtuaalikone 4096 rekisteriä Väliaikaisrekisterit Muuttuvat syöte rekisterit (input) 16 / 16 / 32 rekisteriä Virtuaalikone Tulosrekisterit 16 / 32 / 8 rekisteriä Vakio rekisterit Tekstuurit 4096 rekisterin 16 puskuria 512 tekstuurin 128 taulukkoa Lähde: Real-time rendering, 3rd edition
3.3.1 Verteksivarjostin Verteksivarjostimella voi muuttaa, luoda tai sivuttaa kolmion vertekseihin (kulmapisteisiin) liittyviä tietoja; väri, normaali, tekstuurikoordinaatteja tai paikkaa. Verteksivarjostin ei voi tuhota verteksejä eikä luoda uusia verteksejä. Verteksivarjostin ei tiedä mitään kolmioverkon (triangle mesh) rakenteesta. Verteksivarjostin tulostaa vähintään paikan koordinaatit. Yleensä verteksivarjostin suorittaa muunnoksen malliavaruudesta leikkausavaruuteen. Nykyisillä grafiikkaprosessoreilla verteksejä prosessoidaan rinnakkain, koska joka verteksi käsitellään yksitellen. Verteksivarjostimella voidaan luoda efektejä: varjotilavuuksia (shadow volume), sekoittaa verteksejä (blending) ja silhuetteja. Lähde: Real-time rendering, 3rd edition
3.3.1 Verteksivarjostin Efektejä verteksivarjostimella: linssiefektejä (kalan silmä), vedenalainen vääristymä, kappaleiden vääntö ja taivutus, vaatteiden ja veden liike, liekit, vesipisarat... Verteksimalli 3.0 (shader model) tarjosi tekstuurien latauksen verteksiverkkoihin (valtamerien pinnat ja maastokartat). Verteksivarjostuksen jälkeen muodostetaan kolmioverkot, jotka lähetetään rasteroitavaksi. Varjostinmallissa 4.0 data voidaan käsitellä geometriavarjostimelle ennen rasterointia. Lähde: Real-time rendering, 3rd edition
3.3.2 Linkkejä NVIDIA OpenGL SDK 10 https://developer.nvidia.com/opengl Cg toolkit https://developer.nvidia.com/cg-toolkit-download Microsoft DirectX SDK http://www.microsoft.com/en-us/download/details.aspx?id=6812 Shader Maker http://cgvr.cs.uni-bremen.de/teaching/shader_maker/ GLSL Sandbox http://glsl.heroku.com/ The OpenGL Extension Wrangler Library http://glew.sourceforge.net/ Näkymänhallintatekniikat 3D-grafiikkamoottoreissa https://jyx.jyu.fi/dspace/handle/123456789/37454 Lähde: Real-time rendering, 3rd edition