<html><head>
<meta http-equiv="content-type" content="text/html; charset=windows-1257">
<title>OpenGL pamoka #8
</title>
<link href="global.css" rel="stylesheet" type="text/css">
<link href="print.css" rel="stylesheet" type="text/css" media="print">
<meta name="author" content="Jeff Molofee">
<meta name="description" content="OpenGL Tutorials, Demos, Games and More...">
<meta name="keywords" content="opengl, tutorial, article, demo, game, blend, texturemap, lighting, contest, 3D">
<link rel="stylesheet" type="text/css" href="lesson.asp_files/rgb.css">
</head><body link="#aaccff" bgcolor="black" text="white" vlink="#aaccff">
<table border="0" width="100%"><tbody><tr><td align="center">
<!-- Begin - Site: GameDev.net Zone: NeHe 728x90 -->
<table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td class="tinylogo" height="130" width="326"></td><td class="indexheading" align="center" valign="middle"><font class="text"><font class="theme" size="+3"><b><i>Pamoka #8
</i></b></font></font></td></tr></tbody></table><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td class="tl"></td><td class="tc" width="100%"></td><td class="tr"></td></tr></tbody></table><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td class="l"></td><td class="back3" valign="top" width="100%"><font class="text"><b><u>Paprastas permatomumas
</u></b>
<br><br>
<pre>
Dauguma specialiuju efektu daromi su OpenGL naudoja kaþkoki tai tipa maiðymo/susiliejimo. Susiliejimas yra naudojamas
kombinuojant norima pikseli su jau esanciu ekrane. Kaip spalvos sumaiðomos priklauso nuo spalvu alpha(permatomumo) reikðmiu
ir/arba nuo suliejimo algoritmo. Alpha yra ketvirtasis spalvos komponentas. Anksciau jus turejot naudoti GL_RGB nurodyti
spalvai ið 3 komponentu(RGB). GL_RGBA yra naudojamas nurodyti alpha reikðmei kartu su RGB. Su GL_RGBA tenka naudoti nebe
glColor3f(), o gl_color4f(), nes atitinkamai 3 ir 4 parodo parametru kieki, o RGB(3) + alpha = 4 parametrai.
<br><br>
Dauguma þmoniu galvoja, kad Alpha yra reikðme nurodanti kiek medþiaga yra permatoma. Alpha reikðme lygi 0.0 reiðkia, kad
elementas/medþiaga yra visiðkai permatomi, o 1.0, kad visiðkai matomas.
<br><br>
<b><u>Suliejimo formule
</u></b>
<br><br>
Jeigu jus nelabai bendraujate su matematika ir tik norite suþinoti kaip padaryti permatomuma, praleiskite ðia sekcija.
Jeigu jus norite suprasti kaip suliejimas veikia, ði skiltis yra - Jums.
<br><br>
<i>(Rs Sr + Rd Dr, Gs Sg + Gd Dg, Bs Sb + Bd Db, As Sa + Ad Da)
</i>
<br><br>
OpenGL suskaiciuos maiðymo rezultata dvieju pikseliu, pagal aukðciau apraðyta lygti. Elementai s ir d nurodo pradini
pikseli ir galutini(source ir destination). Komponentai S ir D yra suliejimo faktoriai. Ðios reikðmes nurodo kaip jus
noretumete sulieti pikselius. Daþniausiai naudojama reikðme S komponentui yra (As, As, As, As), o D elementui:
(1, 1, 1, 1) - (As, As, As, As). Istacius ðias lygtis i formule gauname:
<br><br>
<i>(Rs As + Rd (1 - As), Gs As + Gd (1 - As), Bs As + Bd (1 - As), As As + Ad (1 - As))
</i>
<br><br>
Ði lygtis padarys permatomumo stiliaus efektus.
<br><br>
<b><u>Suliejimas naudojant OpenGL
</u></b>
<br><br>
Mes ijungiame suliejima kaip ir bet ka kitka. Tada mes nustatome lygti ir iðjungiame gylio buferio raðyma
pieðiant skaidrius objektus, nes mes vis dar norime, kad objektai uþ permatomu objektu butu matomi.
Tai nera tinkamas budas maiðyti, bet daugumoje paprastu projektu, ðis metodas veikia puikiai.
<b>Rui Martins priduria:
</b> teisingas budas pieðti permatomus poligonus (alfa
<1,0) yra po to kai nupieðtas
visas vaizdas ir tai padaryti reikia atvirkðtine gylio tvarka. Taip yra todel, kad suliejant du poligonus(1 ir 2)
kitokia tvarka, gausime kitoki rezultata, pvz (tarkime, poligonas 1 yra arciausiai stebetojo, teisingas budas
butu nupieðti pirma poligona(2), o tik po to poligona(1). Jeigu jus paþiuresite i tai, kaip tai vyksta realybeje:
visos ðviesos ateinancios ið uþ scenos(uþ ðiu dvieju poligonu, kurie yra permatomi), turi praeiti pro antraji poligona,
o tik tada pro pirmaji, iki kol ji pasiekia stebetojo akis(ðiuo atveju jusu). Jus turetumete suruðiuoti permatomus
poligonus pagal gyli ir tik tada nupieðti juos - po to kai visa scena jau ekrane, su ijungtu gylio buferio. Prieðingu
atveju jus gausite neteisinga rezultata. Suprantu, tai kancia, taciau tai yra teisingas budas sulieti objektus.
<br><br>
Mes naudosime koda ið paskutines pamokos. Pradesime pridedami du naujus kintamuosius paciame kodo virðuje. Að
perraðysiu visa koda, kad viskas butu vienoje vietoje.
</font></td><td class="r"></td></tr></tbody></table><pre>
<p>
#include
<windows.h
>
#include
<stdio.h
> <font class="theme">//Standartine Ivedimo/Iðvedimo biblioteka
</font>
#include
<gl\gl.h
> <font class="theme">//OpenGL32 bibliotekos antraðciu failas
</font>
#include
<gl\glu.h
> <font class="theme">//GLu32 bibliotekos antraðciu failas
</font>
#include
<gl\glaux.h
> <font class="theme">//GLaux bibliotekos antraðciu failas
</font>
HDC hDC=NULL;
<font class="theme">//GDI irenginio kontekstas
</font>
HGLRC hRC=NULL;
<font class="theme">//Nuolatinio generavimo kontekstas
</font>
HWND hWnd=NULL;
<font class="theme">//Laiko lango handle(tai lyg identifikatorius)
</font>
HINSTANCE hInstance;
<font class="theme">//Programos identifikatorius
</font>
bool keys[256];
<font class="theme">//Masyvas naudojamas klaviaturos funkcijos
</font>
bool active=TRUE;
<font class="theme">//Aktyvaus lango bitas. True pagal nutylejima
</font>
bool fullscreen=TRUE;
<font class="theme">//Pilno ekrano reþimas. Taipogi pagal nutylejima
</font>
bool light;
<font class="theme">//Ðviesos. On-Ijungta, kitu atveju iðjungta
</font>
bool blend;
<font class="theme">//NAUJA. Suliejimas, ijungtas arba iðjungtas
</font>
bool lp;
<font class="theme">// L Paspaustas?
</font>
bool fp;
<font class="theme">// F Paspaustas?
</font>
bool bp;
<font class="theme">// B Paspaustas? (NAUJA)
</font>
GLfloat xrot;
<font class="theme">// X Pasukimas
</font>
GLfloat yrot;
<font class="theme">// Y Pasukimas
</font>
GLfloat xspeed;
<font class="theme">// X Pasukimo greitis
</font>
GLfloat yspeed;
<font class="theme">// Y Pasukimo greitis
</font>
GLfloat z=-5.0f;
<font class="theme">//Ekrano gylis
</font>
GLfloat LightAmbient[]= { 0.5f, 0.5f, 0.5f, 1.0f };
<font class="theme">//Aplinkos(supancios) ðviesos reikðmes
</font>
GLfloat LightDiffuse[]= { 1.0f, 1.0f, 1.0f, 1.0f };
<font class="theme">//Atsispindejusios ðviesos reikðmes
</font>
GLfloat LightPosition[]= { 0.0f, 0.0f, 2.0f, 1.0f };
<font class="theme">//Ðviesos ðaltinio pozicija
</font>
GLuint filter;
<font class="theme">//Koki filtra naudosime
</font>
GLuint texture[3];
<font class="theme">//Triju teksturu laikmena
</font>
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
<font class="theme">//WndProc apraðas
</font>
</p>
</pre><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td class="tl"></td><td class="tc" width="100%"></td><td class="tr"></td></tr></tbody></table><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td class="l"></td><td class="back3" valign="top" width="100%"><font class="text">
Ssiraskite LoadGLTextures(). Suraskite eilute kurioje raðoma:
<p> if (TextureImage[0]=LoadBMP("Data/Crate.bmp"))
</p>Pakeiskite ja
eilute þemiau. Mes naudojame daþyto stiklo tipo tekstura ðioje pamokoje.
</font></td><td class="r"></td></tr></tbody></table><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td class="bl"></td><td class="bc" width="100%"></td><td class="br"></td></tr></tbody></table><p> if (TextureImage[0]=LoadBMP("Data/glass.bmp")) //Uþkrauti stiklo bitmap'a(paveiksliuka)
</p>
</pre><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td class="tl"></td><td class="tc" width="100%"></td><td class="tr"></td></tr></tbody></table><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td class="l"></td><td class="back3" valign="top" width="100%"><font class="text">
Pridekite sekancias dvi eilutes kur nors InitGL() funkcijos kode. Ka ði eilute daro, tai
nustato objekto pieðimo ðviesuma iki maksimumo su 50% permatomumu. Tai reiðkia, kad
kai suliejimas yra ijungtas, objektas bus pusiau matomas. Antra eilute nustato suliejimo
tipa kuri naudosime.
<br><br>
<b>Rui Martins prideda:
</b> Nuline alpha reikðme reiðkia, kad objektas yra visiðkai permatomas(nematomas),
o 1.0 reikðme, reiðkia, kad objektas visiðkai matomas.
</font></td><td class="r"></td></tr></tbody></table><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td class="bl"></td><td class="bc" width="100%"></td><td class="br"></td></tr></tbody></table><pre><p> glColor4f(1.0f,1.0f,1.0f,0.5f); //Pilnas ðviesumas, pusiau permatomas
</p>
<p> glBlendFunc(GL_SRC_ALPHA,GL_ONE); //Suliejimo funkcija priklausanti nuo ðaltinio alpha reikðmes
</p>
</pre><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td class="tl"></td><td class="tc" width="100%"></td><td class="tr"></td></tr></tbody></table><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td class="l"></td><td class="back3" valign="top" width="100%"><font class="text">
Paþiurekite i sekanti kodo gabala, jis yra paciame pamokos gale, 7oje pamokoje.
</font></td><td class="r"></td></tr></tbody></table><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td class="bl"></td><td class="bc" width="100%"></td><td class="br"></td></tr></tbody></table><pre><p> if (keys[VK_LEFT]) //Ar kairioji strelyte(left arrow) nuspausta?
</p>
<p>
{
yspeed-=0.01f;
<font class="theme">//Jei taip, sumaþiname yspeed
</font>
}
</p>
</pre><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td class="tl"></td><td class="tc" width="100%"></td><td class="tr"></td></tr></tbody></table><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td class="l"></td><td class="back3" valign="top" width="100%"><font class="text">
Dabar, po aukðciau esanciu kodu, mes norime prideti sekancias eilutes. Þemiau esancios eilutes þiuri ar B klaviðas
buvo paspaustas. Jeigu buvo, kompiuteris patikrina ar suliejimas yra ijungtas ar iðjungtas. Jei ijungtas, iðjungia, jei
buo iðjungtas, ijungia.
</font></td><td class="r"></td></tr></tbody></table><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td class="bl"></td><td class="bc" width="100%"></td><td class="br"></td></tr></tbody></table><pre><p> if (keys['B']
&& !bp) //Ar B klaviðas nuspaustas ir bp yra FALSE?
</p>
<p style="margin: 0;"> {
bp=TRUE;
<font class="theme">//Jei taip tai bp yra TRUE
</font>
blend = !blend;
<font class="theme">//Ijungiam/Iðjungiam
</font>
if(blend)
<font class="theme">//Ar blend yra TRUE?
</font>
{
glEnable(GL_BLEND);
<font class="theme">//Ijungiame liejima
</font>
glDisable(GL_DEPTH_TEST);
<font class="theme">//Iðjungiame gylio testavima
</font>
}
else
<font class="theme">//Kitu atveju
</font>
{
glDisable(GL_BLEND);
<font class="theme">//Iðjungiame suliejima
</font>
glEnable(GL_DEPTH_TEST);
<font class="theme">//Ijungiame gylio testavima
</font>
}
}
if (!keys['B'])
<font class="theme">//Ar B klaviðas buvo atleistas(atspaustas)
</font>
{
bp=FALSE;
<font class="theme">//Jei taip, tai bp yra FALSE
</font>
}
</p>
</pre><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td class="tl"></td><td class="tc" width="100%"></td><td class="tr"></td></tr></tbody></table><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td class="l"></td><td class="back3" valign="top" width="100%"><font class="text">
Bet kaip mes galime nurodyti spalva jeigu naudojame teksturas? Paprasta, moduliaciniame teksturos reþime, kiekvienas
pikselis kuris yra teksturoje yra padaugintas ið dabartines spalvos. Taigi, jei spalva, kuri yra pieðiama yra (0.5, 0.6, 0.4),
mes padauginame ja ið spalvos ir gauname (0.5, 0.6, 0.4, 0.2).
<br><br>
Viskas! Suliejimas yra gana paprastas su OpenGL.
Galite parsisiusti Dev C++ koda, paspaude
<a href="kodai\devcpp\lesson08\Lesson8.cpp">Cia
</a>
</body></html>