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 ...

einsty.hostujem.sk
from einsty.hostujem.sk More from this publisher
11.07.2015 Views

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 naspä do perspektívneho mó−du, zapneme håbkový test, vypneme blending a obnovíme maticu, ktorú sme si na 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();glEnable(GL_DEPTH_TEST);glDisable(GL_BLEND);glPopMatrix();glEnd();}Výborne, aj toto máme za sebou. Hor' sa do 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é nastavenia môeme preskoèiPomocou funkcie Casovac zistíme, èi máme vyrenderovanú kocku skopírova do textú−ry a vyrenderova aj motion blur.if(Casovac(60)){Najprv zmeníme ve¾kos viewportu na štvorec so stranou ve¾kosti 512 (aby sa námvmestil do textúry). Potom zavoláme funkciu motion_blur, ktorá vyrenderuje motion blur.Napokon vykreslíme kocku, bindujeme textúru, do ktorej sa má obrazovka skopírova, apomocou glCopyTexImage2D ju skopírujeme. Nakoniec vyèistíme color buffer aj depthbuffer a nastavíme viewport na pôvodnú hodnotu.glViewPort(0,0,512,512);motion_blur();/*SEM POJDE KOCKA*/glBindTexture(GL_TEXTURE_2D,texture[0]); //textúra, do ktorej sa skopíruje obrazovkaglCopyTexImage2D(GL_TEXTURE_2D,0,GL_RGB,0,0,512,512,0); //skopíruj obrazovku do 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 na 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 nakreslí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, dostanete iný výsledok. 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 (napríklad ak je hlavný hrdina mierne pripitý, ulen musíte vyrieši, ako objekty zobrazova dvojmo ☺).HEIGHT MAPPING. U máte dos prechádzok po miestnostiach, budovách a podob−ných uzavretých priestoroch? Chceli by ste prevetra OpenGL aj na èerstvom vzduchu nie−kde v prírode? Presne tak. Našou druhou témou bude height mapping alebo, povedanénašou ¾ubozvuènou slovenèinou, terén. Táto téma zahàòa naèítanie terénu zo súboru,jeho vykreslenie a následne aj pohyb po òom. Teraz si ukáeme najjednoduchší spôsob,ako zobrazi terén v jednej farbe, a nabudú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 na èiernej oblohe, prièomplatí, e èím belší pixel, tým je to miesto vyššie. Ako však vytvori takúto mapu? Existujena 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 na 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 do nami pouívaného formátu raw. Ale dos bolo teórie, poïme na prax.Ako vdy aj tentoraz vychádzame zo základného zdrojového kódu s kamerou na 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 na naèí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 na mape, smerník napole 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 na mape. Takto získané èísla uloíme do 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 naèítava hodnoty z dvojrozmerného po¾a, ale bolo by obané doò 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 narába s viacerými mapami súèasne, pravdae, aj nároky na pamä budú väèšie(napríklad jedna mapa s rozmermi 1024*1024 pixelov zaberá v pamäti 1 MB, èo je dos).Na zaèiatok si definujeme zopár premenných na uloenie aktuálnej pozície na mape asúradníc vrcholu.void RenderMap(BYTE VyskovaMapa[]){int mx,my=0; //pozícia na 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é navýpoètový výkon a aj zobrazovanie by bolo nároèné. Preto budeme naèítava kadý 16.bod mapy. Výzor sa ve¾mi nezmení a poèítaèu to urýchli prácu.for(mx=0;mx

P R O G R A M U J E M EFILE *subor=NULL;subor=fopen(cesta,"rb");if(subor==NULL){PostQuitMessage(0);}Ak sme zadali správnu cestu a súbor sa nám podarilo otvori, môeme dáta naèíta dopo¾a, ktoré sme funkcii zadali. Ak sme hotoví, súbor môeme zavrie.fread(mapa,1,velkost,subor);fclose(subor);}Súbor teren.cpp teraz môeme uloi a zavrie. Do súboru init.cpp si pridáme definíciufunkcie LoadRAW, pretoe ju linker z externého súboru nerozpozná. Takisto si definuje−me pole typu byte s rozmermi 1024 × 1024 bajtov, spolu teda 1 MB.BYTE mapa[1024*1024];void LoadRAW(LPSTR cesta, int velkost, BYTE* mapa);Do funkcie InitGL si pridáme volanie funkcie LoadRaw, ktorou naèítame údaje o mapedo po¾a.LoadRAW(„dat/mapa.raw“,1024*1024,mapa);Ešte treba zmeni posledný parameter volania funkcie gluPerspective z ResizeGLSceneaspoò na hodnotu 3000.0f, pretoe mapa je ve¾ká a pri pôvodnom nastavení by sme junevideli celú. Ak ste to zmenili, presuòte sa do funkcie s kresliacou funkciou, kde si defi−nujte pole mapa ako externú premennú a pridajte aj definíciu funkcie RenderMap. Potomstaèí zavola z kresliacej funkcie:RenderMap(mapa);A je to hotové. Po skompilovaní by sa vám mal objavi poh¾ad na prekrásnu krajinu, aak máte v projekte aj kameru, môete sa po nej aj poprechádza. No nie je to nádhera?ZÁVER. Touto èasou sme opä pokroèili o krok do tajov OpenGL. Ak máte nejaké pri−pomienky, návrhy alebo vám nieèo nejde, napíšte mi, teším sa na vaše e−maily (ale aknemusíte, tak zbytoène nepíšte ☺). Nabudúce si preberieme textúrovanie vyrenderovanejkrajiny, a ak zvýši priestor, aj detekciu kolízie medzi kamerou a terénom. Take máte sana èo teši. Prajem pekný zvyšok júla.Lukáš StaòaDelphi v praxi / 28. èas: Otázky a odpovede II.Témy, ktoré som si naplánoval ako obsah týchto èastí, som trošku posunul, a to z jedi−ného dôvodu. Pokladám za potrebné uvies isté rutiny, ktoré sa priam pýtali na svetlo sve−ta práve prostredníctvom vás. Verím, e sa mi podarilo odpoveda všetkým, ktorí sa namòa obrátili s prosbou o pomoc v programovaní. Z týchto prosieb som vybral tie, ktorésom aj ja musel h¾ada vo svojom „programátorskom svete“ a ktoré sa vám pridajú priprogramovaní akejko¾vek aplikácie. Nebudú ma síce najelementárnejší charakter progra−mu, ale myslím, e zamútite hlavu nie jednému programátorovi, ktorý uvidí isté novátor−ské riešenia vo vašom programe.MONO VLOI CUDZIU APLIKÁCIU DO NAŠEJ? Odpoveï na túto pomernejednoducho znejúcu otázku som po dlhom pátraní našiel. Jedinou praktickou monosouje nastavi formulár ako rodièovské okno. Druhý krok pozostával z následného presunutiaexternej aplikácie funkciou MoveWindow do rodièovského formulára, nastavenia jehopozície a rozmerov. Posledný riadok je len nastavenie prekrytia, teda priority okna. Naotvorenie externého programu sme pouili príkaz WinExec, kde prvým parametrom jecesta k programu a druhým spôsob otvorenia. Aplikácie, ktoré tvoria jadro systému, res−pektíve sú umiestnené v koreni operaèného systému Windows alebo v jeho systéme,môeme vola priamo bez uvedenia celej cesty k súboru (v príklade uvedený „notepad“ –poznámkový blok).procedure TForm1.FormCreate(Sender: TObject);var wnd:HWND;beginWinExec('notepad',SW_SHOW);wnd:=FindWindow('notepad',nil);if Wnd0 then beginWindows.SetParent(Wnd, Handle);MoveWindow(Wnd, 0, 0, ClientWidth, ClientHeight, false);SetForegroundWindow(Wnd);end;end;EXISTUJE DIALÓG NA VYH¼ADANIE ADRESÁRA? V záloke dialógov, ia¾,takýto komponent nenájdeme. Ale pomocou direktívy kninice FileCtrl môeme vyvolaštandardný dialóg bez akéhoko¾vek vytvárania vlastných rutín a formulárov. Radšej si šet−rime sily a sústreïujme ich na zloitejšie algoritmy. Pre úplnú funkènos dopíšte do klau−Obr. 1zuly uses kninicu FileCtrl (bez nej by externé vyvolanie nebolo moné). Funkcia Select−Directory zavolá dialóg, ktorého ukonèením, resp. potvrdením sa do premennej path uloícesta k vybranému adresáru. Na skúšku som v príklade pouil príkaz ShowMessage, ktorýna demonštraèné úèely postaèuje. Prostredníctvom neho uvidíme vybranú cestu.procedure TForm1.Button1Click(Sender: TObject);var path:string;beginif FileCtrl.SelectDirectory(path, [sdAllowCreate, sdPerformCreate,sdPrompt], 0) then ShowMessage(path);end;AKO ZMENI TITULOK DIALÓGU? Tentoraz hovoríme o štandardných dialógo−vých oknách, ktoré nám ponúka záloka Dialogs. Niektoré dialógy majú staticky defino−vaný titulok okna, prièom jeho zmena podlieha zaslaniu správy SendMessage komponen−tu. V našom prípade zmeníme titulok na komponente PrintDialog. Aj keï z praktickéhoh¾adiska takáto monos neplní nijakú dôleitú úlohu, je dobré si rozšíri monosti Send−Message. Parameter WM_SETTEXT je, samozrejme, zo skupiny Windows Message.procedure TForm1.PrintDialog1Show(Sender: TObject);beginSendMessage(PrintDialog1.Handle,WM_SETTEXT, 0, LPARAM(PChar('nový text akéhoko¾vekdialógu')));end;NEŠTANDARDNÝ DIALÓG „OTVORI ÈÍM“. Keïe sme zaèali dialógmi, môe−me pri nich ešte chví¾ku zosta. Pri pouívaní operaèného systému Windows ste sa urèitestretli s príponami súborov. Tie majú rozliènú štruktúru, preto na prácu s nimi vyuívamerozlièné programy. Na u¾ahèenie práce s produktmi programov sa zaèala vyuíva inicia−lizácia príslušného programu práve pod¾a koncovky. To zabezpeèuje operaèný systém.V prípade, ak k poadovanej koncovke nie je priradený nijaký program, operaèný systémnám ponúkne interný dialóg „otvori èím“. V òom vyberieme príslušný program, ktorýmchceme súbor otvori alebo priradi mu jeden program, v ktorom sa bude otvára vdy.Tento dialóg je súèasou dynamickej kninice Shell32.dll patriacej k systému. Aj keï cezrozhranie Delphi môeme vola dynamické kninice priamo, nebudeme si komplikovaivot zisovaním názvov funkcií a premenných, ktoré poskytuje spomínaná kninica.Pouijeme radšej internú kninicu ShellAPI, ktorá je súèasou Delphi. Tú treba dopísa doklauzuly uses. Vytvorili sme si funkciu OpenAs, ktorej vstupným parametrom je cesta k sú−boru. Výstup má skôr kontrolný charakter, preto nám postaèuje typ boolean. Všetko ostatnéje prácou ShellAPI s premennou TShellExecuteInfo, ktoré vyvolá spomínaný dialóg v súvis−losti so súborom, ktorého cestu sme zadali ako vstup...Function OpenAs(Filen: String):Boolean;var Info:TShellExecuteInfo;Param:String;beginParam:=Format('Shell32.dll,OpenAs_RunDLL %s',[Filen]);ZeroMemory(@Info, SizeOf(Info));info.cbSize:=SizeOf(Info);info.lpFile:='Rundll32.exe';info.lpVerb:='Open';info.nShow:=SW_SHOWNORMAL;info.Wnd:=GetDesktopWindow;info.lpParameters:=PChar(Param);OpenAs:=ShellExecuteEx(@Info);end;POLOKA V MENU UMIESTNENÁ VPRAVO. Komponent TMainMenu nachádza−júci sa v záloke Standard je asi to, èo pouíva kadý programátor snaiaci sa naprogra−mova preh¾adný program. Samozrejme, e pouívanie poloiek menu je ve¾mi jednodu−ché, pokia¾ nechcete umiestni poloku do pravého rohu vášho programu. Takúto otázkusom dostal od èitate¾a, ktorý prive¾mi experimentuje a napadlo mu nieèo, èo som dopo−114 PC REVUE 7/2003

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!