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 Etextúrou celú obrazovku. Tu nám staèí poui dvojparametrový variant funkcie glVertex,pretoe sme v ortografickom móde. Nakoniec sa prepneme <strong>na</strong>spä <strong>do</strong> perspektívneho mó−du, zapneme håbkový test, vypneme blending a obnovíme maticu, ktorú sme si <strong>na</strong> zaèiat−ku uloili.Orto();glBegin(GL_QUADS);glTexCoord2f(0.0f,1.0f); glVertex2f(0.0f,0.0f);glTexCoord2f(0.0f,0.0f); glVertex2f(0.0f,800.0f);glTexCoord2f(1.0f,0.0f); glVertex2f(800.0f,600.0f);glTexCoord2f(1.0f,1.0f); glVertex2f(800.0f,0.0f);glEnd();Perspectiv();glE<strong>na</strong>ble(GL_DEPTH_TEST);glDisable(GL_BLEND);glPopMatrix();glEnd();}Výborne, aj toto máme za sebou. Hor' sa <strong>do</strong> kresliacej funkcie! Dajme tomu, e chce−me ma rozmazaný rotaèný pohyb kocky. U viete, ako objekty rotova. Takisto viete vy−kresli kocku, take tam, kam má ís kocka, pôjde komentár /*SEM POJDE KOCKA*/.void DrawGLScene(void){... //poèiatoèné <strong>na</strong>stavenia môeme preskoèiPomocou funkcie Casovac zistíme, èi máme vyrenderovanú kocku skopírova <strong>do</strong> textú−ry a vyrenderova aj motion blur.if(Casovac(60)){Najprv zmeníme ve¾kos viewportu <strong>na</strong> štvorec so stranou ve¾kosti 512 (aby sa námvmestil <strong>do</strong> textúry). Potom zavoláme funkciu motion_blur, ktorá vyrenderuje motion blur.Napokon vykreslíme kocku, bindujeme textúru, <strong>do</strong> ktorej sa má obrazovka skopírova, apomocou glCopyTexImage2D ju skopírujeme. Nakoniec vyèistíme color buffer aj depthbuffer a <strong>na</strong>stavíme viewport <strong>na</strong> pôvodnú hodnotu.glViewPort(0,0,512,512);motion_blur();/*SEM POJDE KOCKA*/glBindTexture(GL_TEXTURE_2D,texture[0]); //textúra, <strong>do</strong> ktorej sa skopíruje obrazovkaglCopyTexImage2D(GL_TEXTURE_2D,0,GL_RGB,0,0,512,512,0); //skopíruj obrazovku <strong>do</strong> tex−túry – PCR è. 6/2003glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);glViewPort(0,0,800,600);}Ale ak ešte nemáme vykresli motion blur, lebo <strong>na</strong> to nie je èas, staèí nám vykresli nor−málnu kocku, ktorá je u v skopírovanej textúre. Èie opä zavoláme funkciu motion_blura <strong>na</strong>kreslíme kocku.motion_blur();/*SEM POJDE KOCKA*/} //koniec DrawGLSceneA je to! Teraz staèí spusti program a uvidíte rotujúcu kocku, ktorá sa otáèa a za òouje „šmuha“. Skúste sa pohra s èíslami, <strong>do</strong>stanete iný výsle<strong>do</strong>k. Tento efekt sa pouívamálokedy, ale je východiskom pre radial blur, o ktorom si niekedy povieme. Len spome−niem, e radial blur je priestorové rozmazanie, èie objekt vyzerá, akoby iaril. Ale ajmotion blur nájde svoje uplatnenie v hre (<strong>na</strong>príklad ak je hlavný hrdi<strong>na</strong> mierne pripitý, ulen musíte vyrieši, ako objekty zobrazova dvojmo ☺).HEIGHT MAPPING. U máte <strong>do</strong>s prechádzok po miestnostiach, bu<strong>do</strong>vách a po<strong>do</strong>b−ných uzavretých priestoroch? Chceli by ste prevetra OpenGL aj <strong>na</strong> èerstvom vzduchu nie−kde v prírode? Presne tak. Našou druhou témou bude height mapping alebo, povedané<strong>na</strong>šou ¾ubozvuènou slovenèinou, terén. Táto téma zahàòa <strong>na</strong>èítanie terénu zo súboru,jeho vykreslenie a následne aj pohyb po òom. Teraz si ukáeme <strong>na</strong>jjednoduchší spôsob,ako zobrazi terén v jednej farbe, a <strong>na</strong>budúce si povieme nieèo o textúrovaní terénu.Terén bude uloený v súbore typu raw, èo nie je niè iné ako samotné dáta v binárnomformáte. Mapa v grafickom prehliadaèi vyzerá ako biele mraky <strong>na</strong> èiernej oblohe, prièomplatí, e èím belší pixel, tým je to miesto vyššie. Ako však vytvori takúto mapu? Existuje<strong>na</strong> to program, ktorý som mal, ale musel som formátova hard disk a u neviem, skadesom ho stiahol. Ak si však spomeniem, dám vám to ihneï vedie. Tento program je šíre−ný aj so zdrojovými kódmi a ponúka hneï nieko¾ko algoritmov <strong>na</strong> vytvorenie terénu.Problém je len v tom, e výškovú mapu ukladá vo formáte tga, ale nie je problém ho sko−pírova <strong>do</strong> <strong>na</strong>mi pouívaného formátu raw. Ale <strong>do</strong>s bolo teórie, poïme <strong>na</strong> prax.Ako vdy aj tentoraz vychádzame zo základného zdrojového kódu s kamerou <strong>na</strong> pre−sun po teréne a svetlom. Textúrovanie zatia¾ nepotrebujeme. Do projektu pridajte novýsúbor a pomenujte ho hoci teren.cpp. Tento súbor bude obsahova funkcie <strong>na</strong> <strong>na</strong>èítaniea vykreslenie terénu. V programe budeme pracova s mapou ve¾kosti 1024 × 1024 pixe−lov. Prvou funkciou bude funkcia, ktorej zadáme súradnice bodu <strong>na</strong> mape, smerník <strong>na</strong>pole mapy a tá vráti jeho výšku.#include #incldue #include #include #include int Vyska(BYTE *mapa, int X, int Y){Aby sme vylúèili monos, e zadáme súradnice mimo mapy, urobíme malú fintu. Èís−lami, ktoré sme zadali, podelíme èíslo 1024, èo je ve¾kos mapy. Nepodelíme ich však nor−málnym delením, ale delením typu modul (zaujímavé slovo). Toto delenie vracia zvyšokpo celoèíselnom delení, a tak aj keby sme zadali hodnoty správne, vrátená výška by zod−povedala výške <strong>na</strong> mape. Takto získané èísla uloíme <strong>do</strong> premenných mapax a mapay.int mapax=X%1024;int mapay=Y%1024;Takisto sa musíme uisti, èi pole, z ktorého máme èíta údaje, existuje. Ak nie, funkciuukonèíme návratovou hodnotou 0.if(!mapa) return 0;Keïe pole mapa je jednorozmerné, musíme nájs správne miesto v pamäti. Bolo by¾ahšie ako údaje <strong>na</strong>èítava hodnoty z dvojrozmerného po¾a, ale bolo by obané <strong>do</strong>ò hod−noty zapisova zo súboru.return mapa[mapax+(y*1024)];}Druhou funkciou v tomto súbore bude vyrenderovanie mapy. Funkcia bude ma názovRenderMap a bude ma jeden parameter, a to pole, z ktorého bude èíta údaje. Taktomôeme <strong>na</strong>rába s viacerými mapami súèasne, pravdae, aj nároky <strong>na</strong> pamä budú väèšie(<strong>na</strong>príklad jed<strong>na</strong> mapa s rozmermi 1024*1024 pixelov zaberá v pamäti 1 MB, èo je <strong>do</strong>s).Na zaèiatok si definujeme zopár premenných <strong>na</strong> uloenie aktuálnej pozície <strong>na</strong> mape asúradníc vrcholu.void RenderMap(BYTE VyskovaMapa[]){int mx,my=0; //pozícia <strong>na</strong> mapeint x,y,z; //súradnice vrcholuAj tu otestujeme, èi existuje pole s mapou, a ak áno, môeme zaèa vykres¾ova mapupo štvorcoch.if(!VyskovaMapa) return;glBegin(GL_QUADS);Cez dva vnorené cykly for prejdeme postupne celú mapu. Lene bolo by to nároèné <strong>na</strong>výpoètový výkon a aj zobrazovanie by bolo nároèné. Preto budeme <strong>na</strong>èítava kadý 16.bod mapy. Výzor sa ve¾mi nezmení a poèítaèu to urýchli prácu.for(mx=0;mx

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

Saved successfully!

Ooh no, something went wrong!