[Grafika] [WebTip] [Fotografování] [Galerie] [MujMac] [Printing]
  Redakce: info (at) builder.cz   Inzerce: reklama (at) grafika.cz
Diskuzní fóra
.Net (68468)
ASP (1591)
ActiveX (168)
Allegro (136)
Assembler (3926)
C++ Builder (23160)
C/C++ (44499)
Databáze (30680)
Delphi (78806)
DelphiX (1655)
DirectX (1464)
Java (39508)
JavaScript (12598)
Matematické programy (2178)
OOP a UML (732)
OpenGL (6920)
Php (65224)
PowerBuilder (464)
Problémy a algoritmy (10473)
Programování v Linuxu (2000)
Právo a programování (3384)
Python (1353)
Ruby (136)
Visual Basic (12078)
Visual C++ (12956)
Wap (56)
Web (10895)
Web servery (5549)
Win32 (13553)
Windows CE (865)
XML/XSL (1860)
Textová inzerce
Služby Builder.cz
  • Bazar - koupím(0)
  • Bazar - prodám(0)
  • Hledám práci(0)
  • Nabízíme práci(0)
  • Projekty(0)
  • OpenGL v C++ Builderu (5.díl)
    "Za mlhou hustou tak, že by se dala krájet"..., tak takhle nějak začíná jeden večerníček o Křemílkovy a Vochomůrce, ale začíná tak i naše další pokračování seriálu o OpenGL. V dnešním díle se budeme věnovat nastavení mlhy ve scéně.
    OpenGL
    Předchozí díl: OpenGL v C++ Builderu (4.díl)

    Následující díl: OpenGL v C++ Builderu (6.díl)
    Autor: Michal Svoboda
    Rubrika: C/C++
    Publikováno: 24.10. 2001
     Tisk článku
    Poslat odkaz emailem
     

    Mlha (fog)

    "Za mlhou hustou tak, že by se dala krájet ...", tak takhle nějak začíná jeden večerníček o Křemílkovy a Vochomůrce, ale začíná tak i naše další pokračování seriálu o OpenGL. V dnešním díle se budeme věnovat nastavení mlhy ve scéně.

    Mlha je stejně důležitá jako světla, o kterých jsme mluvili v předchozích dílech a dotváří celkové prostředí ve scéně. Minule jsme skončili příkladem rotující krychle s texturou. Dnes tento příklad obohatíme o nové možnosti. Ale nejprve si povězme, co bude cílem našeho snažení:

    Naše krychle nebo spíše bedna, bude rotovat v prostoru a okolo bude přibývat mlha.

    Podívejme se na hromadu proměnných, které budeme potřebovat:
    GLfloat z=-7.0f;
    Souřadnice z znamená posunutí krychle dozadu.
    double fogdensity = 0.05;
    Fogdensity je číselná hodnota hustoty mlhy (viz dále)
    Dále tu máme již staré známe, o kterých se ani nemusím rozepisovat LightAmbiet, LightDiffuse, LightPosition a LightSpecular. To je definice světla.
    GLuint filter = 0;
    Tato proměnná bude indexovat, který použijeme filter. Budeme mít vytvořené 3 textury (z jedné bitmapy) a tyto 3 textury se budou odlišně mapovat (použijeme odlišné filtry).
    Pak tu máme označení pro filtr mlhy
    GLuint fogMode[]= { GL_EXP, GL_EXP2, GL_LINEAR};
    GLuint fogfilter = 0;

    No a poslední důležitý parametr mlhy bude barva mlhy. Mlha, jak známo, má šedivou barvu:
    GLfloat fogColor[4] = {0.5f,0.5f,0.5f,1.0f};

    Nyní přeskočme funkce pro načítání textur, které jsou maličko vylepšené a podívejme se na to, jak mlhu napasovat do scény. Je zvykem nastavit mlhu při inicializaci, když nám postačuje mlha pro celou scénu (nehodláme ji měnit při běhu programu). Mi potřebujeme za běhu programu měnit nastavení mlhy, proto definici mlhy umístíme do funkce DrawScene.

    glFogi(GL_FOG_MODE, fogMode[fogfilter]);  // mód mlhy
    glFogfv(GL_FOG_COLOR, fogColor);  // nastavit barvu mlhy
    glFogf(GL_FOG_DENSITY, fogdensity+=0.0005);  // hustota mlhy
    glHint(GL_FOG_HINT, GL_DONT_CARE);
    glFogf(GL_FOG_START, 5.0f);  // počátek mlhy
    glFogf(GL_FOG_END, 7.0f);  // konec mlhy - kde je už neprůhledná
    glEnable(GL_FOG);  // aktivujeme mlhu

    Nastavení provádíme přes funkci void glFogi( GLenum pname, GLint param ). Pomocí pname volíme parametr mlhy, který budeme měnit. Nejprve zvolíme GL_FOG_MODE, mód mlhy . Ten může nabývat hodnot GL_LINEAR, GL_EXP, a GL_EXP2. Jedná se o kvalitu zobrazované mlhy. GL_EXP je nejjednodušší nastavení vhodné pro pomalejší počítače (basic), mlha je jednoduchá a přes celou scénu (konstantní). O něco lepší mlhu získáme parametrem GL_EXP2. No a nejlepší , nejvěrohodnější mlhu uhněteme přes parametr GL_LINEAR. Toto nastavení bere v úvahu i viditelný přechod .... až do mlhy nejhustší. Podívejte se, jaký je rozdíl mezi nastavením GL_EXP, GL_LINEAR.

    Dalším nastavením mlhy je GL_FOG_COLOR, což je barva mlhy, která je šedá. Mimo to je potřeba mít nastavený
    glClearColor(0.5f,0.5f,0.5f,1.0f);
    na šedou barvu, jinak scéna bude vypadat podivně. Pro demonstrační obrázky nahoře jsem použil bílou podkladovou barvu a není to ono.
    GL_FOG_DENSITY je hustota mlhy. Optimální hodnoty jsou 0.05 až 0,45. Čím vyšší hodnota hustoty, tím je mlha hustší až tak, že by se dala krájet :)).
    Následuje nastavení odkud mlha sahá GL_FOG_START, a GL_FOG_END je hodnota kde už není přes mlhu vidět. Vyzkoušejte si dvě kombinace hodnot pro start a stop (4.0, 7.0) a (4.0, 6.0). Ještě nesmím zapomenout, že nastavení těchto hodnot je viditelné pouze při módu mlhy GL_LINEAR.
    Nyní už stačí jen mlhu aktivovat a program je hotov.

    Ale aby toho nebylo málo, vyzkoušíme ještě 3 druhy mapování textur. Ty rozdíly budou viditelné především v kvalitě.
    Vraťme se k načítání textur, vraťme se do funkce LoadGLTextures().
    Jak již jsem zmínil na začátku způsob mapování budeme přepínat proměnou filter tím, že budeme měnit hodnoty 0, 1 nebo 2. 3 textury registrujeme polem texture[3].
    Nejjednodušší způsob texturování je takový mix typu GL_NEAREST a GL_LINEAR (texture[0]). Tento způsob neoplývá příliš velkou realističností vykreslované textury. Na textuře jsou vidět jednotlivé pixely a vše je nevyhlazené, považuji to jako velkou nevýhodu. Na opak pro pomalejší počítače je to jediný způsob, jak přizpůsobit rychlost vykreslování výkonu počítače. Tento způsob texturování je definován takto:

    glBindTexture(GL_TEXTURE_2D, texture[0]);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
    glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[0]->sizeX, TextureImage[0]->sizeY,
    0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data);

    Poznámka:
    Tzv. MIN_FILTER se aplikuje, je-li vykreslovaná textura menší než skutečná textura (tedy obrázek). MAG_FILTER se aplikuje, když je vykreslovaná textura větší než skutečná textura.




    Druhý způsob texturování je naprosto shodný s tím, co jsme si uváděli minule. Jde o lineární texturování. Opět vhodné spíše pro pomalejší strojem, nebo vhodné pro náhledy.

    glBindTexture(GL_TEXTURE_2D, texture[1]);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
    glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[0]->sizeX, TextureImage[0]->sizeY, 0,
    GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data);

    A třetí způsob se jmenuje mipmaping, je to z těchto pří způsobů texturování nejlepší. Dobře vypadá, ale je náročnější na výkon počítače. Pokud je mapovaná textura větší než skutečná textura, použije se lineární mapování. Pokud je mapovaná textura menší než skutečná textura použije se MIPMAP.

    glBindTexture(GL_TEXTURE_2D, texture[2]);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST);
    gluBuild2DMipmaps(GL_TEXTURE_2D, 3, TextureImage[0]->sizeX, TextureImage[0]->sizeY,
    GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data);


    A na obrázku to vypadá asi takto (MIPMAP):



    LINKS
    NeHe tutorials


    DOWNLOAD
    fog.zip (290 KB) - výsledný exe a zdroják
    klávesami 1,2,3 se přepínají typy mlhy
    klávesami Q,W,E se přepíná texturování

     

     

     


    Zpět na začátek stránky

    Autor: Michal Svoboda
    Klikni pro další články autora

    Hodnocení článku
    1 | 2 | 3 | 4 | 5
    Aktuální známka: 2.74
    (Počet známek: 3656)

    Komentáře k článku
    Pepa27.07.11:06mlha na casti sceny
    Michal Svoboda27.07.22:55RE: mlha na casti sceny
    Michal Svoboda26.10.21:05Rekl bych........
    Michal Svoboda25.10.6:55RAKOSNICEK
    bubak25.10.9:11RE: RAKOSNICEK
    Petr Pastas24.10.8:48Za mlhou ...
         





    info@builder.cz
    Vydává Grafika Publishing, s.r.o.
    Copyright (c) 1997-2002 Všechna práva vyhrazena