Kai pikseliai virsta realybe
Žiūrėdami į naujausią animacinį filmą ar žaisdami vaizdo žaidimą, retai susimąstome apie milžinišką darbą, kurį atlieka kompiuteris, kad ekrane pamatytume spalvingą vaizdą. Renderinimas – tai procesas, kurio metu matematiniai duomenys ir geometriniai objektai paverčiami tuo, ką matome ekrane. Galima sakyti, kad tai tarsi tiltas tarp programuotojo vaizduotės ir mūsų akių.
Pats žodis „renderinimas” kilo iš anglų kalbos „render”, reiškiančio „pateikti” ar „atvaizduoti”. Kompiuterinėje grafikoje tai reiškia procesą, kai trimatis modelis ar scena paverčiama dvimačiu vaizdu. Įsivaizduokite fotografą, kuris nufotografuoja skulptūrą – jis trimačią formą paverčia dvimatę nuotrauka. Kompiuteris daro kažką panašaus, tik daug sudėtingiau.
Nuo geometrijos iki pikselių: kelionė per renderinimo etapus
Renderinimo procesas prasideda nuo to, kas vadinamas geometriniu apdorojimu. Kiekvienas 3D objektas kompiuteryje susideda iš tūkstančių ar net milijonų mažyčių trikampių. Kodėl būtent trikampių? Nes trikampis yra paprasčiausia geometrinė figūra, kuri visada išlieka plokščia – nesvarbu, kaip pasuksite tris taškus erdvėje, jie visada sudarys vieną plokštumą.
Pirmiausia kompiuteris turi nustatyti, kur yra kamera – iš kokio taško žiūrime į sceną. Tada jis ima visus tuos trikampius ir perskaičiuoja jų pozicijas pagal kameros padėtį. Čia įsijungia transformacijos – objektai gali būti pasukti, padidinti, sumažinti ar perkelti. Visa tai vyksta naudojant matricų matematiką, kuri leidžia greitai atlikti sudėtingus skaičiavimus.
Po transformacijų ateina labai svarbus žingsnis – nuspręsti, kurie trikampiai iš tikrųjų bus matomi. Jei žiūrite į kubą, matote tik tris jo sienas, o kitos trys yra už nugaros. Kompiuteris atlieka tai, kas vadinama „culling” – atmeta tuos trikampius, kurių vis tiek nematysime. Tai sutaupo daug skaičiavimo galios.
Šviesa, šešėliai ir spalvos – kaip gimsta realizmas
Dabar prasideda įdomiausia dalis – nustatyti, kokios spalvos turėtų būti kiekvienas pikselis. Čia įsijungia apšvietimo skaičiavimai, kurie gali būti labai paprasti arba neįtikėtinai sudėtingi, priklausomai nuo to, kokio realizmo siekiama.
Paprasčiausiuose metoduose naudojamas tai, kas vadinama „Phong” ar „Blinn-Phong” apšvietimo modeliu. Šis metodas skaičiuoja tris pagrindinius dalykus: aplinkos šviesą (ambient), difuzinę šviesą (diffuse) ir atspindžius (specular). Aplinkos šviesa – tai bendras scenos apšvietimas, difuzinė šviesa rodo, kaip šviesa krenta ant matinių paviršių, o atspindžiai sukuria tuos blizgučius, kuriuos matome ant blizgių objektų.
Tačiau tikrasis iššūkis – tai šešėliai. Yra keletas būdų jiems sukurti. Vienas populiariausių – „shadow mapping”. Kompiuteris tarsi „žiūri” į sceną iš šviesos šaltinio perspektyvos ir įsimena, kokie objektai yra arčiausiai. Paskui, renderindamas iš kameros perspektyvos, jis patikrina, ar kiekvienas taškas yra matomas šviesos šaltiniui. Jei ne – ten šešėlis.
Tekstūros ir detalės: kai paviršiai atgyja
Tuščias 3D modelis be tekstūrų atrodo kaip baltas gipsinis maketėlis. Tekstūros – tai paveikslėliai, kurie „apklijuojami” ant 3D objektų paviršiaus. Procesas vadinamas tekstūrų žemėlapiavimas (texture mapping), ir jis reikalauja kiekvienam 3D objekto taškui priskirti atitinkamą tekstūros koordinatę.
Įsivaizduokite, kad turite dovanų dėžutę ir norite ją apklijuoti popierium su raštais. Turėtumėte išlankstyti dėžutę į plokščią formą, tada uždėti ant popieriaus ir iškirpti. Panašiai veikia UV mapping – 3D paviršius „išlanksomas” į 2D erdvę, kur galima pritaikyti tekstūrą.
Šiuolaikinėje grafikoje naudojamos ne tik spalvų tekstūros. Normalių žemėlapiai (normal maps) sukuria iliuziją, kad paviršius turi daug smulkių detalių, nors iš tikrųjų geometrija išlieka paprasta. Tai veikia apgaudinėjant apšvietimo skaičiavimus – kompiuteris „mano”, kad paviršius yra nelygus, nors jis plokščias. Dar yra roughness žemėlapiai, kurie nustato, kur paviršius blizgus, o kur matinis, displacement žemėlapiai, kurie iš tikrųjų keičia geometriją, ir daugelis kitų.
Rasterizacija prieš spindulių sekimą: du skirtingi pasauliai
Ilgą laiką dominavo rasterizacijos metodas. Tai procesas, kai visi tie trikampiai paverčiami pikseliais ekrane. Kompiuteris ima kiekvieną trikampį ir nustato, kuriuos ekrano pikselius jis uždengia, tada užpildo tuos pikselius atitinkamomis spalvomis. Tai labai greitas metodas, todėl jis idealiai tinka realiojo laiko aplikacijoms, tokioms kaip vaizdo žaidimai.
Tačiau rasterizacija turi apribojimų. Sunku sukurti tikroviškus atspindžius, lūžius šviesos spindulius ar sudėtingus šešėlius. Čia į pagalbą ateina spindulių sekimas (ray tracing). Šis metodas veikia atvirkščiai – jis seka šviesos spindulius nuo kameros į sceną.
Spindulių sekimas veikia taip: iš kameros išleidžiamas virtualus šviesos spindulys per kiekvieną ekrano pikselį. Kompiuteris skaičiuoja, į ką tas spindulys atsimušė scenoje. Tada jis skaičiuoja, kaip šviesa atsispindi nuo to paviršiaus, galbūt išleidžia naujus spindulius, kurie atsimušė į kitus objektus, ir taip toliau. Tai leidžia sukurti neįtikėtinai realistiškus vaizdus su tikroviškais atspindžiais, permatomumu ir šešėliais.
Problema ta, kad spindulių sekimas yra labai lėtas. Ilgus metus jis buvo naudojamas tik filmų gamyboje, kur vieno kadro renderinimas galėjo užtrukti valandas ar net dienas. Tačiau dabar, su naujomis vaizdo plokštėmis, turinčiomis specializuotus spindulių sekimo branduolius, šis metodas tampa prieinamas ir realiojo laiko aplikacijose.
Kai kompiuteris dirba viršvalandžius: optimizavimo triukai
Renderinimas gali būti neįtikėtinai reiklus kompiuterio resursams. Todėl per dešimtmečius buvo sukurta daugybė triukų, kaip paspartinti procesą neprarandant kokybės.
Vienas iš svarbiausių – detalumo lygiai (Level of Detail, LOD). Objektai, kurie yra toli nuo kameros, renderinami su mažiau trikampių. Juk kam rodyti visas smulkmenas, jei jos vis tiek nebus matomos? Kai kurie žaidimai turi net penkis ar šešis skirtingus kiekvieno objekto variantus – nuo labai detalaus iki labai supaprastinto.
Kitas svarbus metodas – okliuzijos nustatymas (occlusion culling). Jei už didelio pastato yra visas miestas, kam jį renderinti, jei vis tiek nematysime? Kompiuteris gali iš anksto nustatyti, kas yra už kitų objektų, ir tiesiog to neapdoroti.
Frustum culling – dar vienas paprastas, bet efektyvus metodas. Kamera mato tik tam tikrą erdvės dalį (tarsi piramidę). Viskas, kas už šios piramidės ribų, tiesiog ignoruojama. Tai ypač naudinga didelėse scenose su daugeliu objektų.
Postprodukcija: paskutiniai potėpiai
Net kai pagrindinis renderinimas baigtas, darbas dar nesibaigė. Postprodukcijos efektai prideda paskutinius potėpius, kurie daro vaizdą tikrai įspūdingą.
Bloom efektas prideda švytėjimą aplink ryškias šviesas, tarsi žiūrėtumėte pro šiek tiek rasotą stiklą. Motion blur sukuria judėjimo įspūdį – kai objektai juda greitai, jie tampa šiek tiek neryškūs, kaip tikrose fotografijose. Depth of field (lauko gylis) daro taip, kad objektai, kurie yra ne fokuse, tampa neryškūs, kaip tikrose kamerose.
Ambient occlusion – tai subtilus efektas, kuris prideda šešėlius ten, kur objektai yra arti vienas kito. Pavyzdžiui, kampe tarp sienos ir grindų būtų šiek tiek tamsiau. Tai prideda erdvės ir realizmo jausmą.
Color grading – spalvų koregavimas – leidžia suteikti scenai tam tikrą nuotaiką. Šiltos spalvos gali sukurti jaukumo jausmą, o šaltos – atšiaurų ar futuristinį.
Kada pikseliai tampa menu
Renderinimas nėra tik techninis procesas – tai menas ir mokslas kartu. Kiekvienas pasirinkimas, nuo to, kiek trikampių naudoti modeliui, iki to, kaip nustatyti apšvietimą, turi įtakos galutiniam rezultatui.
Šiandien renderinimo technologijos pasiekė tokį lygį, kad kartais sunku atskirti, kas tikra, o kas kompiuteriu sukurta. Filmuose matome nereališkus pasaulius, kurie atrodo tikresni už tikrus. Žaidimuose galime tyrinėti detales, kurios seniau būtų pareikalavusios superkompiuterių galios.
Tačiau viskas prasideda nuo tų pačių pagrindinių principų – geometrijos, šviesos, spalvų ir matematikos. Nesvarbu, ar tai paprastas mobilaus žaidimo renderinimas, ar holivudinio filmo specialieji efektai, pagrindai išlieka tie patys. Skiriasi tik tai, kiek sluoksnių sudėtingumo ir detalumo dedama viršuje.
Renderinimo technologijos nuolat tobulėja. Dirbtinis intelektas jau dabar naudojamas vaizdo kokybei gerinti ir procesui spartinti. Kas žino, galbūt netrukus kompiuteriai galės sukurti fotorealistiškus vaizdus realiuoju laiku be jokių kompromisų. Bet kol kas mes vis dar žaidžiame su kompromisais tarp greičio, kokybės ir resursų – ir būtent čia slypi renderinimo meno esmė.




