Graafikakonveier

Graafikakonveier ehk toru on mitmeetapiline mudel, mida kasutatakse arvutigraafikas objektide kuvamiseks kahemõõtmelisele ekraanile. Etappide arv konveieris sõltub kasutatavast riist- ja tarkvarast ning soovitud tulemuse eripäradest. Graafikakonveierit kasutatakse enamasti graafikaprotsessorites. Algselt olid graafikakonveieri etapid kindlalt määratud, kuid kaasaegsed graafikaprotsessorid võimaldavad paljude etappide muutmist spetsiaalsete programmeerimiskeeltega. Graafikakonveier on kasutusel enamikus 3D-graafikat nõudvates rakendustes. Graafikakonveieri etappe on võimalik rakendada paralleelselt, seega suudavad graafikaprotsessorid konveierit väga optimaalselt kasutada. See kiirendab tunduvalt arvutigraafika rakendusi. Kuna arvutigraafika valdkond on oluliselt laienenud, siis on nõudmised graafikaprotsessoritele suurenenud. See on toonud kaasa graafikaprotsessorite muutumise paindlikumaks, mis väljendub graafikakonveieri muutumises kergemini programmeeritavaks.

Põhimõte

Graafikakonveieris luuakse 3D- või 2D-objektidest kahemõõtmeline kaader, mida saab kuvada ekraanil. Objektid asetatakse virtuaalsesse ruumi ning nende pind jagatakse primitiivideks. Enamasti on primitiiv kolmnurk. Iga primitiivi jaoks määratakse varjundus, värv ja tekstuur, sõltuvalt asukohast ruumis. Primitiivid muudetakse pikslitest koosnevateks fragmentideks rasterdamise käigus. Fragmente töödeldakse, ning nendest pannakse kokku kahemõõtmeline pikslitest kaader.
Konveieri abil saadava pildi kvaliteet sõltub suuresti primitiivide arvust. Mida rohkem primitiive objekti pinda kirjeldab, seda detailsem ja realistlikum mudel objektist luuakse. Primitiivide arvu suurendamine suurendab ka objekti renderdamise keerukust ja andmemahtu, mida selle objekti kirjeldamiseks vaja läheb.

Graafikakonveieri etapid

Konveieris toimuvad etapid võib jagada virtuaalses ruumis ja ekraani ruumis toimuvateks. Sõltuvalt konveierist võivad mõned etapid olla dünaamilised ehk nende käitumist saab programmeerija tarkvaraliselt muuta. Graafikakonveierit rakendatakse tavaliselt graafikaprotsessoris. Arvuti keskprotsessor saadab graafikaprotsessorile info primitiivide kohta, mis asuvad virtuaalses ruumis. Graafikakonveieris rakendatakse primitiividele geomeetria funktsioone ja toimub rasterdamine. Konveieri lõpuks valmib virtuaalsest ruumist kujutis, mida saab kuvada ekraanile. Valminud kujutisi hoitakse mälus kaadripuhvris.

Geomeetria

Graafikakonveieri alguses on teada objektide asukoht virtuaalses ruumis, mis on määratud nende tippude koordinaatidega. Kogu virtuaalne kolmemõõtmeline ruum on kirjeldatav ristkoordinaatide süsteemina. Virtuaalsed objektid paigutatakse ruumi vastavalt nende tippude koordinaatidele. Tipuks nimetatakse punkti ruumis. Tippe omavahel ühendades moodustuvad kõik keerulisemad kujundid, mida nimetatakse primitiivideks. Tippu iseloomustavad koordinaadid kolmemõõtmelises ruumis. Peamine primitiiv, mida arvutigraafikas kasutatakse, on kolmnurk. Kolmnurk moodustatakse kolmest tipust. Kolmnurga eelis teiste hulknurkade ees on see, et ta asub alati ühel tasandil. Kolmnurka iseloomustab normaalvektor, mis on tasandiga ehk kolmnurgaga risti olev vektor. Normaalvektori suund näitab kolmnurga välispinda ja pikkus iseloomustab originaalse pinna kumerust.
Virtuaalsed objektid asetatakse virtuaalsesse ruumi vastavalt nende koordinaatidele. Kui objekti loomisel oli koordinaatide süsteem erinev ruumi omast, siis viiakse läbi vastavad transformatsioonid maatriksarvutustena. Ruumi paigutatakse virtuaalne kaamera või vaatleja. Järgnevate arvutuste lihtsustamiseks määratakse tihti kaamera koordinaatideks telgede alguspunkt nii, et z-koordinaat määrab punkti kauguse kaamerast. Kõik ruumis olevad tipud projekteeritakse kahemõõtmelisele pinnale vastavalt kaamera asukohale. Projekteerimiseks on erinevaid võimalusi, mille valik sõltub tulemuse rakendusest. Iga tipu jaoks säilitatakse ka z-koordinaadi väärtus spetsiaalses puhvris, mida kasutatakse rasterdamisel. Tipud ühendatakse primitiivideks. Kui ruumis oli valgusallikaid, siis nende mõju primitiivide tekstuurile arvutatakse eraldi iga primitiivi jaoks, kasutades normaalvektorit ja valgusallika asukohta. Realistlikuma tulemuse saamiseks võidakse valgusallika mõju arvutada iga piksli jaoks eraldi. Rasterdamisele lähevad ainult primitiivid, mis jäävad virtuaalse kaamera vaatevälja. Primitiivid, mis asuvad vaatevälja serval, lõigatakse pooleks. Saadud kahemõõtmeline vaateväli kohandatakse soovitud kaadri mõõtmetele.

Rasterdamine

Geomeetria funktsioonide rakendamise tulemusena saadud kujutis rasterdatakse, et saada diskreetsetest osadest ehk pikslitest koosnev kaader. Iga primitiiv muudetakse fragmendiks, mis koosneb pikslitest. Pikslite jaoks ei ole vaja värvi, tekstuuri ega varjutust arvutada, kui need ei asu ühegi primitiivi sees või on blokeeritud mõne teise fragmendi pikslite poolt. Fragmentide kattumisel saab kaamerapoolse piksli teada salvestatud z- koordinaadi väärtuse kaudu. Iga nähtava piksli jaoks on vaja leida tekstuur, värv ja varjutus. Tekstuuri info on salvestatud iga tipu jaoks, seega on ühe fragmendi kohta enamasti kolm erinevat tekstuuri. Iga piksli jaoks leitakse tekstuur, kasutades kõiki kolme väärtust. Piksli värvi määramiseks võetakse lisaks tekstuurile arvesse ka valgusallika mõju, mis on juba varem arvutatud. Rasterdamise lõpuks saadakse ekraani lahutusvõimega kaader, mis salvestatakse kaadripuhvris.

Mälu kasutus

Graafikakonveier nõuab eraldi mälu, kuna andmeid on väga palju ja neile on vaja pidevalt ligi pääseda. Mälu maht sõltub tippude arvust, värvikvaliteedist, tekstuuridest, ekraani lahutusvõimest, puhvrite arvust ja kaadri detailsusest. Tippude kirjeldused salvestatakse keskprotsessorist mällu. Pärast tippude paigutamist ruumi salvestatakse korrastatud ja järjestatud tippude andmed uuesti mällu. Mälus hoitakse ka tekstuure, mis asuvad tekstuuripuhvrites. Pärast tippude projekteerimist on vaja iga tipu jaoks säilitada koordinaadid, varjutus ja tekstuur. Primitiivid salvestatakse enne rasterdamist järjestatult mällu. Rasterdamise käigus hoitakse mälus ka fragmentide andmeid. Pärast renderdamist hoitakse kogu kaadrit kaadripuhvris. Kaadripuhvreid võib olla mitu, sel juhul on järgmised kaadrid juba renderdatud.

Optimeerimine

Graafikakonveieri tööd saab optimeerida, suurendades paralleelselt rakendatavate etappide arvu. Paralleelselt rakendatavate etappide tõttu on konveieri optimeerimiseks oluline tuumade arv protsessoris. Enamus protsessoreid ei ole graafikakonveieri kasutamiseks mõeldud, sest nende tuumade arv ei ole piisavalt suur. Graafikaprotsessorid on ehitatud suurel hulgal paralleelsete arvutuste tegemiseks, mis väljendub eelkõige nende tuumade arvus. Graafikaprotsessorid on seega suutelised graafikakonveierit optimaalselt kasutama.
Konveieri töö kiirus sõltub oluliselt primitiivide arvust, mida on vaja kuvada. Seega on oluline kuvada minimaalne kogus primitiive, mille korral säilib pildi soovitud detailsus. Kõige lihtsam viis konveieri optimeerimiseks on saata rasterdamisele ainult need primitiivid, mida kaamera näeb. Kui kaamera ei asu kolmemõõtmelise kujundi sees, siis ei ole näha selle kujundi sisemised pinnad. Nende primitiivide kindlaks tegemiseks kasutatakse normaalvektori suunda. On ka erilisi andmestruktuure, mille abil on võimalik leida primitiive, mis jäävad teiste primitiivide taha. Selliste meetodite rakendamise muudavad raskemaks läbipaistvad ja peegeldavad pinnad, mille korral on vaja kuvada ka primitiive, mis ei asu kaamera vaateväljas.

Varjutajad

Varjutaja on arvutiprogramm, mille abil antakse pildile soovitud varjutus, tekstuur ja värv või muudetakse graafikakonveieris toimuvat geomeetriat. Varjutajaid kasutatakse ka efektide loomiseks. Varjutajate kirjutamiseks on olemas spetsiaalsed programmeerimiskeeled, mis sõltuvad nii riistvarast kui ka tarkvarast. OpenGL-i jaoks kasutatakse GLSL- ja Direct3D jaoks HLSL-keelt, mõlema jaoks sobib ka keel Cg. Varjutajad tegelevad kas tippude, pikslite või primitiividega. Sellest sõltub, millises etapis neid graafikakonveieris saab rakendada.