Od točke do filma
Kako računalnik iz treh koordinat ustvari svet, ki ga ne moremo ločiti od resničnega.
Vsaka scena iz filmov kot sta Avatar ali Toy Story, vsak lik iz videoiger, vsak virtualni prototip avtomobila — vse to je nastalo iz iste nenavadne osnove: treh števil, ki opisujejo točko v prostoru.
3D računalniška grafika je disciplina, ki opisuje, kako prevedemo matematične opise tridimenzionalnih oblik v dvodimenzionalne slike, ki jih vidimo na zaslonu. Pot od točke v prostoru do renderiranega filma je dolga in polna čudovitih matematičnih idej: matrik, normalnih vektorjev, žarkov svetlobe in barvnih modelov.
To spletno mesto vas popelje po tej poti — korak za korakom, z interaktivnimi prikazovalniki, ki vam omogočajo, da se sami prepričate, kako deluje vsaka zamisel.
Točka v prostoru
Tri števila, ki opisujejo celoten svet.
Predznanje: Osnovna matematika — nič posebnega.
Preden računalnik nariše karkoli, mora vedeti, kje je. Vsak predmet v 3D svetu — kocka, človeški obraz, vesoljsko ladjevje — je na koncu le zbirka točk. Vsako točko opišemo s tremi koordinatami: x, y in z.
Točka P(2, 3, 5) leži 2 enoti desno po osi x, 3 enote navzgor po osi y in 5 enot »v globino« po osi z. Ta sistem — kartezični koordinatni sistem v treh dimenzijah — je temelj vsega.
Povleci, da zasukaš pogled. Premikaj drsnik, da premeščaš točko.
Točka P(2.0, 1.5, 1.0)
Vektorji
Točka opisuje položaj. Vektor opisuje smer in razdaljo. V 3D grafiki so vektorji povsod: opisujejo smer pogleda kamere, normalo površine, smer svetlobnega žarka. Vektor od točke A do točke B dobimo preprosto:
Posebej pomemben je enotski vektor — vektor dolžine 1. Dobimo ga z normalizacijo: delimo vsako komponento z dolžino vektorja. Enotski vektorji se pogosto uporabljajo za opis smeri, ker njihova dolžina ne šteje — le smer.
Skalarni in vektorski produkt
Dve operaciji z vektorji sta v 3D grafiki posebej pogosti:
Skalarni produkt (dot product) vrne število, ki pove, kako vzporedna sta dva vektorja. Če je rezultat 0, sta pravokotna. Izračunamo ga kot a·b = ax·bx + ay·by + az·bz. Uporablja se pri osvetlitvi — meri, kako »naravnost« svetloba zadene površino.
Vektorski produkt (cross product) vrne vektor, ki je pravokoten na oba vhodna vektorja. Izračunamo ga po formuli za determinanto 3×3 matrike. Koristimo ga za iskanje normal površin — smer, v katero »gleda« trikotnik.
Klikni gumb za prikaz operacije.
Globlje: Desnosučni koordinatni sistem ★
V 3D grafiki se srečamo z dvema konvencijama: desnosučnim (OpenGL, Blender) in levosučnim koordinatnim sistemom (DirectX, nekatere videoigre). Razlika je smer osi z: v desnosučnem sistemu z kaže proti gledalcu, v levosučnem od gledalca. To na videz nepomembno razlikovanje povzroča brezštevilne zmede pri prenosu modelov med orodji — normalni vektorji pokažejo v napačno stran in osvetlitev se obrne.
Preoblikovanja
Matrike — elegantno orodje za premikanje svetov.
Predznanje: Priporočljivo prebrano 1. poglavje.
Vsaka animacija, vsak premik kamere, vsak krak robotske roke — vse to so preoblikovanja. Premikamo točke iz enega položaja na drugega po pravilih, ki jih opišemo z matematičnimi operacijami. Trije temeljni tipi so: premik (translacija), zasuk (rotacija) in skaliranje.
Homogene koordinate
Računalniška grafika za opis preoblikovanj uporablja eleganten trik: vsaki točki (x, y, z) dodamo četrto komponento w in delamo v 4D prostoru. Točka postane (x, y, z, 1). Zakaj? Ker tako vse tri preoblikovanja — vključno s prevodom — zapišemo kot množenje z 4×4 matriko. To je izjemno priročno: verigo preoblikovanj preprosto zmnožimo v eno matriko.
Vrstni red preoblikovanj je pomemben
Matrika, ki zasuka in potem premakne, ni enaka matriki, ki najprej premakne in potem zasuka. Množenje matrik ni komutativno. To je pogosta past pri razvoju iger in animacij: napačen vrstni red preoblikovanj da napačen rezultat. Pravilen vrstni red je: najprej skaliranje, potem zasuk, nato premik.
Najprej zasuk, potem premik
Najprej premik, potem zasuk
Opazite razliko! Rdeča puščica kaže os zasuka.
Globlje: Hierarhija preoblikovanj in kosti ★★
V animaciji se preoblikovanja združujejo hierarhično. Roka je vezana na nadlaket, ki je vezana na ramo, ki je vezana na trup. Ko premaknemo trup, se premakne celotno telo — to je hierarhija kosti (skeletal animation). Vsaka kost hrani lokalno transformacijsko matriko, globalna pozicija pa je produkt vseh matrik po hierarhični verigi od korena do lista.
Sodobni 3D modeli imajo tipično 50–200 kosti. Napreden sistem inverzne kinematike avtomatično izračuna potrebne kote v sklepih — npr. da se roka premakne do želenega položaja.
Poligonalne mreže
Trikotnik — atomarna enota 3D sveta.
Predznanje: Priporočljivo prebrano 2. poglavje.
Ko je Steve Jobs leta 1995 prvič videl Toy Story, je rekel, da je to začetek novega poglavja v filmski umetnosti. Woodyjev obraz je takrat vseboval okrog 700 poligonov. Danes ima povprečen filmski lik več milijonov. Toda osnovna enota je ostala enaka: trikotnik.
Zakaj trikotnik? Ker je vedno planaren — tri točke v prostoru vedno določajo ravnino. Ker je GPU (grafična procesna enota) optimiziran za risanje trikotnikov. In ker je vsak poligon mogoče razdeliti na trikotnike.
Trikotnikov: 0 | Vrhov: 0
Podatkovne strukture mreže
Poligonalna mreža v pomnilniku hrani tri sezname:
Seznam vrhov (Vertex Buffer) — seznam 3D točk, npr. [(0,1,0), (1,0,0), (-1,0,0), …]
Seznam indeksov (Index Buffer) — trojice celih števil, ki povedo, kateri trije vrhi tvorijo trikotnik, npr. [0,1,2, 0,2,3, …]
Normalni vektorji — za vsak vrh vektor, ki kaže pravokotno na površino. Ključni za osvetlitev.
Normale površin
Normala trikotnika je vektor, ki kaže »iz« površine. Izračunamo jo z vektorskim produktom dveh robnih vektorjev trikotnika:
Globlje: LOD — stopnje podrobnosti ★★
Ko je predmet v igri daleč od kamere, ni smiselno risati milijonov trikotnikov — videti je kot piksel. Sistem Level of Detail (LOD) pripravi več verzij istega modela z različnim številom poligonov. Ko se predmet odmika, sistem samodejno preklopi na manj podroben model. Igranje z dobrim sistemom LOD podvoji ali potroji hitrost renderiranja brez opaznega vizualnega poslabšanja.
Moderna tehnika nanite (Unreal Engine 5) to rešuje avtomatično: vsak poligon se dinamično prilagodi resoluciji, s katero je prikazan na zaslonu.
Projekcija
Kako prepričamo ploščat zaslon, da zgleda tridimenzionalno.
Predznanje: Preoblikovanja (3. poglavje).
Zaslon je raven. 3D svet ni. Da bi prikazali 3D prizor na 2D zaslonu, moramo vsako točko projicirati — preslikati v ravnino. Obstajata dve temeljni vrsti projekcije, ki se razlikujeta po tem, ali upoštevamo globino ali ne.
Ortografska projekcija
Pri ortografski projekciji preprosto zavržemo koordinato z. Točka (x, y, z) postane (x, y). Predmeti so enako veliki ne glede na razdaljo od kamere. Koristna je pri tehničnih risbah, CAD sistemih in 2D igrah z izometričnim pogledom.
Perspektivna projekcija
Perspektivna projekcija upošteva, da se oddaljeni predmeti vidijo manjši. Bolj je naravna — enako, kot deluje človeško oko in kamera. Točka se pomanjša sorazmerno z oddaljenostjo:
kjer je d razdalja do ravnine projekcije (»goriščna razdalja«). Večji d pomeni manjši vidni kot — kot pri telefoto objektivu.
Ortografska
Perspektivna
Kamera in vidno polje
V 3D grafiki »kamera« ni nič posebnega — le skupek transformacij, ki premakne celoten svet tako, da kamera stoji v izhodišču in gleda v smer z. Vidno polje (field of view, FOV) določa, koliko prostora vidimo pod kotom. Široko polje (120°) dá poudarjeno perspektivo kot fisheye leča; ozko (30°) stisne prostor kot telefoto.
Standardno vidno polje za igre je 60–90°.
Globlje: Posnetek zaklonilnika in z-medpomnilnik ★★
Ko projiciramo 3D sceno, moramo vedeti, kateri predmeti so pred katerimi. Naivna rešitev je risanje od daleč do blizu (algoritem Malirja), a ta odpove pri prepletajočih se predmetih. Moderna rešitev je z-medpomnilnik (depth buffer): za vsak piksel na zaslonu hranimo globino (koordinato z) najbližjega predmeta, ki je bil do sedaj narisan. Ko pride novi predmet, ga narišemo le, če je bližje.
Z-medpomnilnik je danes vgrajen v vsak GPU. Zahteva malo dodatnega pomnilnika (en float na piksel), a reši problem vidnosti brez kakršnega koli sortiranja predmetov.
Osvetlitev
Zakaj senčena krogla zgleda okrogla, bela pa samo kot krog.
Predznanje: Vektorji iz 1. poglavja — razloženi so sproti.
Brez osvetlitve bi bila vsaka 3D scena enobarvna — ne bi ločili, ali gledamo kroglo ali disk. Osvetlitev ustvarja globino, obliko in materiale. Klasičen model Phong (po Bungu Phongu, 1975) jo razdeli na tri komponente, ki skupaj dajo prepričljivo sliko.
Ambientalna osvetlitev
To je najosnovnejša svetloba — enaka povsod, brez smeri. Oponaša razpršeno, odbito svetlobo okolja. Vsaka točka površine prejme enako količino ambientalne svetlobe, ne glede na njeno usmerjenost. Brez nje bi bili deli predmetov v popolni temi.
Difuzna osvetlitev
Difuzna svetloba je odvisna od kota med normalo površine in smerjo svetlobnega žarka. Ko svetloba zadene površino pravokotno, je osvetlitev največja; ko tangencialno, je minimalna. Izračunamo jo z Lambertovim zakonom:
kjer je n̂ normala površine in l̂ enotski vektor v smeri svetlobe.
Zrcalna osvetlitev
Zrcalna osvetlitev dá lesk in odraz. Odvisna je od kota med smerjo odbite svetlobe in smerjo pogleda. Majhna vrednost eksponenta dá širok, mehak lesk (plastika); velika vrednost dá oster, svetleč lesk (kovina).
Globlje: Fizikalno zasnovano renderiranje (PBR) ★★★
Phongov model je hevristika — preprost, a ne fizikalno točen. Sodobna industrija uporablja fizikalno zasnovano renderiranje (Physically Based Rendering, PBR), ki temelji na enačbi renderiranja Kajiye in Torrance-Sparrowovem BRDF modelu. Ta model pravilno upošteva energijsko ohranitev (površina ne more odbiti več svetlobe, kot jo prejme) in pravilno ravna s kovinami in nekovinami.
V PBR vsak material opišemo s parametri: albedo (osnovna barva), metalnost (0 = nemetalna, 1 = kovina), hrapavost in ambientalna okluzija. Ti parametri so intuitivni umetniku in dajejo fizikalno pravilne rezultate pri različnih osvetlitvah.
Senčenje in materiali
Enak model, tri popolnoma različne površine.
Predznanje: Osvetlitev (5. poglavje).
Osvetlitev pove, koliko svetlobe prejme točka. Senčenje pove, kako to izračunamo za cel trikotnik — ali za vsak piksel posebej ali le za vogale. Razlika je ogromna, tako vizualno kot v zahtevah po računski moči.
Tri stopnje senčenja
Plosko (Flat)
Gouraud
Phong
| Tehnika | Izračun na | Kakovost | Hitrost |
|---|---|---|---|
| Plosko (Flat) | En izračun na trikotnik | Groba | ⚡⚡⚡ Najhitreje |
| Gouraud | Izračun v ogliščih, interpolacija | Srednja | ⚡⚡ Hitro |
| Phong | Interpolacija normal, izračun na vsak piksel | Visoka | ⚡ Počasneje |
Teksture
Tekstura je slika, »ovita« čez 3D model. Namesto da opišemo barvo vsake točke posebej, shranimo barvno informacijo v 2D sliko in vsaki točki modela priredimo koordinati u in v (teksturne koordinate), ki povesta, kateri piksel iz teksture ji ustreza.
Globlje: Normal mapping in displacement mapping ★★
Normal mapping je tehnika, ki s posebno teksturo (normal map) posnema podrobnosti površine, ne da bi dodajali poligone. Vsak piksel v normal mapi hrani zakodiran normalni vektor, ki se uporabi pri osvetlitvi. Na ta način površina zgleda reliefna, čeprav je geometrija ravna. Opazimo npr. pore na koži ali brazde na skali.
Displacement mapping gre korak dlje in dejansko premakne točke geometrije. Kakovostnejši, a zahteva gostejšo mrežo. V filmih se pogosto kombinira z subdivision surfaces — gladilnim algoritmom, ki mrežo samodejno zgosti.
Renderiranje
Zakaj en filmski posnetek traja ure, videoigra pa mora prikazati 60 slik na sekundo.
Predznanje: Priporočljivo prebrano poglavje 6.
Renderiranje je zadnji korak: iz matematičnih opisov predmetov, materialov in svetlobe ustvari sliko. Obstajata dve temeljni filozofiji: rastriranje (rasterization) in sledenje žarkom (ray tracing). Prva je hitra in jo uporabljajo videoigre; druga je fizikalno točna in jo uporabljajo filmi.
Cevovod renderiranja (Render Pipeline)
Rastriranje poteka po fiksnem cevovodu, ki ga danes v celoti izvede GPU:
Sledenje žarkom
Sledenje žarkom simulira fizikalno pot svetlobe — le v obratni smeri. Iz vsake točke na zaslonu pošljemo žarek v sceno. Žarek zadene površino in »sprašuje«: Ali je ta točka v senci? Kaj se odbije? Kaj se prelomi skozi steklo? Za vsako odbijanje ali lomljenje posredujemo nov žarek. Rezultat je fotorealistična slika z naravnimi sencami, odsevi in lomom.
Opazujte, kako se slika gradi žarek za žarkom — levo desno, vrstico po vrstico.
Globalna osvetlitev
Klasično Phong senčenje je lokalno — vsaka točka vidi le direktno svetlobo. V resničnosti pa svetloba odbija od ene površine na drugo: rdeča stena zabarva sosednjo belo steno z rdečkastim odtenkom. To je globalna osvetlitev (global illumination). Metode jo dosežejo z simulacijo milijonov odbojev žarkov — t. i. sledenje poti (path tracing).
Globlje: GPU in zakaj je tako hiter ★★
CPU ima tipično 8–32 zmogljivih jeder. GPU ima tisoče manjših jeder — NVIDIA RTX 4090 jih ima kar 16.384. Vsako jedro je preprosto, a skupaj vzdržijo na tisoče sočasnih operacij. Renderiranje je idealna naloga za tak paralelizem: vsak piksel se izračuna neodvisno od ostalih.
Sodobni GPU-ji imajo posebno strojno opremo za sledenje žarkov (RT jedra), ki pohitri najpočasnejši del — iskanje presečišč žarkov s trikotniki. NVIDIA-jev DLSS in AMD-jev FSR sta tehniki, ki s strojnim učenjem vzorčita na nižji resoluciji in z nevronsko mrežo »uganeta« manjkajoče piksle — to poveča hitrost za faktor 2–4.
3D grafika v svetu
Vsak zaslon, ki ste ga danes gledali, je bil izrisan s tem znanjem.
Predznanje: Priporočljivo predhodno branje.
Matematika, ki smo jo spoznali v prejšnjih poglavjih, ni akademska — je temelj industrije vredne več sto milijard evrov. Oglejmo si, kje jo srečamo vsak dan.
Prihodnost: nevronske mreže in 3D
NeRF (Neural Radiance Fields) je revolucionarna tehnika, ki iz fotografij rekonstruira 3D sceno z nevronsko mrežo. Namesto poligonov se prostorska scena hrani implicitno v utežeh mreže. Kakovost 3D rekonstrukcije iz navadnih fotografij je bila do pred kratkim nepredstavljiva.
Gaussovo raztresanje (3D Gaussian Splatting) je nadgradnja NeRF: sceno predstavimo z milijoni 3D Gaussovih krivulj, ki se renderirajo izredno hitro — v realnem času. To odpira vrata za fotorealistično VR brez snemanja v nadzorovanem studiu.
Generativna 3D umetna inteligenca (npr. OpenAI Shap-E, Meta Make-A-3D) že danes ustvari 3D model iz besedilnega opisa. Pričakujemo, da bo v prihodnjih letih 3D modeliranje postalo dostopno vsakomur — enako, kot je generativna umetna inteligenca demokratizirala 2D ustvarjanje.