Programujeme grafický engine XX.

opengl_logo.jpg V tej­to čas­ti se­riá­lu opí­še­me kon­krét­ne čas­ti al­go­rit­mu po­uži­té­ho na vy­tvo­re­nie tie­ňov v kom­plexnej scé­ne. Bu­de­me sa ve­no­vať sve­tel­ným vý­poč­tom, spo­loč­ným sve­tel­ným ma­pám (ďa­lej len ma­py), vzá­jom­nej po­lo­he ob­jek­tov scé­ny a ďal­ším sú­vi­sia­cim otáz­kam.

Us­po­ria­da­nie ob­jek­tov scé­ny

V pô­vod­nej jed­no­duc­hej vzo­ro­vej ap­li­ká­cii sme si uká­za­li, ako mož­no jed­no­duc­hým spô­so­bom vy­po­čí­tať a zob­ra­ziť tie­ne. V sú­čas­nej, po­dstat­ne kom­plexnej­šej scé­ne sme sí­ce rov­na­ko de­fi­no­va­li ro­vin­né ploc­hy (tro­ju­hol­ní­ky), koc­ky a sve­tel­né zdro­je, ale ich po­čet a umies­tne­nie je po­dstat­ne od­liš­né. Hlav­ným prob­lé­mom sa sta­la vzá­jom­ná po­lo­ha tro­ju­hol­ní­kov, z kto­rých je zlo­že­ná navr­hnu­tá scé­na.

Sve­tel­ný lúč pri svo­jej ces­te zo sve­tel­né­ho zdro­ja do mies­ta do­pa­du (lu­me­la) prec­hád­za 3D pries­to­rom, v kto­rom sa mô­že nac­hád­zať ľu­bo­voľ­ný po­čet tro­ju­hol­ní­kov. Na sta­no­ve­nie sve­tel­ných vlas­tnos­tí kon­krét­ne­ho lu­me­la tak mu­sí­me vy­ko­nať test ko­lí­zie sve­tel­né­ho lú­ča so všet­ký­mi tro­ju­hol­ník­mi, kto­ré sa nac­hád­za­jú med­zi po­lo­hou da­né­ho lu­me­la a po­lo­hou sve­tel­né­ho zdro­ja (na obr. 1 sú zob­ra­ze­né čer­ve­nou far­bou). Tro­ju­hol­ní­ky nac­hád­za­jú­ce sa za sve­tel­ným zdro­jom, resp. za po­lo­hou lu­me­la, ne­mô­žu ov­plyv­niť test ko­lí­zie, a te­da sa ne­bu­dú brať do úva­hy (zob­ra­ze­né mod­rou far­bou).

engine1.jpg
Obr. 1 Test ko­lí­zie sve­tel­né­ho lú­ča s tro­ju­hol­ník­mi de­fi­no­va­ný­mi v scé­ne

Spo­loč­né sve­tel­né ma­py
Jed­ným z naj­väč­ších prob­lé­mov im­ple­men­tá­cie máp v kom­plexných scé­nach je tvor­ba tzv. spo­loč­ných sve­tel­ných máp (sha­red lig­htmaps). Je to je­den zo spô­so­bov, ako vy­rie­šiť prob­lém veľ­ké­ho po­čtu tro­ju­hol­ní­kov. Z dô­vo­du šet­re­nia pa­mä­ťo­vé­ho pries­to­ru ne­mô­že­me kaž­dé­mu jed­not­li­vé­mu tro­ju­hol­ní­ku pri­de­liť sa­mos­tat­nú ma­pu. Pre­to sa sku­pi­ne tro­ju­hol­ní­kov pri­de­lí spo­loč­ná ma­pa, v rám­ci kto­rej bu­dú kon­krét­ne čas­ti (seg­men­ty) pat­ria­ce kon­krét­nym tro­ju­hol­ní­kom ozna­če­né správ­nym nas­ta­ve­ním textú­ro­va­cích sú­rad­níc.

Na eš­te väč­šie ze­fek­tív­ne­nie tvor­by máp mož­no spá­jať dvo­ji­ce tro­ju­hol­ní­kov do štvo­ru­hol­ní­kov, pre kto­ré bu­dú po­uži­té rov­na­ké seg­men­ty. Z dô­vo­du po­uži­tia spo­loč­ných máp tre­ba vy­ko­nať prís­luš­né úp­ra­vy ich seg­men­tov tak, aby pri zob­ra­zo­va­ní nev­zni­ka­li ne­že­la­né ob­ra­zy.

Opí­sa­ný prin­cíp, sa­moz­rej­me, nie je dog­ma a prob­lém efek­tív­nej tvor­by a po­uží­va­nia máp mož­no rie­šiť via­ce­rý­mi spô­sob­mi. My sa však bu­de­me dr­žať uve­de­ných fak­tov a po­kú­si­me sa prá­ve na­mi pri­ja­té zá­ve­ry im­ple­men­to­vať v prak­tic­kej ap­li­ká­cii.

engine2.jpg
Obr. 2 Seg­men­tá­cia spo­loč­nej sve­tel­nej ma­py

Prak­tic­ká im­ple­men­tá­cia
Zvo­le­ný prís­tup k rie­še­niu prob­lé­mov spo­je­ných s po­uži­tím spo­loč­ných máp sme prak­tic­ky reali­zo­va­li v rám­ci mo­du­lu Bac­kend. Na za­čiat­ku al­go­rit­mu vy­tvo­rí­me pr­vú spo­loč­nú ma­pu, kto­rú po­stup­ne napĺňa­me údaj­mi zís­ka­ný­mi po vy­ko­na­ní tes­tov ko­lí­zie sve­tel­ných lú­čov vy­sla­ných zo sve­tel­ných zdro­jov s tro­ju­hol­ník­mi. Kaž­dý seg­ment ma­py pri­tom roz­de­lí­me na dve po­lo­vi­ce, kto­ré napl­ní­me údaj­mi pat­ria­ci­mi jed­né­mu z dvoch spo­je­ných tro­ju­hol­ní­kov. Spo­ji­tosť tro­ju­hol­ní­kov ur­ču­je­me krát­kym al­go­rit­mom, kto­rý po­rov­ná­va to­tož­nosť dvoch su­se­dia­cich vr­cho­lov tro­ju­hol­ní­kov a sú­čas­ne po­rov­ná­va ich nor­má­ly. Tro­ju­hol­ní­ky, kto­ré ma­jú dva spo­loč­né vr­cho­ly a zá­ro­veň ma­jú to­tož­né nor­má­ly, sa po­va­žu­jú za spo­je­né. V ta­kom­to prí­pa­de sa úda­je pat­ria­ce tým­to dvom tro­ju­hol­ní­kom ulo­žia do rov­na­ké­ho štvo­ru­hol­ní­ko­vé­ho seg­men­tu spo­loč­nej ma­py. V opač­nom prí­pa­de zos­ta­ne po­lo­vi­ca seg­men­tu ne­vyu­ži­tá.

Na kon­ci al­go­rit­mu tre­ba vy­rie­šiť prob­lém so spo­ji­tos­ťou os­vet­le­ných lu­me­lov med­zi dvo­ma su­se­dia­ci­mi tro­ju­hol­ník­mi. Nej­de však o rov­na­kú spo­ji­tosť, o akej sme ho­vo­ri­li v pre­doš­lom od­se­ku. Kaž­dý tro­ju­hol­ník scé­ny mô­že mať na ľu­bo­voľ­nej svo­jej stra­ne su­se­dia­ci tro­ju­hol­ník. Prá­ve ply­nu­lý prec­hod os­vet­le­nia ta­kýc­hto lu­me­lov riešia krát­ke dopl­ňo­va­cie blo­ky, kto­rý­mi sa kon­čí al­go­rit­mus vý­poč­tu od­tie­ňa bo­dov máp.

Na­bu­dú­ce...
V bu­dú­cej čas­ti dopl­ní­me do­po­siaľ zís­ka­né in­for­má­cie o po­drob­nej­ší opis ďal­ších čas­tí kó­du. Ku kaž­dej čas­ti se­riá­lu bu­de­me prik­la­dať no­vú ver­ziu vzo­ro­vej ap­li­ká­cie.

Ďal­šie čas­ti >>

Zdroj: Infoware 10/2009



Ohodnoťte článok:
   
 

24 hodín

týždeň

mesiac

Najnovšie články

Prog­ra­mu­je­me gra­fic­ký en­gi­ne XXXVII.
V tejto a takisto v nasledujúcej časti seriálu budeme riešiť synchronizáciu streľby s pohybom postavy. Pôvodne sme sa tejto oblasti venovali oddelene od blokov súvisiacich so zobrazením postavy. čítať »
 
Prog­ra­mu­je­me gra­fic­ký en­gi­ne XXXVI.
V tejto časti seriálu sa budeme venovať tomu, ako možno do grafických (herných) enginov implementovať objekty reprezentujúce rebríky (ladders). čítať »
 
Prog­ra­mu­je­me gra­fic­ký en­gi­ne XXXV.
V tejto časti seriálu podrobnejšie rozoberieme jednotlivé časti programového kódu súvisiace s implementáciou streľby. čítať »
 
Prog­ra­mu­je­me gra­fic­ký en­gi­ne XXXIV.
V tejto časti seriálu vám v stručnosti predstavíme tzv. systémy častíc (particle systems). Kvalitne navrhnutými systémami častíc dokážeme veľmi rýchlo a elegantne zvýšiť dynamiku grafických aplikácií. čítať »
 
Prog­ra­mu­je­me gra­fic­ký en­gi­ne XXXIII.
V predchádzajúcej časti seriálu sme dokončili kapitolu, v ktorej sme sa venovali simulácii fyziky. čítať »
 
Prog­ra­mu­je­me gra­fic­ký en­gi­ne XXXII.
Touto časťou seriálu ukončíme tému implementácie fyzikálnych zákonov v rámci grafických enginov. Všetky vedomosti, ktorými v tomto okamihu disponujeme čítať »
 
Prog­ra­mu­je­me gra­fic­ký en­gi­ne XXXI.
Týmto článkom sa pomaly dostávame k záveru celku, v ktorom sme sa zaoberali simuláciou fyziky. Zostáva nám opísať princíp detekcie kolízií a uviesť spôsob reakcie simulačného systému čítať »
 
Prog­ra­mu­je­me gra­fic­ký en­gi­ne XXX.
V tomto pokračovaní seriálu si doplníme teoretické vedomosti potrebné na implementáciu fyzikálnych zákonov v grafických a herných enginoch. čítať »
 
 
 
  Zdieľaj cez Facebook Zdieľaj cez Google+ Zdieľaj cez Twitter Zdieľaj cez LinkedIn Správy z RSS Správy na smartfóne Správy cez newsletter