Zanir

Program 26 – Stencil Shadow

25.08.2003

026_Stencil_ShadowProgram vytvára tieň za pomoci stencil buffra. Stencil buffer uchováva pre každý pixel hodnotu v rozmedzí 0 až 2^N-1, kde N je počet bitov stencil buffra. Hodnota sa mení podľa nastaveného operátora. Operátor sa nastavuje pre každú z možností: stencil test neprejde, stencil test prejde a zároveň z test neprejde, stencil aj z test prejdú. Operátory sú: bez zmeny, nulovanie, nahradenie predvolenou hodnotou, zvýšenie, zníženie a bitová negácia. Stencil test môže byť jeden z týchto: nikdy, <, =<, >, =>, ==, !=, vždy. Tieňové teleso (shadow volume) je silueta telesa (z pohľadu od svetla) premietnutá na opačnú stranu ako je svetlo. Z-pass algoritmus mení stencil v prípade, že z-test prejde. Tieň sa vytvára tak, že pre privrátené strany tieňového telesa sa stecil hodnota zvýši a pre odvrátené stany sa zníži. Tieň je tam kde stencil hodnota je > ako 0. Z-pass algoritmus pracuje spravne ak je kamera vonku z tieňa. Ja používam algoritmus z-fail, ktorý je popísaný v dokumente Practical and Robust Shadow Volumes (.pdf) (2153 KB) a na rozdiel od z-pass pracuje spravne aj keď je kamera v tieni.

Program vyžaduje hardwerovo akcelerovaný 8 bitový stencil buffer.

zdrojové texty a program – 240kB bez jpeglibm.lib

Program 25 – Environment mapped bump mapping (EMBM)

31.07.2003

025_environment_mapped_bump_mappingEMBM je mapovanie okolia na hrboľatý zrkadlový povrch. Predstavuje pokročilejšiu metódu enviromental mapping-u, ktorá sa na rozdiel od cube alebo sphere mappingu neprevádza po vrcholoch, ale prevádza sa po pixeloch. Využíva sa čítanie z textúry závislé na inej textúre. Presnejšie k textúrovacim koordináciam zakladnej textúry sa pripočítavá hodnota z druhej textúry. Základná textúra je v tomto prípade sphere map textúra. Druhá textúra predstavuje vypočítané posuvy textúrových koordinácií sphere map textúry. Táto textúra sa vypočítava na základe výškovej mapy zrkadlového povrchu (bump map).

Program vyžaduje rozšírenia:
GL_ARB_multitexture, GL_ARB_texture_env_combine a GL_ATI_envmap_bumpmap.
Program ide na kartach ATI Radeon 7000 a lepších.

zdrojové texty a program – 320kB bez jpeglibm.lib

Program 24 – DOT3 bump mapping

24.07.2003

024_DOT3_bump_mapping024_DOT3_bump_mapping_3dsDot Product 3 Bump Mapping je osvetlenie povrchu po pixeloch. Využíva sa skalárny súčin ( dot product ) pričom sa prevádza po pixeloch. Štandardné osvetlenie v OpenGL sa prevádza po vrcholoch. V každom vrchole sa spočíta farba a tá sa tieňuje na polygóny. Zjednodušený výpočet farby osvetlenia je

farba = ambient + (N.L)xDifuznaFarba + (N.H)^SpecExp x SpecularFarba

Kde ambient je okolité osvetlenie
(N.L)xDifuznaFarba je difúzna zložka osvetlenia. N je normálový vektor, L je vektor k svetlu. Pre difúzne osvetlenie platí, že nezávisý od smeru pohľadu pozorovateľa
(N.H)^SpecExp x SpecularFarba tvorý zrkadlovú zložku osvetlenia. Vektor H = normalizovaný[ (vektor od vrchola ku očiam) + (vektor od vrchola k svetlu) ]

Členy N.L a N.H môžeme vypočítať po pixeloch. Vektor N je reprezentovaný textúrou a vektory L a H spočítame v každom vrchole a lineráne interpolujeme. Výsledkom je osvetlenie po pixeloch.

Program vyžaduje rozšírenia: GL_ARB_multitexture, GL_ARB_texture_env_combine, GL_ARB_texture_env_dot3.

zdrojové texty a program – 800kB bez jpeglibm.lib

Program 23 – Dynamický cubemapping

10.07.2003

023_Cube_MappingCube mapping predstavuje vlastne environment mapping (mapovanie okolia na zrkadlové predmety) pričom ako zdroj sa používa cuba map textúra. Základné dve spôsoby sú sphere mapping a cube mapping. Sphere mapping som už ukazoval v programe 19. Sphere mapping vychádza iba z jednej textúry, ktorá nepokrýva cele okolie v rovnakej kvalite a tak na určitom mieste je zrkadlový povrch úpne nesprávny a vyzerá zle. Kedže cube mapping používa naraz 6 štvorcovývh obrázkov (textúr) tvoriacich kocku celé okolie je s vyjadrené dostatočnou presnosťou a nevznikajú nepresnosti také ako pri sphere mappingu. Ďalšou výhodou cube mappingu je, že cube map textúra sa dá jednoducho vyrenderovať. Stačí pre každý smer vykresliť okolie pri nastavenej perspektíve 90 stupňov a skopírovať na príslušnú časť cube mapy. Môj program predstavuje dynamický cube mapping kde lietadlo oblietava zrkadlový predmet. Cube mapping nie štandardnou súčasťou OpenGL, ale je prístupný ako rozšírenie a to GL_ARB(EXT)_texture_cube_map.

V tomto programe používam aj knižnicu jpeglibm.lib, čo je vlastne mierne rozšírená knižnica jpeg.lib. Knižnicu som si vytvoril pre lepšiu prehľadnosť projektov.

zdrojovy text pre knižnicu jpeglibm.lib – 207kB
zdrojové texty a program – 460kB

Program 22 – Terén

08.09.2002

022_terrain022_terrain_volum_fogTerén je dôležitá časť viacerých typov hier. Vytvorenie tohto programu mi trvalo dosť dlho. Použil som oktanový strom (OcTree).
OcTree sa používa na delenie priestoru tak, aby sa nemuselo vykresľovať všetko (celý svet) ale iba to čo je v pohľade. Oktánový strom predstavuje rozdelenie priestoru a zároveň trojuholníkov v svete na kocky. Hlavný vrchol stromu predstavuje kocku, ktorá obsahuje všetky trojuholníky sveta. Tato kocka sa delí na 8 kociek (v každom smere na polovicu). Od toho sa strom volá oktánový, lebo jeden vrchol-otec môže obsahovať 8 synov. Podľa toho či v tej, ktorej kocke sa nachádzajú trojuholníky sa vrchol-syn vytvorí, alebo nie. Vrcholy-kocky sa rekurentne delia dokedy sa nespní podmienka. Podmienka na ukončenie delenia môže byť jedna z týchto: počet trojuholníkov v kocke je menej ako nejaké maximum, úroveň delenia je rovná hraničnej úrovni, počet všetkých vrcholov je väčší ako maximálny počet.

Vykreslenie sveta cez OcTree sa realizuje s pomocou Frustum Culling, čo je vlastne zistenie či je niečo v pohľade. Najprv sa zistí či kocka-otec aspoň čiastočne je v pohľade. Ak je v pohľade a vrchol je delený tak, sa funkcia rekurentne volá pre všetkých synov. Ak vrchol nie je delený tak sa vykreslia trojuholníky ktore táto kocka obsahuje.
Viac nájdete na www.gametutorials.com.

Ďalej som vytvoril prechody medzi rôznými textúrami. Osvetlenie som urobil pomocou glColor.
Do programu som pridal volumetrickú hmlu.

zdrojové texty (bez jpeg.lib) a program – 300kB

Program 21 – Kolízie

07.08.2002

014_dxf_loaderBez detekcie kolízie sa nezaobíde žiadna hra. Ja som použil detekciu kolízie zo stránok www.gametutorials.com kde je táto oblasť dobre vysvetlená. Program využíva detekciu kolízie medzi polygonom (štvorcom) a guľou. V prípade, že nastane kolízia, pozícia kamery sa posunie tak, aby guľa bola mimo polygónu.

zdrojové texty (bez jpeg.lib) a program – 230kB

Program 20 – Projekcia textúry

03.08.2002

020_projected_texturesProjekcia textúry na objekty v scéne je zaujímavý efekt. Týmto spôsobom sa dá docieliť zaujímavé osvetlenie scény, napríklad použitím svetla prechádzajúceho cez farebná sklá.

zdrojové texty (bez jpeg.lib) a program – 245kB

Program 19 – Sphere mapping

26.07.2002

019_sphere_mappingSphere mapping je spôsob implementácie environment mapping-u. Environment mapping je mapovanie okolia na zrkadlové predmety, ktoré sa nachádzaju v ňom. Základné dve spôsoby sú sphere mapping a cube mapping.
Základom sphere mapping-u je spheremap textúra, ktorá zobrazuje zrkadlovú guľu sfotenú rovnobežnými lúčmy. Textúra obsahuje informáciu o farbe prostredia pre každý smer.
Cube mapping používa naraz 6 – textúr pre každú stenu kocky. V OpenGL je podporovaný ako rozšírenie GL_EXT(NV)_texture_cube_map.

zdrojové texty (bez jpeg.lib) a program – 342kB

Program 18 – Radial blur

17.07.2002

018_radial_blurRadial blur – radiálne rozmazanie objektu. Robí sa to jednoducho, vykreslíme objekt do textúry a textúru potom vykreslíme viackrát rôzne rostiahnutú na celú obrazovku.
V prípade že budeme rozťahovať iba v smere horizontálnom, alebo vertikálnom dostaneme rozmazanie v danom smere.

zdrojové texty a program – 77kB

Program 17 – Motion blur

09.07.2002

017_motion_blurMotion blur – rozmazanie rýchleho pohybu. Na rozdiel od kamery kde sa rýchlo pohybujúce objekty rozmazavajú je každý obrázok vykreslený v počítačovej grafike (OpenGL) ostrý, čo spôsobuje pocit nespojitého pohybu aj pri vyššom fps ako majú kamery. Rozmazanie pohybu sa v OpenGL dá docieliť použitím akumulačného buffera, ale ten nie je hardwarovo podporovaný na večšine grafických kariet. Ako náhrada sa dá použiť kreslenie do textúry.

zdrojové texty (bez jpeg.lib) a program – 80kB