11.07.2015 Views

Prenos vízií do reality bolí. - Vitajte na stránkach www.einsty ...

Prenos vízií do reality bolí. - Vitajte na stránkach www.einsty ...

Prenos vízií do reality bolí. - Vitajte na stránkach www.einsty ...

SHOW MORE
SHOW LESS
  • No tags were found...

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

P R O G R A M U J E M EGrafika cez OpenGL13. èas: Motion blurring, height mapping 1.však rov<strong>na</strong>ký kmeò „poèítaè“). Posledná vo¾ba nesie názovSearch titles only, a ak ju aktivujete, budú sa preh¾adávaiba názvy jednotlivých nápovedných tém.Technológia fulltextového preh¾adávania tém je v nápovedi HTML,bohuia¾, o nieèo menej vyspelá ako jej predchodkyòa v systémeWinHelp 4.0. WinHelp 4.0 poskytoval monos okamitého pre−h¾adávania tém u po zadaní nieko¾kých prvých písmen k¾úèovéhoslova. V praxi teda staèilo, aby pouívate¾ zadal iba pár zaèiatoè−ných písmen k¾úèového slova a systém WinHelp 4.0 ihneï posky−tol zoz<strong>na</strong>m vyhovujúcich tém. V nápovedi HTML je potrebné zapí−sa celú po<strong>do</strong>bu k¾úèového slova a následne klepnú <strong>na</strong> tlaèidloList Topics, prípadne stlaèi kláves Enter.ŠPECIFIKÁCIA ŠTANDARDNE ZOBRAZOVANEJZÁLOKY NAVIGAÈNÉHO PANELA NÁPOVEDEHTML. Ak budete chcie, aby bola po spustení systémunápovede štandardne zobrazená iná záloka ako záloka sobsahovou štruktúrou nápovede (Contents), môete takurobi <strong>na</strong> záloke Navigation Pane v dialógovom okneWin<strong>do</strong>w Types. Tu v rámèeku Tabs klepnite <strong>na</strong> šípku otvá−racieho zoz<strong>na</strong>mu Default tab a vyberte typ záloky, ktorása bude v <strong>na</strong>vigaènom paneli štandardne zobrazova ihneïpo otvorení súboru s nápoveïou (obr. 6).Priame urèenie štandardne zobrazovanej záloky <strong>na</strong>vigaèného pa−nela nápovede by ste mali uskutoèòova iba v odôvodnených prí−pa<strong>do</strong>ch. Väèši<strong>na</strong> pouívate¾ov je toti zvyknutá <strong>na</strong> to, e sa im poštarte nápovede ihneï zobrazí stromová štruktúra obsahu nápo−vedného systému. Ak títo pouívatelia uvidia zobrazenú inú zá−loku, môu sa <strong>do</strong>sta <strong>do</strong> problémov.ÏALŠIE MONOSTI ZÁLOKY NAVIGATION PA−NE. Ponuka záloky Navigation Pane dialógového ok<strong>na</strong>Win<strong>do</strong>w Types je skutoène bohatá. Najskôr sa zameriame<strong>na</strong> sekciu Properties, ktorá ukrýva tri vo¾by:1. Open with <strong>na</strong>vigation pane closedZapnutie vo¾by spôsobí deaktiváciu zobrazenia <strong>na</strong>vigaè−ného panela nápovede HTML po otvorení súboru s ná−poveïou HTML.2. Automatically show/hide <strong>na</strong>vigation paneAk zaèiarknete túto vo¾bu, <strong>na</strong>vigaèný panel nápovedeHTML sa bude automaticky zobrazova, resp. skrýva v zá−vislosti od toho, èi primárne okno nápovede disponujezameraním (focusom), alebo nie.3. Auto SyncO vo¾be Auto Sync sme si u nieèo povedali. Jej zapnu−tie vraví kompilátoru, aby <strong>do</strong> kódu komprimovaného sú−boru s nápoveïou HTML pridal inštrukcie <strong>na</strong> automatickúsynchronizáciu jednotlivých nápovedných tém s obsaho−vou stromovou štruktúrou.Ak budete potrebova explicitne urèi šírku <strong>na</strong>vigaè−ného panela nápovede HTML, môete poui textové poles titulkom Navigation pane width. Implicitne toto poleneobsahuje nijakú konkrétnu hodnotu, pretoe šírka <strong>na</strong>vi−gaèného panela je urèovaná dy<strong>na</strong>micky.Ján HanákObr. 5Názorná ilustráciaaplikácie logickýchoperátorov<strong>na</strong> vyh¾adávaniecie¾ovej skupinynápovedných témObr. 6Výber štandardnezobrazovanej zálokyv <strong>na</strong>vigaènom panelinápovedeAko ten èas letí... Mono si spomí<strong>na</strong>te, ako ste pred ro−kom otvorili èerstvé vydanie PC REVUE a v sekcii Progra−mujeme ste zbadali nový seriál o programovaní grafikycez OpenGL. Jeden rok je za <strong>na</strong>mi a seriál o tomto fasci−nujúcom grafickom rozhraní pokraèuje. <strong>Vitajte</strong> pri ïalšejèasti Grafiky cez OpenGL, priatelia. Nastal teda èas <strong>na</strong>malé bilancovanie. Za rok ste zvládli inicializáciu OpenGL,potom sme prešli <strong>na</strong> trojuholníèky, kocky, <strong>na</strong>sle<strong>do</strong>vali tex−túry, blending, display listy, fonty, jpeg textúry, masking,multitexturing, rendering <strong>do</strong> textúry atï. Z<strong>na</strong>mená to, esme zvládli základy OpenGL, s ktorými sa môeme pusti<strong>do</strong> zloitejších vecí, ako je <strong>na</strong>príklad aj téma tejto èasti:motion blurring a height mapping.MOTION BLURRING. Tak ako vdy aj tentoraz zaè−neme tému jej definíciou. Èo teda je motion blurring?Iste ste si všimli, e objekty v OpenGL sú také ostré, akobyneskutoèné. Pri ich pohybe ani nehovorím. Èo tak trochuich pri tom pohybe rozmaza, aby vyzerali krajšie? Sa−mozrejme, e sa to dá a je to pomerne ¾ahké. Keby to bo−lo aké, nepísal by som tu o tom. V èom spoèíva princíp?Ide o to, e vyrenderujeme objekt, ktorý chceme rozma−za, a skopírujeme ho <strong>do</strong> textúry. Zapneme blending askopírovanú textúru <strong>na</strong>nesieme <strong>na</strong> celú obrazovku. Po−tom túto obrazovku skopírujeme <strong>do</strong> textúry a textúru <strong>na</strong>−nesieme tým istým spôsobom <strong>na</strong> obrazovku. Tak sa námvytvorí efekt, ktorý však má dva menšie problémy. Prvýmz nich je, e stopa za objektom nám nebude pomaly miz−nú, ale ostane tam <strong>na</strong>vdy. Toto odstránime ¾ahko tak,e zníime hodnotu jasu textúry (alfa kanál) o 10 % astopa nám pomaly zmizne. Druhý problém závisí od hard−vérového vybavenia poèítaèa. Toti keby sme ten istý prog−ram spustili <strong>na</strong> nejakom slabšom i silnejšom poèítaèi,výsle<strong>do</strong>k by bol iný. Preèo? Na slabšom poèítaèi <strong>do</strong>chá−dza k zniovaniu FPS (frames per second – snímky zasekundu) a tým sa obrazovka kopíruje <strong>do</strong> textúry menejráz ako <strong>na</strong> tom silnejšom. Aj tento problém sa však dáodstráni. Jednoducho si vypoèítame, kedy máme a kedynemáme motion blur vykres¾ova. To si ukáeme neskôr.Ešte spomeniem, e námet <strong>na</strong> tento èlánok a zdrojovýkód som èerpal zo stránky <strong>www</strong>.gametutorials.com. Vy−chádzame zo základného zdrojového kódu, <strong>do</strong>plnenéhoo monos textúrovania a renderingu <strong>do</strong> textúry (pozriPCR è. 6/2003). Vytvoríme si dve funkcie, ktoré nám budúmeni perspektívny mód a ortografický mód. Len spome−niem, e perspektívny mód je, polopatisticky povedané, 3Da ortografický mód je 2D, èie nám nepodáva informáciu,aký je objekt vysoký, hlboký a široký v skutoènom svete.Všetky funkcie budú uloené v súbore s kresliacou funkciou.void Orto(void){Ako prvé si zvolíme projekènú maticu, ktorú si uloíme<strong>do</strong> zásobníka pre prípad, e chceme ortografický mód vyp−nú.glMatrixMode(GL_PROJECTION);glPushMatrix();Teraz túto maticu „resetujeme“ <strong>na</strong> jednotkovú maticu.glLoadIdentity();Zavoláme funkciu glOrtho, ktorá <strong>na</strong>staví ortografickýmód <strong>na</strong> <strong>na</strong>mi poa<strong>do</strong>vanú ve¾kos.glOrtho( 0, 0, 800, 600, 0, 1 ); //¾avý horný a pravý <strong>do</strong>lný rohAby sme mohli v ortografickom móde kresli, musímesa prepnú <strong>do</strong> MODELVIEW matice, ktorú tie resetujeme.glMatrixMode(GL_MODELVIEW);glLoadIdentity();}My však nechceme zosta v ortografickom móde <strong>na</strong>ve−ky, niekedy je potrebné vráti sa <strong>na</strong> perspektívny mód. Nato slúi funkcia Perspectiv.void Perspectiv(void){Cesta spä je o nieèo kratšia. Vyuijeme to, e sme sipri prepí<strong>na</strong>ní sa <strong>do</strong> ortografického módu uloili projekè−nú maticu <strong>do</strong> zásobníka. Teraz ju staèí vybra, <strong>na</strong>stavimodelview maticu a sme zase v 3D.glMatrixMode(GL_PROJECTION);glPopMatrix();glMatrxMode(GL_MODELVIEW);}Vytvoríme si funkciu, ktorá vracia hodnou TRUE, keïmáme vyrenderova motion blur. Jej jediným paramet−rom je èíslo, ktoré udáva, ko¾kokrát ho máme za sekunduvyrenderova. Dajme tomu, e ju <strong>na</strong>zveme Casovac.bool Casovac(mb_za_sekundu){Aby sme mohli vypoèíta, èi môeme vyrenderova mo−tion blur, musíme si definova pomocné premenné <strong>na</strong>vypoèítanie èasu. Konkrétne to budú premenné posled−ny_cas, uplynuly_cas a aktualny_cas.static float posledny_cas=0.0f;float uplynuly_cas=0.0f;float aktualny_cas=GetTickCount() * 0.001f; //aktualny casv sekundachVypoèítame si u uplynulý èas, a to tak, e od aktuál−neho èasu odpoèítame posledný èas, keï sme motion blurvykres¾ovali.uplynuly_cas=aktualny_cas – posledny_cas;Teraz musíme otestova, èi u uplynulo <strong>do</strong>s èasu <strong>na</strong>to, aby sme opä vykreslili motion blur. Bude to vtedy, akuplynulý èas bude väèší ako prevrátená hodnota premen−nej mb_za_sekundu, ktorá udáva poèet vykreslení motionblur za sekundu.if(uplynuly_cas > (1.0f/mb_za_sekundu)){Ak sa tak <strong>na</strong>ozaj stalo, <strong>do</strong> premennej posledny_cas siuloíme aktuálny èas a funkcia vráti TRUE, èo z<strong>na</strong>èí, e jeèas <strong>na</strong> vykreslenie motion blur.posledny_cas=aktualny_cas;return TRUE;}No ak sa tak nestalo, musíme ešte poèka a funkcia vrá−ti FALSE.return FALSE;}Aby sme si ušetrili èas, vytvoríme si funkciu, ktorá bu−de renderova motion blur. Síce ju voláme len dvakrát,ale aj tak je to menšia úspora èasu.void motion_blur(void){Aby sme mali taký výsle<strong>do</strong>k, aký chceme, musíme siuloi maticu, aby nemala konflikty s aktuálnou maticou.Potom musíme vypnú håbkový test a zapneme blending,prièom <strong>na</strong>stavíme aj blen<strong>do</strong>vaciu rovnicu.glPushMatrix();glDisable(GL_DEPTH_TEST);glBlendFunc(GL_SRC_ALPHA,GL_ONE); //alpha blendingglE<strong>na</strong>ble(GL_BLEND);Bindujeme textúru, <strong>do</strong> ktorej sme skopírovali obsahobrazovky (pozri PCR è. 6/2003). Ako som povedal, musí−me jej zníi jas, aby sa nám stopa strácala.glBindTexture(GL_TEXTURE_2D, texture[0]);glColor4f(1.0f,1.0f,1.0f,0.9f);Prípravné úkony máme za sebou, u sa len musímeprepnú <strong>do</strong> ortografického módu a otextúrova touto112 PC REVUE 7/2003

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!