# 2 3D computer graphics fundamentals ## 2.1 Rendering Iscrtavanje ili renderanje je važan proces stvaranja slika iz skupova dvodimenzionalnih (2D) i 3D mreža. Daje informacije o sceni igre, na primjer položaj svjetla ili orijentaciju kamere u igri. Stvorenu sliku se naziva render ili okvir. Renderi i kadrovi su ono što korisnik vidi na ekranu mnogo puta u sekundi. Obično će optimalna igra prikazati novi kadar negdje između 30 i 60 slika u sekundi (FPS). Na primjer, kamera za igru je struktura podataka koja sadrži informacije o tome odakle treba gledati scenu igre. Ove su informacije važne za utvrđivanje koja su sredstva i objekti trenutno vidljivi na sceni i trebaju se generirati u kadru. (file:///C:/Users/Iratus%20Wraith/Downloads/Shader_Development.pdf) Dvije su kategorije iscrtavanja; iscrtavanje u stvarnom vremenu i prethodno iscrtavanje. Glavna razlika između njih je brzina kojom računaju i finaliziraju slike. Iscrtavanje u stvarnom vremenu tehnika je koja se koristi u interaktivnim grafikama i igrama koje zahtijevaju brzo stvaranje slike, na primjer igrama u kojima je količina interakcija korisnika velika u visoko interaktivnom okruženju. Prethodno iscrtavanje je tehnika koja se koristi u okruženjima u kojima se iscrtavanje izvodi na centralnim procesorskim jedinicama (CPU-ima), a ne na grafičkim procesorima (GPU-ima). Ova se tehnika koristi kada je potražnja za kvalitetom animacije i vizualnih efekata velika, a fotorealizam mora biti najvišeg mogućeg standarda. (https://www.techopedia.com/definition/9163/rendering) Bez obzira na to koja se tehnika za iscrtavanje igre koristi, kôd igre odgovoran za iscrtavanje kadrova naziva se strojem za iscrtavanje. Ima određeni niz koraka za pretvaranje mrežnih podataka u nove kadrove, koji se naziva kanal za iscrtavanje, što će biti objašnjeno dalje u tekstu. (file:///C:/Users/Iratus%20Wraith/Downloads/Shader_Development.pdf) ## 2.2 Rendering pipeline Cjevovod iscrtavanja ili rendering pipeline slijed je koraka koje OpenGL poduzima pri generiranju objekata. Ovaj se cjevovod izvodi na svakoj mreži za koju kažemo da GPU treba uzeti u obzir za sliku koju trenutno iscrtava. Nakon što je svaka od tih mreža poslana kroz cjevovod, imamo svoju sliku. Ovi se koraci izvode isključivo na GPU-u, a jedan od razloga zašto su grafičke kartice toliko važne za igre je taj što su napravljene za što brže izvođenje grafičkog cjevovoda. Vertex programi za sjenčanje, koje detaljnije opisujemo kasnije, prvi su korak u cjevovodu. Oni se brinu o tome da shvate gdje na ekranu treba nacrtati svaki vrh u mreži koja se trenutno obrađuje. Kad se objekt pomiče u video igri, to je zato što se položaj tog objekta šalje u vertex programa za sjenčanje, koji zatim to kombinira s drugim podacima, poput podataka o položaju i orijentaciji kamere u igri, i koristi sve to da odluči gdje će postaviti vrhove mreže tog objekta na ekranu. Nakon što vertex program za sjenčanje završi s obradom svih vrhova u mreži, šalje te podatke u sljedeći korak cjevovoda, koji se naziva "montaža oblika" (engl. shape). Ova faza je odgovorna za povezivanje svih onih vrhova koji su upravo bili obrađeni linijama. Drugim riječima, odgovorna je za stavljanje rubova naše mreže na zaslon. Sljedeća faza u cjevovodu je rasterizacija. U ovoj fazi GPU shvaća koje piksele na ekranu bi mreža mogla zauzeti, te za svaki od ovih potencijalnih piksela stvara fragment, koji je struktura podataka koja sadrži sve podatke potrebne za iscrtavanje jednog piksela na zaslonu. Korak rasterizacije ne zna kako izgleda površina mreže; potrebna mu je pomoć fragment programa za sjenčanje kako bi ispunio informacije o tome koje boje svaki od fragmenata mora biti, pa šalje sve fragmente na sljedeći korak u tijeku, gdje programski kod automatski ispunjava te podatke. Naposlijetku, fragmentni programi za sjenčanje su kao boje u linijama koje stvara faza sastavljanja oblika. (Iz knjige) ## 2.3 Mesh Poligonska ili 3D mreža je strukturna konstrukcija 3D modela koji se sastoji od poligona. 3D mreže koriste referentne točke na osi X, Y i Z za definiranje oblika s visinom, širinom i dubinom. Objekti izrađeni poligonskim mrežama moraju pohraniti različite vrste elemenata. To uključuje vrhove, rubove, lica, poligone i površine. U mnogim aplikacijama pohranjuju se samo vrhovi, rubovi i lica ili poligoni. Alat za iscrtavanje (engl. Renderer) može podržavati samo trostrana lica, pa se poligoni moraju izgraditi od mnogo njih. (slikica https://en.wikipedia.org/wiki/Polygon_mesh#/media/File:Mesh_overview.svg) Vrhovi objekta u 3D prostoru sadrže svoju poziciju na osim X, Y i Z, a rubovi su poveznica između dva vrha. Lica su zatvoreni skup rubova, u kojem trokutasto lice ima tri ruba, a četverostrano lice ima četiri ruba. Većina alata za iscrtavanje podržava samo trostrana ili četverostrana lica, pa su poligoni predstavljeni kao više lica. Površine su češće nazivane grupama za zaglađivanje. To je skupina poligona u poligonskoj mreži koja bi trebala izgledati kao glatka površina. Grupe za zaglađivanje korisne su za opisivanje oblika gdje su neki poligoni glatko povezani sa svojim susjedima, a neki nisu. Većinu 3D mreža stvaraju umjetnici pomoću programskih paketa; komercijalnih programa poput Maye, 3D Studio Max ili besplatnog otvorenog programa Blender 3D. Kada se modeli stvaraju za animaciju, oni zahtijevaju posebno pažljivu konstrukciju; mogu nastati veoma čudne deformacije ako se poligoni pažljivo ne postave za kontinuirane rubne petlje (sustav koji povezuje sve rubove) oko područja koja će se pomicati. ## 2.4 Shader Program za sjenčanje ili shader je dio koda koji se obično izvodi na GPU, za manipulaciju slikom prije nego što se prikaže na zaslon. Programi za sjenčanje dopuštaju za različite vrste učinka iscrtavanja, u rasponu od dodavanja rendgenskog prikaza do dodavanja stiliziranih linija u ispis iscrtavanja. Najčešće se koriste za stvaranje osvijetljenih i zasjenjenih područja pri prikazivanju 3D modela. Razlika od većine programa koje ljudi pišu je upravo to što se programi obično izvode na CPU. To znači da programi za sjenčanje mogu učiniti neke stvari koje regularni programi ne mogu. Najvažnija stvar koju mogu učiniti je kontrolirati dijelove cjevovoda za iscrtavanje. Većina cjevovoda ostaje ista bez obzira na vrstu objekta koji se generira. programi za sjenčanje koji rade na različitim fazama cjevovoda dobivaju različita imena, kao na primjer „vertex shaders“ i „fragment/pixel shaders“. Ovo su najčešće korištene vrste programa za sjenčanje, budući da su to minimalni zahtjevi za dobivanje nečega kroz cjevovod za iscrtavanje i na zaslonu. Budući da je svaka faza cjevovoda različita, programi za sjenčanje napisani za svaku fazu također su različiti: vertex shader se ne može koristiti za obradu fragmenata ili obrnuto. programi za sjenčanje su napisani u specijaliziranim programskim jezicima koji se nazivaju „shader languages“. Postoji mnogo jezika za sjenčanje, kao na primjer HLSL, GLSL i Cg, ali zapravo su svi vrlo slični. (Isto knjiga i link dolje) (https://www.cs.vu.nl/~eliens/download/literatuur-shaders.pdf) ### 2.4.1 Shader Languages Izvorno su programi za sjenčanje pisani u assembly kodu, ali kao i sa svim drugim programskim poljima postalo je jasno da je potreban jezik više razine. Naime, kada je uveden programabilni cjevovod konačno se moglo programirati programe za sjenčanje u assembly kodu. Međutim, programe za sjenčanje je bilo teško pisati i čitati. Tada su ser razvili jezici više razine u kojima bi bilo lakše razumjeti programe za sjenčanje. Jezik na kojem su programirani programi za sjenčanje ovisi o cilju koji se želi postići. Službeni OpenGL i OpenGL ES jezik sjenčanja je OpenGL Shading Language, također znan i kao GLSL, a službeni Direct3D jezik sjenčanja je High Level Shader Language, također poznat kao HLSL. Cvid, jezik sjenčanja treće strane koji emitira i OpenGL i Direct3D programe za sjenčanje, razvila je Nvidia; međutim od 2012. je zastario. (wikipedia, nadji nesto drugo) ### 2.4.2 Vertex Shader Vertex program za sjenčanje je funkcija grafičke obrade koja se koristi za dodavanje posebnih efekata objektima u 3D okruženju izvršavanjem matematičkih operacija nad podacima o vrhu objekata. Svaki vrh može biti definiran s mnogo različitih varijabli, na primjer, vrh je uvijek definiran svojim položajem u 3D okruženju koristeći koordinate x, y i z. Vrhovi se također mogu definirati bojama, teksturama i svjetlosnim karakteristikama. Vertex programi za sjenčanje zapravo ne mijenjaju vrstu podataka, oni jednostavno mijenjaju vrijednosti podataka, tako da se pojavljuje vrh s drugom bojom, različitim teksturama ili drugačijim položajem u prostoru. (https://www.nvidia.com/en-us/drivers/feature-vertexshader/) ### 2.4.3 Fragment / Pixel Shader Program za sjenčanje fragmenata je isto kao i program za sjenčanje pixela. Glavna razlika između ovih programa za sjenčanje i vertex programa za sjenčanje je u tome što vertex program za sjenčanje može manipulirati atributima vrhova. S druge strane, fragment program za sjenčanje brine o tome kako pikseli između tih vrhova izgledaju. Interpolirani su između definiranih vrhova slijedeći posebna pravila. Na primjer, ako poligon treba biti potpuno crven, sve vrhove bi trebalo definirati kao crvene. Ako su potrebni određeni efekti poput gradijenta između vrhova, to se čini u fragment programu za sjenčanje. Dakle, fragment/pixel program za sjenčanje dio je koraka rasterizacije, gdje se slika izračunava i pikseli između vrhova popunjavaju ili "obojavaju". Izraz "fragment" koristi se jer se rasterizacijom svaki geometrijski primitiv, poput trokuta, razbija u fragmente veličine piksela za svaki piksel koji primitiv pokriva. Fragment ima pridruženo mjesto piksela, vrijednost dubine i skup interpoliranih parametara kao što su boja, sekundarna (spekularna) boja i jedan ili više skupova koordinata teksture. (http://download.nvidia.com/developer/cg/Cg_Tutorial/Chapter_1.pdf)