Šioje antrojoje dalyje, kur nuodugniau apžvelgsime 3D žaidimų kūrimą, sutelksime dėmesį į tai, kas nutiks 3D pasauliui, kai bus baigtas visas kampinis procesas. Turėsime vėl nuvalyti dulkes nuo matematikos vadovėlių, spręsti nusivylimo geometriją ir galvoti apie perspektyvų galvosūkį. Taip pat greitai pasinersime į spindulių sekimą, apšvietimą ir medžiagų fiziką - puikiai!

Pagrindinė šio straipsnio tema yra svarbus atvaizdavimo etapas, kai taškinis, linijinis ir trikampis erdvinis pasaulis tampa dvimatis spalvotų kaladėlių tinklelis. Tai tiesiog „nutinka“, nes 3D-2D pokyčių procesai yra nematomi, mūsų ankstesnis straipsnis čia iškart galėjome pamatyti kampinių šešėlių ir mozaikų poveikį. Jei nesate pasiruošę viskam, nesijaudinkite - galite pradėti. 3D žaidimų atvaizdavimas 101. Tačiau perskaitykite kitą 3D grafikos pasaulį, kai jis bus nustatytas.

Pasirengimas 2 matmenims

Daugelis jūsų peržiūrėsite šią svetainę visiškai plokščiame monitoriuje arba išmaniojo telefono ekrane; Net jei esate kietas ir ramus su vaikais ir turite puošnų išlenktą monitorių, jo rodomus vaizdus sudaro plokščias spalvotų pikselių tinklelis. Vis dėlto atrodo, kad vaizdai yra 3D, kai žaidžiate „Call of Mario: Deathduty Battleyard“. Objektai juda į aplinką ir iš jos, kai įeina į kamerą ir išeina iš jos.

Naudojant „Bethesda“ Fallout 4 2014 m. Pavyzdžiu galime lengvai pamatyti, kaip tvarkomi kampai, kad sukurtų gylio ir atstumo pojūtį, ypač jei bėgate laidinio rėmo režimu (viršuje).




Jei pasirinksite bet kurį šiandienos ar pastarųjų dvidešimties metų 3D žaidimą, beveik kiekvienas iš jų atliks tą pačią įvykių seką, kad viršūnių 3D pasaulį paverstų 2D taškų masyvu. Paprastai vadinamas proceso, kuris pakeitė, pavadinimas pikselių bet tai tik vienas iš daugelio žingsnių visame dalyke.




Turėsime suskirstyti keletą skirtingų etapų ir išnagrinėti naudojamus metodus ir matematiką, o „Direct3D“ naudojamą seką naudosime norėdami ištirti, kas vyksta. Žemiau pateiktame paveikslėlyje parodyta, kas buvo padaryta kiekvienai pasaulio viršukalnei:







Kas buvo padaryta pasaulio kosmoso scenoje? 1 dalies straipsnis: Čia viršūnės transformuojamos ir nuspalvinamos naudojant kelis matricos skaičiavimus. Mes praleisime kitą skyrių, nes fotoaparato srityje vienintelis dalykas yra tai, kad konvertuoti kampai po judėjimo sureguliuojami, kad būtų kameros atskaitos taškas.

Kiti žingsniai yra labai svarbūs norint pereiti į priekį, nes jie yra labai svarbūs pereinant iš 3D į 2D - padaryta teisingai, o mūsų smegenys žiūrės į plokščią ekraną, bet „matys“ sceną su gyliu ir masteliu - neteisingai padaryta ir viskas atrodys labai keista!




Viskas yra perspektyvos klausimas

Pirmasis šios sekos žingsnis apima matymo lauko, kurį mato kamera, apibrėžimą. Pirmiausia tai daroma koreguojant horizontalaus ir vertikalaus regėjimo lauko kampus - pirmąjį žaidimuose dažnai galima pakeisti, nes žmonėms periferinis regėjimas iš šono yra geresnis nei aukštyn ir žemyn.

Tai galime suprasti iš šio vaizdo, rodančio žmogaus regėjimo lauką:




Du žiūrėjimo kampai (trumpai fov), frustum - iš kameros išeina 3D kvadrato formos piramidė. Pirmasis kampas vertikalus fov, antras horizontaliai vienas; naudosime simbolius α ve β jiems parodyti. Dabar mes nematome pasaulio būtent taip, bet daug lengviau dirbti su „frustum“ nei bandyti sukurti realistišką vaizdo tūrį.

Taip pat reikia apibrėžti du kitus nustatymus - artimą (arba priekinę) ir tolimą (galinę) padėtį kirpimo lėktuvai. Pirmasis nukerta piramidės viršų, bet daugiausia nustato, kiek arti kamera yra ta vieta, kur kas nors buvo nupiešta; antrasis daro tą patį, bet apibrėžia, kiek primityvai bus pašalinti iš fotoaparato.

Beveik apkarpomos plokštumos dydis ir padėtis yra svarbi, nes taip yra Peržiūrėti,. Tai iš tikrųjų yra tai, ką matote monitoriuje, t. Y. Pateiktas rėmas, o daugumoje grafinių API rodinys „nupieštas“ iš viršutinio kairio kampo. Žemiau esančiame paveikslėlyje taškas (a1, b2) bus plokštumos šaltinis, o iš čia matuojamas plokštumos plotis ir aukštis.

kraštinių santykis Kaip perspektyva yra labai svarbi tam, kaip atrodys sukurtas pasaulis, ji taip pat turi atitikti monitoriaus formato santykį. Daugelį metų tai visada yra 4: 3 (arba 1,3333 ... Šiandien dauguma iš mūsų turi plačiaekranius ir itin plačiaekranius žaidimus, tokius kaip 16: 9 arba 21: 9.

Kiekvienos kameros srities viršūnės koordinatės turi būti pakeistos taip, kad visos jos tilptų į artimiausią karpymo plokštumą, kaip parodyta žemiau:

Transformacija atliekama naudojant kitą matricą - į šią konkrečią perspektyvos projekcijos matrica. Žemiau pateiktame pavyzdyje transformacijai naudojame pasėlių plotą ir kirpimo plokštumų padėtį; vietoj to galime naudoti peržiūros srities matmenis.

Viršūnės padėties vektorius padauginamas iš šios matricos ir suteikia naują transformuotą koordinačių rinkinį.

Et voila! Dabar mes parašėme visus savo kampus taip, kad pradinė žemė dabar pasirodytų kaip priverstinė 3D perspektyva, kad primityviai šalia iš anksto iškirptos plokštumos būtų didesni nei šalia tolimos plokštumos.

Nors vaizdo dydis ir matymo kampų kampai yra vienas nuo kito priklausomi, juos galima apdoroti atskirai - kitaip tariant, jei norite suteikti skirtingą kirpimo plokštumą pagal vaizdo dydį ir formato santykį, juos galima apdoroti atskirai. Kad tai įvyktų, reikalingas papildomas grandinės žingsnis, kai kampai artimiausioje apkarpymo plokštumoje turi būti perdirbami, kad būtų atsižvelgta į skirtumą.

Tačiau tai gali iškreipti rodomą perspektyvą. naudoti 2011 m. „Bethesda“ žaidimas „Skyrim“, galime pamatyti, kaip koreguojamas horizontalus žiūrėjimo kampas βTai daro didelę įtaką scenai, išlaikant tą patį peržiūros srities proporciją:

Šiame pirmame paveikslėlyje β = 75 °, o scena atrodo visiškai normali. Pabandykime dabar β = 120°:

Du skirtumai iš karto akivaizdūs - visų pirma, mes dabar galime pamatyti daug daugiau savo „vizijos“ pusėse, antra, objektai dabar atrodo daug toliau (ypač medžiai). Tačiau vizualinis vandens paviršiaus poveikis šiuo metu nėra matomas, ir todėl, kad procesas nebuvo sukurtas šiam matymo laukui.

Dabar tarkime, kad mūsų personažas turi svetimas ir į akis panašias akis. β = 180°!

Šis regėjimo laukas suteikia mums beveik panoraminį vaizdą, tačiau kainuoja rimtai objektų, sukurtų vaizdo kraštuose, iškraipymas. Vėlgi, taip yra todėl, kad žaidimo dizaineriai neplanavo ir nesukūrė žaidimo turto ir vaizdo efektų šiam požiūriui (numatytoji vertė yra apie 70 °).

Kamera gali atrodyti judėjusi aukščiau esančiuose paveikslėliuose, tačiau taip neatsitiko - nutiko tik tai, kad buvo pakeista mano krūtinės forma, kuri pertvarkė artimiausio nukirpimo plokštumos matmenis. Kiekviename paveikslėlyje peržiūros srities proporcija išliko ta pati, todėl kampams buvo pritaikyta mastelio matrica, kad viskas būtų pertvarkyta.

Taigi, jūs esate viduje ar lauke?

Kai viskas teisingai transformuojama projekcijos etape, mes pereiname prie to, kas vadinama spaustuko sritis. Nors tai ir daroma Tada projekciją lengviau įsivaizduoti, kas vyksta, jei tai padarysime anksčiau:

Aukščiau pateiktoje diagramoje matome, kad guminė antis, vienas iš šikšnosparnių ir kai kurie medžiai, yra trikampiai, esantys pilvo srityje; Tačiau kitas šikšnosparnis, tolimiausias medis ir panda yra už krūtinės ląstos ribų. Nors kampai, sudarantys šiuos objektus, jau yra apdirbti, jie peržiūros srityje nerodomi. Tai reiškia sutrumpintas.

In frustum apkarpymasVisi principai, išskyrus „frustum“, yra visiškai pašalinti, o bet kurioje iš ribų esantys primityviai yra pertvarkomi į naujus primityvius. Apkarpykite iki šios vietos visus nematomus kampų kampučius ir pan. Tai nėra našumo didinimas, nes jis vykdomas per. Pats iškarpymo etapas taip pat gali būti praleistas, jei reikia, tačiau to palaiko ne visos API (pavyzdžiui, standartinis „OpenGL“ neleidžia to praleisti, tačiau tai galima padaryti naudojant API plėtinį).

Reikėtų pažymėti, kad nuotolinio karpymo plokštumos vieta nebūtinai yra vienoda. piešimo atstumas Žaidimuose pastarąjį valdo pats žaidimo variklis. Viskas, ką darys variklis „Frustum“ skerdimas - čia kodas vykdomas siekiant nustatyti, ar objektas bus pilnas ir (arba) paveikti viską, kas bus matoma; Jei atsakymas yra noŠis objektas nėra siunčiamas kurti. Tai nėra tas pats, kas apgauti nusivylimą, nes, nors primityvūs daiktai iš nusivylimo nukrito, jie praeina piko apdorojimo etapą. Atėmus, jie apskritai nėra apdorojami, todėl sutaupoma gana daug našumo.

Dabar, kai atlikome visas transformacijas ir apdailą, kampai pagaliau pasirodo paruošti kitam etapui visoje vaizdavimo sekoje. Jie nėra iš to išėję. Taip yra todėl, kad visa matematika, atliekama manipuliuojant viršūnėmis ir erdvės operacijose „pasaulis į klipą“, turi būti atliekama naudojant vienalytę koordinačių sistemą (t. Y. Kiekvienoje viršūnėje yra 4, o ne 3 komponentai). Tačiau vaizdas yra visiškai 2D, todėl informacija apie API viršūnes yra tik x, y (gylio vertė z yra išsaugotas).

Norėdami atsikratyti 4-ojo komponento, perspektyvinis skyrius kiekvienas komponentas w vertė. Šis nustatymas fiksuoja verčių diapazoną x ve y [-1,1] gali imti ir z [0,1] diapazonas - jie vadinami sunormintos prietaiso koordinatės (NDC trumpai).

Jei norite sužinoti daugiau apie tai, ką ką tik aptarėme, ir mielai pasineriate į daug daugiau matematikos, „Song Ho Ahn's“ puiki pamoka Apie temą. Konvertuokime šiuos kampus į taškus!

Rastro meistras

Kaip ir atliekant transformacijas, panagrinėsime, kaip „Direct3D“ nustato taisykles ir veiksmus, kad peržiūros sritis paverstų taškų tinkleliu. Šis tinklelis yra tarsi skaičiuoklė su eilutėmis ir stulpeliais, kuriuose kiekviename langelyje yra kelios duomenų vertės (spalva, gylio vertės, tekstūros koordinatės ir kt.). Paprastai šis tinklelis rastras ir jo gamybos procesas pikselių. Mūsų 3D atvaizdavimas 101 straipsnis, mes gavome labai supaprastintą procedūros vaizdą:

Iš aukščiau esančio vaizdo susidaro įspūdis, kad primityviai buvo supjaustyti tik į mažus kaladėles, tačiau yra daug daugiau. Pirmas žingsnis yra suprasti, ar primityvus iš tikrųjų žiūri į kamerą - ankstesniame šio straipsnio vaizde matomi, pavyzdžiui, primityviai, kurie sudarė pilkojo triušio galą ir rodė nusivylimą. Taigi jų kurti nereikia, nors jie yra matymo lauke.

Pagal žemiau pateiktą diagramą galime apytiksliai suprasti, kaip tai atrodo. Kubas patyrė keletą transformacijų, kad 3D modelis būtų patalpintas 2D ekrano erdvėje, o kameros požiūriu kai kurių kubo veidų nematyti. Darant prielaidą, kad nė vienas iš paviršių nėra skaidrus, kai kuriuos iš šių primityvių galima nepaisyti.

Direct3D'de bu, sisteme apdorojimo būsena bus ir ši instrukcija pasakys apie jos pašalinimą (dar žinomą kaip išmesti) kiekvienai primityviai pusei, kuri nukreipta į priekį arba atgal (arba visai nėra akla, pavyzdžiui, vielinis rėmas režimas). Taigi iš kur jis žino, kas yra priekis ar galas? Kai žiūrėsime matematika kampinio apdirbimo srityjeMes matėme, kad trikampiai (arba turi daugiau viršūnių) turi įprastus vektorius, kurie sistemai nurodo, kuria kryptimi ji susiduria. Turint šią informaciją, galima atlikti paprastą patikrinimą ir, jei pirminis patikrinimas nepavyks, jis bus pašalintas iš kartos grandinės.

Tada laikas pradėti diegti taškų tinklelį. Vėlgi, tai yra stebėtinai sudėtinga, nes jei pikselis visiškai tinka primityviam - visiškai, dalinai ar apskritai - sistema turi veikti. Padaryti tai, apimties testas padaryta. Žemiau esančiame paveikslėlyje parodyta, kaip trikampiai yra rastruoti sistemoje „Direct3D 11“:

Taisyklė yra gana paprasta: jei pikselių centras viršija tai, ką „Microsoft“ vadina, taškas laikomas trikampiu. „viršuje kairėje“ taisyklė. „Viršutinė“ dalis yra horizontalios linijos valdymas; pikselių centras on šią eilutę. „Kairė“ dalis skirta ne horizontalioms linijoms, o pikselio centras turi nukristi į kairę nuo tokios linijos. Yra ne primityvių taisyklių, t. Y. Paprastų linijų ir taškų, ir jei taisyklės įgyja papildomų sąlygų, yra papildomų taisyklių multisampling'i yra įdarbinti.

Atidžiai pažiūrėję į „Microsoft“ dokumentuose esantį vaizdą galime pastebėti, kad taškų sukurtos formos nėra labai panašios į originalius primityvus. Taip yra todėl, kad pikseliai yra per dideli, kad susidarytų tikrovišką trikampį - rastre nėra pakankamai duomenų apie pradinius objektus ir sutapti.

Panaudokime „UL Benchmark“ 3DMark03 Norėdami pamatyti pseudonimą apdorojant:

Pirmajame paveikslėlyje nuskaitymo dydis nustatytas į labai mažą 720 x 480 taškų vertę. Ant turėklų aiškiai matomas sutapimas, o šešėlis meta aukščiausiojo kareivio laikomą ginklą. Palyginkite tai su tuo, ką gaunate nuskaitydami 24 kartus daugiau taškų:

Čia galime pastebėti, kad slapyvardžio ant turėklų ir šešėlio visiškai nebėra. Kiekvieną kartą gali atrodyti didesnis nuskaitymo kelias, tačiau tinklelio matmenis turi palaikyti monitorius, kuriame bus rodomas rėmelis, o šie pikseliai turi būti apdorojami po rastravimo. yra akivaizdi veiklos bausmė.

Čia gali padėti kelių mėginių atranka ir jis veikia „Direct3D“ taip:

Užuot tikrinę, ar pikselių centras atitinka rastravimo taisykles, kelios vietos (pikselių pavyzdžiai arba papročiai) yra išbandomi kiekviename pikselyje ir, jei kuris nors iš jų yra tinkamas, tas pikselis yra formos dalis. Tai gali nepadėti ir net pabloginti pseudonimą, tačiau kai naudojamas daugkartinis mėginių ėmimas, kurie pogrupiai yra primityvūs, o pikselių apdorojimo rezultatai saugomi atminties buferyje.

Tada šis buferis naudojamas sumaišant pogrupio ir pikselių duomenis, kad primityvieji kraštai būtų mažiau užblokuoti. Vėliau straipsnyje apžvelgsime visą įstrigusią situaciją, tačiau kol kas tai gali padaryti kelių mėginių atranka, kai naudojamas labai žemų taškų nuskaitymas:

Galime pastebėti, kad anti-aliasing kiekis įvairių formų kraštuose yra labai sumažėjęs. Didesnis rastras yra tikrai geresnis, tačiau veikimo rezultatas gali padėti naudoti kelis mėginius.

Viskas, ką galima padaryti rastravimo procese sąkandžio testas. Tai reikia padaryti, nes matymo lauke bus daug primityvų, kurie sutaps (užblokuotas) - pavyzdžiui, aukščiau pateiktame paveikslėlyje priekyje esantys trikampiai, sudarantys priekiniame plane esančius soliderius, sutampa su tais pačiais kito kareivio trikampiais. Be tikrinimo, ar primityvus dengia pikselį, santykinius gylius taip pat galima palyginti ir praleisti iš likusio atvaizdavimo proceso, jei vienas yra už kito.

Tačiau, jei beveik primityvus yra skaidrus, kitas vis tiek bus matomas, nors jis nepajėgia patikrinti okliuzijos. Štai kodėl beveik visi 3D varikliai atlieka okliuzijos patikrinimus pirmenybė Kažko siuntimas į GPU ir vietoj to Z tamponas kaip kūrimo proceso dalis. Čia kadras paprastai atvaizduojamas, tačiau GPU saugo tik gylio reikšmes, o ne saugo galutines pikselių spalvas atmintyje. Tada tai gali būti naudojama šešėliuose, kad būtų galima geriau kontroliuoti matomumą ir tiksliau kontroliuoti aspektus, susijusius su objekto sutapimu.

Aukščiau esančiame paveikslėlyje kuo tamsesnė taško spalva, tuo objektas yra arčiau fotoaparato. Kad būtų sukurtas „z“ buferis, rėmelis sukuriamas vieną kartą, tada atstatomas, tačiau šį kartą, kai apdorojami pikseliai, paleidžiamas „shader“, kad būtų galima patikrinti juos su z buferio reikšmėmis. Jei jo nematyti, ši taškų spalva nėra dedama į galutinį kadrų buferį.

Kol kas tikras paskutinis žingsnis viršūnių atributų interpoliacija - mūsų pirmoje supaprastintoje diagramoje primityvus buvo visas trikampis, tačiau atminkite, kad vaizdas užpildytas figūrų viršūnėmis, o ne pačia figūra. Taigi sistema turi išsiaiškinti, kaip primityvo spalva, gylis ir tekstūra yra tarp kampų, ir taip ji vadinama. interpolasyon. Kaip galite įsivaizduoti, tai nėra paprastas skaičiavimas, bet kitas skaičiavimas.

Nors rastruotas ekranas yra 2D, viduje esančios struktūros atspindi priverstinę 3D perspektyvą. Jei linijos tikrai buvo dvimatės, tai paprasta linijinis įvairių spalvų ir pan., eidami nuo vienos viršukalnės prie kitos. Tačiau dėl 3D scenos aspekto interpoliuojant reikia atsižvelgti į perspektyvą - Simonas Yeung'unas muhteşem blogu norėdami gauti daugiau informacijos apie procesą.

Čia mes einame - 3D kampų pasaulis tampa 2D spalvotų blokų tinkleliu. Vis tiek mes darome nedaug.

Viskas nuo priekio iki galo (išskyrus atvejus, kai jo nėra)

Prieš baigdami rastravimo procesą, turime ką nors pasakyti apie pateikimo tvarką. Pavyzdžiui, mes nekalbame apie tai, iš kur paeiliui atsirado tessellation; vietoj to mes kalbame apie pirmykščių tvarką. Objektai dažnai apdorojami tokia tvarka, kokia jie yra katalogų buferyje (atminties blokas, sistemai nurodantis, kaip grupuojamos viršūnės), ir tai gali turėti reikšmingą įtaką skaidrių objektų ir efektų valdymui.

Taip yra dėl to, kad primityviai yra gydomi po vieną, o jei pirmiausia darote priekinius, niekas už jų nėra matomas (čia iš tikrųjų vyksta okliuzijos rūšiavimas). ir gali būti pašalintas iš veiksmo (padeda efektyvumui) - tai paprastai yrapriekis atgal reikalauja, kad kūrimas ir katalogų buferis būtų užsakyti tokiu būdu.

Tačiau, jei kai kurie iš šių primityvių elementų, esančių tiesiai prieš kamerą, yra skaidrūs, perteikiant „iš priekio į nugarą“ už skaidrios bus praleisti objektai. Vienas iš sprendimų yra daryti viską nuo priekio iki nugaros, o skaidrūs primityvai ir efektai atliekami paskutiniai.

Taigi visi šiuolaikiniai žaidimai perteikti atgal, tiesa? Jei tai nėra naudinga - nepamirškite, kad kiekvieno primityvaus atvaizdavimo našumas bus daug didesnis, nei galima tik matyti. Yra ir kitų būdų, kaip spręsti skaidrius objektus, tačiau paprastai kalbant, nėra vieno visiems tinkamo sprendimo ir kiekviena situacija turi būti sprendžiama unikaliai.

Tai iš esmės apibendrina rastravimo privalumus ir trūkumus - šiuolaikinėje aparatūroje tai tikrai greita ir efektyvu, tačiau tai vis tiek apytikslė to, ką mes matome. Realiame pasaulyje kiekvienas objektas sugeria, atspindi ir galbūt sutrinka šviesą, ir visa tai turi įtakos žiūrimai scenai. Greitą, bet apytikslį rezultatą gauname padaliję pasaulį į primityvius ir sukūrę tik kai kuriuos iš jų.

Jei tik būtų kitas būdas ...

Ten is Kitas būdas: spindulių sekimas

Maždaug prieš du dešimtmečius kompiuterių mokslininkas, pavadintas Arthur Appel, sukūrė vaizdų kūrimo kompiuteryje sistemą, kad vienas tiesios šviesos pluoštas būtų išmestas iš fotoaparato, kol jis pataikys į daiktą. Tada medžiagos savybės (spalva, atspindėjimas ir kt.) Keičia šviesos pluošto intensyvumą. Kiekvienas atvaizduoto vaizdo taškas turi spindulį ir algoritmas, kuris iššifruoja pikselio spalvą, atlikdamas matematinę seką. Apelio procesas Bėgių liejimas.

Maždaug po 10 metų kitas mokslininkas Johnas Whittedas Jis sukūrė matematinį algoritmą, kuris buvo toks pat kaip Appelio požiūris, tačiau, spinduliui pataikius į objektą, jis sugeneruotų papildomų pluoštų, kurie būtų šaudomi įvairiomis kryptimis, priklausomai nuo objekto medžiagos. Kadangi ši sistema generuos naujus spindulius kiekvienai objekto sąveikai, algoritmas buvo rekursyvus ir todėl daug sudėtingesnis skaičiavimais; tačiau jis turėjo reikšmingą pranašumą prieš Appelio metodą, nes jis galėjo tinkamai paaiškinti atspindį, lūžimą ir šešėliavimą. Šios procedūros pavadinimas: Spindulių atsekimas (būti nuoširdžiam, atgal spindulių sekimas, kaip kad mes stebime fotoaparato spindulį, o ne objektą) ir šventasis gralis kompiuterinei grafikai ir filmai nuo to laiko.

Šios procedūros pavadinimas buvo spindulių sekimas (atgalinis spindulių sekimas, griežtai tariant, nes mes stebime spindulius iš fotoaparato, o ne iš objektų) ir nuo to laiko yra šventasis gralis kompiuterinės grafikos ir filmų.

Aukščiau pateiktame paveikslėlyje galime susidaryti Whitted darbo algoritme idėją. Kiekvieno kadro taško spindulys iš fotoaparato sklinda ir sklinda tol, kol pasiekia paviršių. Šis konkretus paviršius yra permatomas, todėl šviesa jį atspindės ir lūš. Abiem atvejais susidaro antriniai spinduliai ir išeina tol, kol sąveikauja su paviršiumi. Taip pat yra papildoma antrinė dalis, kurioje atsižvelgiama į šviesos šaltinių spalvą ir jų sukurtus šešėlius.

Rekursinė proceso dalis yra ta, kad antrinės sijos gali būti generuojamos kiekvieną kartą, kai naujas liejimo spindulys kerta paviršių. Tai gali lengvai nekontroliuoti, todėl generuojamų antrinių spindulių skaičius visada yra ribotas. Baigus pluošto kelią, jo spalva kiekviename galiniame taške apskaičiuojama pagal to paviršiaus medžiagines savybes. Tada ši vertė perduoda spindulį į ankstesnį, koreguodama šio paviršiaus spalvą ir t. T., Kol ji pasiekia pirminio pluošto efektyvų pradinį tašką (rėmelio pikselį).

Tai gali būti labai sudėtinga, ir net paprasti scenarijai gali sukurti skaičiavimo slenkstį. Laimei, tam tikri dalykai gali būti padėti - vienas būtų specialiai sukurta aparatine įranga tam tikroms matematikos operacijoms pagreitinti, lygiai taip pat, kaip atliekant matricos matematiką kampiniame apdirbime (daugiau per akimirką)). Kitas kritinis dalykas yra pagreitinti procesą, kurį objektą spindulys pataiko ir kur tiksliai jis yra objekto paviršiuje, kur jis susikerta - o tai gali nustebinti, jei objektas pagamintas iš daugybės trikampių. sunku padaryti:

Užuot išbandžius kiekvieną trikampį, prieš atliekant spindulių nustatymą kiekviename objekte sukuriamas ribojančių tūrių (BV) sąrašas - tai ne kas kita, o atitinkamai objektą supantys kuboidai, kurie yra nuosekliai mažesni įvairioms jo struktūroms. objektas.

Pavyzdžiui, pirmasis BV būtų skirtas visam triušiui. Kita pora yra jų galva, kojos, liemuo, uodega ir kt. kiekviena iš šių tada mažų galvos struktūrų ir kt. Kiekvienam bus dar vienas tomų rinkinys, o galutiniame tūrio lygyje bus nedidelis bandomų trikampių skaičius. Tada visi šie tomai yra išdėstyti pagal užsakytą sąrašą ( BV hierarchija arba trumpai BVH), kad sistema kiekvieną kartą valdytų santykinai nedidelį BV skaičių:

Nors BVH naudojimas techniškai nepagreitina tikrojo spindulių atsekimo, hierarchijos ir vėlesnio paieškos algoritmo sukūrimas dažnai yra daug greitesnis, nei reikia patikrinti, ar spindulys kerta vieną iš milijonų trikampių. 3D pasaulyje.

Tokios programos kaip šiandien maišytuvas ve POV-Ray Norėdami sukurti labai tikroviškus vaizdus, ​​naudokite spindulių sekimą su papildomu stebėjimu (pvz., Fotonų sekimu ir radiju):

Akivaizdus klausimas, kurį reikia užduoti, ar spindulių sekimas yra toks geras, kodėl mes jo nenaudojame visur? Atsakymai skirstomi į dvi sritis: visų pirma, net paprastas spindulių sekimas sukelia milijonus spindulių, kuriuos reikia apskaičiuoti dar ir dar kartą. Sistema prasideda tik vienu pluoštu ekrano pikselyje, taigi, esant tik 800 x 600 skiriamajai gebai, ji sukuria 480 000 pirminių pluoštų, kurių kiekvienas sukuria po kelis antrinius pluoštus. Tai rimtas reikalas net ir šiandieniniams staliniams kompiuteriams. Antrasis klausimas yra tas, kad pagrindinis spindulių atsekimas iš tikrųjų nėra labai realus, todėl norint pateikti teisingumą reikia įtraukti keletą papildomų, labai sudėtingų lygčių.

Net ir naudojant šiuolaikinę kompiuterio techninę įrangą, darbo apimtis, reikalinga tai padaryti realiu laiku, naudojant dabartinį 3D žaidimą, yra už apimties ribų. Mūsų 3D atvaizdavimas 101 Jo straipsnyje matėme, kad norint pagaminti vieną mažos skiriamosios gebos vaizdą pagal spindulių sekimo etaloną prireikė dešimčių sekundžių.

Taigi, kaip originaliam Wolfensteinui buvo atliktas 3D pluošto liejimas, grįžęs 1992 m., Ir kodėl jis patinka? Mūšio laukas V ve Metro migracija, abu pradėti naudoti 2019 m., siūlo spindulių sekimo funkcijas? Ar jie rastriniai, ar spindulių pėdsakai? Atsakymas: šiek tiek abiejų.

Hibridinis požiūris šiandienai ir ateičiai

2018 m. Kovo mėn. „Microsoft“ paskelbė apie naują „Direct3D 12“ API plėtinį, pavadintą DXR („DirectX Raytracing“). Tai buvo nauja diagramos linija, papildžiusi standartinius rastravimo ir skaičiavimo vamzdynus. Papildomas funkcionalumas, šešėliai, duomenų struktūros ir kt. Jis buvo pateiktas įvedus, tačiau tam nereikėjo jokios specialios aparatinės įrangos palaikymo, išskyrus tai, ko jau reikia „Direct3D 12“.

Toje pačioje žaidimų kūrėjų konferencijoje Kalbėjo apie „Microsoft DXR“„Electronic Arts“ kalbėjo apie juos Pica Pica Projesi - 3D variklio eksperimentas naudojant DXR. Jie parodė, kad spindulių sekimą galima naudoti, tačiau jie negali būti naudojami visam vaizdavimo rėmui. Vietoj to, didžiojoje darbo dalyje bus naudojami tradiciniai rastravimo ir skaičiavimo šešėlių metodai, DXR naudojamas tam tikrose srityse - tai reiškia, kad spindulių skaičius yra daug mažesnis nei visoje scenoje.

Šis hibridinis metodas anksčiau buvo naudojamas mažiau. Pavyzdžiui, „Wolfenstein 3D“ naudotas bėgių liejimas siekiant išsiaiškinti, kaip atrodo perteiktas rėmas, bet pagamintas naudojant vieną spindulį pikselių stulpeliui, o ne pikseliui. Tai vis tiek gali atrodyti labai įspūdingai, kol supratau, kad žaidimas iš pradžių buvo vykdomas 640 x 480 raiška, taigi vienu metu veikė ne daugiau kaip 640 sijų.

Ankstyvoji 2018 m. Vaizdo plokštė, kaip ir „AMD Radeon RX 580“ ar „Nvidia“ „GeForce 1080 Ti“, tikrai atitiko DXR aparatinės įrangos reikalavimus, tačiau net ir turint skaičiavimo galimybių, buvo klaidinga nuomonė, kad jos bus pakankamai galingos naudoti DXR. prasmingai.

Tai šiek tiek pasikeitė 2018 m. Rugpjūtį, kai „Nvidia“ pristatė savo naujausią GPU architektūrą, kodiniu pavadinimu Turingas. Kritinė šios mikroschemos savybė buvo vadinama „RT-Cores“: specialūs loginiai vienetai, siekiant pagreitinti spindulių ir trikampių perėmimą ir apriboti apimties hierarchijos (BVH) kryžminius skaičiavimus. Šie du procesai yra daug laiko reikalaujantys darbai, kai šviesa sąveikauja su trikampiais, sudarančiais įvairius scenos objektus. Atsižvelgiant į tai, kad „RT“ branduoliai yra būdingi Tiuringo procesoriui, prieigą prie jų galima padaryti tik naudojant „Nvidia“ nuosavybės teise priklausančią API.

Pirmasis šią funkciją palaikantis žaidimas yra EA „Battlefield V“ ir Kai mes išbandėme DXR naudojimą, buvome sužavėti pagerėjusiais vandens, stiklo ir metalo atspindžiais žaidime, bet mažiau sužavėti vėlesniais pasirodymo hitais:

Teisybės dėlei reikia pasakyti, kad vėliau pataisymai šiek tiek pagerėjo, tačiau kadrų perteikimo greitis labai sumažėjo (ir tebėra). Iki 2019 m. Atsirado keletas kitų žaidimų, kurie palaiko šią API ir atlieka spindulių sekimą tam tikroms kadro dalims. Mes išbandėme Metro migracija ve „Tomb Raider Shadow“ir rado panašią istoriją - DXR ypač paveiktų kadrų dažnį, kai jis plačiai naudojamas.

Maždaug tuo pačiu metu, UL etalonai - paaiškino jis „3DMark“ DXR funkcijų testas:

Tačiau peržiūrėję žaidimus, kuriuose įgalinta DXR, ir „3DMark“ funkcijų testą, paaiškėjo, kad vienas dalykas yra tikras dėl spindulių atsekimo: 2019 m. Tai vis dar rimtas darbas net grafikos procesoriaus 1000 USD + modeliams. Ar tai reiškia, kad neturime realios alternatyvos rastravimui?

Naujausios vartotojo 3D grafikos technologijos funkcijos dažnai yra labai brangios, o pradinis naujų API funkcijų palaikymas gali būti gana nepastovus arba lėtas (kaip mes randame) Kai išbandėme „Max Payne 3“ „Direct3D“ leidimų serijoje apie 2012 m.) - pastaroji dažniausiai atsiranda dėl to, kad žaidimų kūrėjai bando įtraukti kuo daugiau pažangių funkcijų, kartais turinčių ribotą patirtį.

Tačiau kai viršūnių ir taškų šešėliai, tessellation, HDR atvaizdavimas ir ekrano erdvės aplinkos okliuzija kažkada buvo gana reiklūs, tiko tik aukščiausios klasės GPU, jų naudojimas dabar yra įprastas žaidimuose ir palaikomas įvairiausių grafinių kortelių. Tas pats pasakytina apie spindulių sekimą ir nustatytą laiką, jis tiesiog taps dar vienu detalės nustatymu, kurį pagal numatytuosius nustatymus įgalina dauguma vartotojų.

Keletas uždarančių minčių

Taigi mes priėjome savo antrąjį gilųjį nardymą, kuriame atidžiau pažvelgėme į 3D grafikos pasaulį. Mes pažvelgėme į tai, kaip modelių ir pasaulių kampai perkeliami iš 3D ir paverčiami plokščiu 2D vaizdu. Matėme, kaip reikia atsižvelgti į regėjimo lauko nustatymus ir kokį poveikį jie sukelia. Šių kampų pikseliavimo procesas buvo ištirtas ir mes baigėme trumpai apžvelgdami alternatyvų rastravimo procesą.

Kaip ir anksčiau, negalėjome visko aprėpti ir negalėjome žvilgtelėti į keletą detalių čia ir ten - juk tai ne vadovėlis! Tačiau tikimės, kad pakeliui sužinojote šiek tiek daugiau ir sužavėjote programuotojus bei inžinierius, kurie tikrai įvaldo matematiką ir mokslus, reikalingus tam, kad visa tai atliktų jūsų mėgstamiausiuose 3D pavadinimuose.

Mes mielai atsakome į jūsų klausimus, todėl nedvejodami rašykite savo kelią komentarų skiltyje. Iki kito.

Pagrindinės antraštės kreditas: Vienspalvio spausdinimo rastro abstraktus autorius Aleksei Deep