Programujeme grafický engine XXIII.

opengl_logo.jpg V tom­to člán­ku sa bu­de­me za­obe­rať naj­dô­le­ži­tej­ší­mi zlep­še­nia­mi ak­tuál­nej ver­zie na­mi prip­ra­vo­va­nej ap­li­ká­cie En­gi­ne v2.0. Za­me­ria­me sa na dve ob­las­ti – úp­ra­vu al­go­rit­mu de­tek­cie ko­lí­zií (fy­zi­kál­ne­ho mo­de­lu po­hy­bu ava­ta­ra) a im­ple­men­tá­ciu sha­de­rov.

Fy­zi­kál­ny mo­del po­hy­bu ava­ta­ra
Ap­li­ká­cia En­gi­ne v2.0 im­ple­men­tu­je po­dstat­ne zlep­še­ný fy­zi­kál­ny mo­del po­hy­bu ava­ta­ra v 3D scé­ne. K zá­klad­ným dru­hom po­hy­bov bo­lo dopl­ne­né čup­nu­tie (crouch) a schop­nosť ava­ta­ra vy­stu­po­vať po scho­doch (stairs). Uve­de­né dva po­hy­by spre­vád­za po­tre­ba ko­rek­tne up­ra­viť po­sta­ve­nie sa ava­ta­ra v prí­pa­de, že ču­pí. V ču­pia­cej po­lo­he sa mô­že ava­tar dos­tať na ta­ké mies­ta, kde ne­mô­že vstať bez to­ho, aby ko­li­do­val so stro­pom, resp. ob­jek­tmi nad se­bou.

engine obr1.bmp
Obr. 1 3D scé­na ob­sa­hu­jú­ca scho­dy, na kto­ré mô­že ava­tar vy­stú­piť

Dva zá­klad­né pa­ra­met­re po­uži­té­ho al­go­rit­mu de­tek­cie ko­lí­zií sú údaj o šír­ke ava­ta­ra (ava­tarWidth) a vý­ške je­ho očí (ava­ta­rEye). Na zá­kla­de prís­luš­ných po­rov­na­ní uve­de­ných hod­nôt so vzdia­le­nos­ťa­mi ava­ta­ra od ob­jek­tov scé­ny (tro­ju­hol­ní­kov) je ava­ta­ro­vi umož­ne­né/za­ká­za­né vstú­piť na kon­krét­ne mies­to. Hod­no­ta ava­tarWidth zá­ro­veň ur­ču­je max. vý­šku, o kto­rú je ava­tar schop­ný vy­stú­piť bez to­ho, aby mu­sel ská­kať. Pri príp­ra­ve scé­ny, kon­krét­ne pri vy­tvá­ra­ní ob­jek­tov pred­sta­vu­jú­cich scho­dy, tre­ba mys­lieť na max. vý­šku, kto­rú do­ká­že ava­tar pre­ko­nať. Všet­ky vy­ššie pre­káž­ky mu­sí ava­tar pre­ko­nať sko­kom.

Re­le­van­tné úp­ra­vy ap­li­ká­cie sú ob­siah­nu­té v mo­du­le ava­tar.cpp (ava­tar.h). Dô­le­ži­tá je fun­kcia set­movxyz(), kto­rá sa vy­ko­ná po stla­če­ní/uvoľ­ne­ní tla­či­diel, a fun­kcia up­da­te() (vy­ko­ná­va­ná pe­rio­dic­ky), reali­zu­jú­ca kon­krét­ne dru­hy po­hy­bov. Nás­led­ne sme up­ra­vi­li kód fun­kcie de­tec­tColli­sion(), kto­rá, ako vie­me, im­ple­men­tu­je tes­ty slú­žia­ce na de­tek­ciu ko­lí­zie ava­ta­ra s ob­jek­tmi scé­ny.

Sha­de­ry
Ak­tuál­na ver­zia ap­li­ká­cie ob­sa­hu­je po­dpo­ru tzv. sha­de­rov – prog­ra­mov ov­plyv­ňu­jú­cich vý­sled­nú far­bu kon­krét­ne­ho pixe­la ob­ra­zov­ky. O sha­de­roch sme sa už zmie­ni­li, ale kon­krét­nej im­ple­men­tá­cii sme sa za­tiaľ ne­ve­no­va­li. V ap­li­ká­cii En­gi­ne v2.0 je scé­na ren­de­ro­va­ná dvo­ma spô­sob­mi:
1. zá­klad­ný ren­de­ring za po­mo­ci jed­nej textú­ro­va­cej jed­not­ky a bez po­uži­tia sha­de­rov,
2. kom­plex­ný ren­de­ring s vy­uži­tím šty­roch textú­ro­va­cích jed­no­tiek a níz­koú­rov­ňo­vých/vy­šších sha­der prog­ra­mov.

Zá­klad­né­mu ren­de­rin­gu sa ne­mu­sí­me zvlášť ve­no­vať. Je­di­ná textú­ro­va­cia jed­not­ka slú­ži na jed­no­duc­hé na­ne­se­nie textúr a scé­na je za­sla­ná na vy­kres­le­nie. Pri roz­ší­re­nom ren­de­rin­gu je vy­uži­tých hneď nie­koľ­ko roz­ší­re­ní OpenGL (exten­sions): mul­ti­textu­ring, ver­tex a frag­ment sha­der prog­ram. V prí­pa­de po­uži­tia GLSL (OpenGL Sha­ding Lan­gua­ge) sha­de­rov je ne­vyh­nut­né vlas­tniť har­dvér po­dpo­ru­jú­ci roz­ší­re­nie tzv. tie­ňo­va­cích ja­zy­kov (sha­ding_lan­gua­ge).

engine obr2.bmp
Obr. 2 Scé­na ren­de­ro­va­ná po­mo­cou sha­de­rov

Opis prog­ra­mo­vé­ho kó­du po­uži­tých sha­de­rov pre­sa­hu­je rá­mec toh­to člán­ku. Té­ma sha­de­rov je na­toľ­ko roz­siah­la, že by sa na nej dal po­sta­viť ce­lý no­vý se­riál (uva­žu­jem do bu­dúc­nos­ti). V na­šej ap­li­ká­cii sme za­tiaľ vy­uži­li iba ne­patr­nú časť z mož­nos­tí, kto­ré sha­de­ry po­nú­ka­jú:
1. na­ne­se­nie zá­klad­nej textú­ry v kom­bi­ná­cii s textú­rou sve­tel­nej ma­py (ba­se + lig­htmap),
2. zme­nu op­tic­kých vlas­tnos­tí pixelov (frag­men­tov) v zá­vis­los­ti od po­lo­hy sve­tel­ných zdro­jov s vy­uži­tím nor­má­lo­vých máp (ba­se + lig­htmap + nor­mal­map),
3. úp­ra­vu sve­tel­ných vlas­tnos­tí tej čas­ti scé­ny, kto­rá je os­vet­le­ná vir­tuál­nym svie­tid­lom (ba­se + lig­htmap + nor­mal­map + flas­hlight).

Jed­not­li­vé čas­ti ren­de­ro­va­cie­ho al­go­rit­mu sú sú­čas­ťou fun­kcie tris_draw() mo­du­lu fron­tend.cpp (fron­tend.h). Sú­čas­ná po­do­ba al­go­rit­mu je po­mer­ne „kostr­ba­tá“, ale v bu­dúc­nos­ti ju op­ti­ma­li­zu­je­me. Uro­bí­me tak naj­mä z dô­vo­du po­uži­tia vý­kon­nej­ších úda­jo­vých štruk­túr ur­če­ných na us­po­ria­da­nie ob­jek­tov scé­ny (ok­tá­no­vé a BSP stro­my).

Na­bu­dú­ce...
V bu­dú­cej čas­ti se­riá­lu sa za­me­ria­me na jed­nu z naj­zák­lad­nej­ších fun­kcií gra­fic­ké­ho (her­né­ho) en­gi­nu, a sí­ce inter­ak­ciu ava­ta­ra so scé­nou. Ava­ta­ro­vi dá­me do rúk zbraň a umož­ní­me mu ju po­užiť.

Ďal­šie čas­ti >>

Zdroj: Infoware 1/2010



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