Zanir » OpenGL

Archív z ‘OpenGL’ Kategórie

Program 31 – Motion blur s použitím p-buffra

08.08.2004

031_motion_blur_with_pbufferJedná sa o ase loader rozšírený o triedu, ktorá vytvorý špecialný pixel buffer, do ktorého sa dá kresliť, a zároveň sa dá použiť ako textúra. Do tejto textúry sa vykresľuje scéna. Motion blur sa vytvára tak, že túto textúru pričítavam k frame bufferu:

frame(t+1) = alpha*textúra + (1-alpha)*frame(t)
Frame buffer sa nemaže. Frame buffer neobsahuje z-buffer. Alpha je prednastavené na 0.18. Veľkosť textúry je 1024 * 1024, textúra obsahuje z-buffer.

Vyžaduje: WGL_ARB_pbuffer, WGL_ARB_pixel_format a WGL_ARB_render_texture.

zdrojové texty a program – 640kB

Program 30 – Časticový systém

23.07.2004

030_Particle_system

zdrojové texty a program – 100kB

Program 29 – Veľa bodových svetiel

10.02.2004

029_Many_Point_LightsProgram využíva vertex program pre vykreslenie objektu osvetleného 17 bodovými svetlami. Vertex program sa vykonáva pre každý vrchol modelu. Vstupom do vertex program je pre každý vrchol 1 až 16 4-zložkových vektorov float čísel (Vertex Attributes). Ďalším vstupom sú konštantné registre (Program Local Parameters, Program Environment Parameters), tieto sú zadané pred kreslením a sú spoločné pre viacero prímitív. Shader môže využívať vnutorné registre (11 registrov) pre uloženie dočasných medzivýsledkov. Výstupom shadera sú registre pre poziciu result.position, pre farby result.color, pre hmlu, pre velkost bodu a pre texturové koordinácie. Inštrukcie pracujú s vektormi a sú takéto: +,-,*, 1/x, 1/sqrt(x), dot3, dot4, exp, log, min, max, mov. Sú tam ešte nejaké inštrukcie na porovnanie (SGE, SLT) a nejaké špeciálne inštrukcie (ABS, ARL, DST, DPH, FLR, FRC, LIT, MAD, POW, SWZ, XPD).

Program vyžaduje rozšírenie GL_ARB_vertex_program

zdrojové texty a program – 250kB

Program 28 – Voda

30.10.2003

028_waterVoda je vytvárana spojením lomu a odrazu pomocou Fresnelovho vzorca. Pre odraz plati zakon odrazu, ktorý hovorý, že uhol dopadu sa rovná uhlu odrazu. Pre lom platí Shellov zakon, ktorý hovorý: Pomer sínusu uhla dopadu k sínusu uhla lomu je rovný pomeru rýchlosti šírenia vĺn v prostredí 1 a v prostredí 2. Matematicky sin(a1)/sin(a2)=v1/v2=n2/n1. Platí ak v1>v2 potom a1>a2, a ak v1 Pre zobrazovanie lomu a odrazu používam sphere environment mapping, alebo cube environment mapping.

Odporučané rozšírenia: GL_ARB_multitexture, GL_ARB_texture_env_combine a GL_ARB_texture_cube_map.

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

Program 27 – ASE Loader

12.09.2003

027_ASE_loader_0Súbory ase vytvara 3ds max ako ASCII scene export. Je to textový formát. Všeobecne majú textové formáty oproti binárnym tú výhodu, že ich dáta sú uložené textovým popisným spôsobom a preto nie je problém importovať potrebné časti so súboru. Textové súbory sú zase väčšie a pomalšie sa načítavajú. Načítanie ase súboru som urobil, preto lebo 3ds max exportuje veľa rôznych dát, 027_ASE_loader_1pričom načítavať ich s 3ds súboru je obtiažne, lebo poriadny popis neexistuje. Ďalšia nevýhoda 3ds je, že neobsahuje všetky informácie ( napr. chybajú normálové vektory).
3ds max obsahuje modul pre výpočet globálneho modelu osvetlenia – radiosity. To umožňuje docieliť veľmi realistické osvetlenie modelov. Čítať zvyšok príspevku »

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