Tato lekce rozÜi°uje pou₧itφm mlhy lekci 7. NauΦφte se pou₧φvat t°φ r∙zn²ch filtr∙, m∞nit barvu a nastavit oblast p∙sobenφ mlhy (v hloubce). Velmi jednoduch² a "efektnφ" efekt.
Na zaΦßtek programu, za vÜechna #include, p°idßme deklarace nov²ch prom∞nn²ch. "gp" pro zjiÜt∞nφ stisku klßvesy G, ve "filter" najdeme Φφslo 0 a₧ 2, specifikujφcφ prßv∞ pou₧φvan² texturov² filtr. V poli "fogMode[]" uklßdßme t°i r∙znΘ typy mlhy. "fogfilter" urΦuje prßv∞ pou₧φvanou mlhu. Ve "fogColor" je ulo₧ena Üedß barva.
bool gp;// G stisknuto?
GLuint filter;// UrΦuje texturov² filtr
GLuint fogMode[]= { GL_EXP, GL_EXP2, GL_LINEAR };// T°i typy mlhy
GLuint fogfilter= 0;// Kterß mlha se pou₧φvß
GLfloat fogColor[4]= {0.5f, 0.5f, 0.5f, 1.0f};// Barva mlhy
P°esuneme se do funkce InitGL(). glClearColor(r,g,b,a) jsme v₧dy pou₧φvali pro nastavenφ ΦernΘho pozadφ. Tentokrßt ud∞lßme malou zm∞nu - pou₧ijeme ÜedΘ pozadφ (barvu mlhy), proto₧e vypadß lΘpe.
// Funkce InitGL()
glClearColor(0.5f,0.5f,0.5f,1.0f);// èedß barva pozadφ (stejnß, jako mß mlha)
P°φkaz glFogi(GL_FOG_MODE, fogMode[fogfilter]) vybere typ filtru. Pro nßs bude zatφm nejjednoduÜÜφ vÜechny mo₧nosti vlo₧it do pole a pak je volßnφm pou₧φt. Co tedy znamenajφ: GL_EXP - zßkladnφ renderovanß mlha, kterß zahalφ celou obrazovku; neposkytuje zrovna perfektnφ v²sledek, ale odvßdφ sluÜnou prßci na starÜφch poΦφtaΦφch. GL_EXP2 - dalÜφ v²vojov² krok GL_EXP; op∞t zaml₧φ cel² monitor, ale tentokrßt do v∞tÜφ hloubky. GL_LINEAR - nejlepÜφ renderovacφ m≤d; objekty se mnohem lΘpe ztrßcejφ a vyno°ujφ
glFogi(GL_FOG_MODE, fogMode[fogfilter]);// M≤d mlhy
glFogfv(GL_FOG_COLOR, fogColor);// Barva mlhy
glFogf(GL_FOG_DENSITY, 0.35f);// Hustota mlhy
O kvalitu mlhy se starat nebudeme, nicmΘn∞ lze takΘ pou₧φt GL_NICEST nebo GL_FASTEST. Nebudu je dßle rozebφrat - nßzvy mluvφ sami za sebe.
glHint(GL_FOG_HINT, GL_DONT_CARE);// Kvalita mlhy
glFogf(GL_FOG_START, 1.0f);// ZaΦßtek mlhy - v hloubce (osa z)
glFogf(GL_FOG_END, 5.0f);// Konec mlhy - v hloubce (osa z)
glEnable(GL_FOG);// Zapne mlhu
OÜet°φme stisk klßvesy 'G', kterou m∙₧eme p°i b∞hu cyklovat mezi r∙zn²mi m≤dy mlhy.
// Funkce WinMain()
if(keys['G'] && !gp)// Je stisknuto 'G'?
{
gp=TRUE;
fogfilter+=1;// Inkrementace fogfilter
if(fogfilter>2)// Hlφdß p°eteΦenφ
{
fogfilter=0;
}
glFogi (GL_FOG_MODE, fogMode[fogfilter]);// Nastavenφ m≤du mlhy
}
if(!keys['G'])// Bylo uvoln∞no 'G'?
{
gp=FALSE;
}
Hodn∞ zajφmav², ale p°edevÜφm totßln∞ jednoduch² efekt. Celkem bezbolestn∞ jsme se nauΦili pou₧φvat mlhu v OpenGL programech.
napsal: Christopher Aliotta - Precursor
p°elo₧il: Michal Turek - Woq