Lekcja 16. Ładnie wyglądająca mgła
Autor: Rafał 'Revo' Kozik
Oryginał: Cool Looking Fog (Chris Aliotta)
Źródła: http://nehe.gamedev.net/data/lessons/vc/lesson16.zip

Chcesz dodać mgłę do Twojego programu w OpenGL? W tym tutorialu pokażę Ci, jak to zrobić. Kod tej lekcji jest oparty o kod z lekcji 7

Inicjalizacja danych

Zaczniemy od ustawienia wszystkich zmiennych potrzebnych do przechowywania informacji o mgle. Zmienna fogMode będzie użyta do przechowywania trzech typów mgły: GL_EXP, GL_EXP2 i GL_LINEAR. Różnice pomiędzy nimi wytłumaczę później. Zmienne umieścimy na początku kodu, za linią GLuint texture[3]. Zmienna fogfilter będzie użyta do przechowania informacji o używanym rodzaju mgły. Zmienna fogColor będzie przechowywać kolor mgły, jaki sobie zażyczymy. Dodatkowo, na początku kodu, dodałem zmienną logiczną gp, która będzie nas w dalszej części tutoriala informować, czy wciśnięty jest klawisz 'g'.

bool gp;         // Czy G zostało naciśnięte? ( NOWE )
GLuint filter;         // Którego filtru użyć
GLuint fogMode[]= { GL_EXP, GL_EXP2, GL_LINEAR };         // Przechowuje trzy typy mgły
GLuint fogfilter= 0;         // Którego typu mgły użyć
GLfloat fogColor[4]= {0.5f, 0.5f, 0.5f, 1.0f};         // Kolor mgły

Dostosowanie DrawGLScene

Po zdefiniowaniu naszych zmiennych przechodzimy do InitGL. Linia glClearColor() została zmieniona tak, aby wypełnić ekran tym samym kolorem, co mgła, dla uzyskania lepszego efektu. Mgła nie potrzebuje wiele kodu. Wszystko jest bardzo proste. Ten kod umieść w procedurze DrawGLScene()

    glClearColor(0.5f,0.5f,0.5f,1.0f);         // Kolor wypełnienia taki sam jak kolor mgły ( ZMODYFIKOWANO )
    glFogi(GL_FOG_MODE, fogMode[fogfilter]);         // Tryb mgły
    glFogfv(GL_FOG_COLOR, fogColor);         // Ustawienie koloru mgły
    glFogf(GL_FOG_DENSITY, 0.35f);         // Jak gęsta będzie nasza mgła
    glHint(GL_FOG_HINT, GL_DONT_CARE);         // Sposób tworzenia (pikselowy albo wierzchołkowy)
    glFogf(GL_FOG_START, 1.0f);         // Odległość początku mgły
    glFogf(GL_FOG_END, 5.0f);         // Odległość końca mgły
    glEnable(GL_FOG);         // Włącza GL_FOG

Zerknijmy na pierwsze trzy linie z tego kodu. Pierwsza linia (raczej ostatnia - przyp. tłum.) glEnable(GL_FOG); nie wymaga wyjaśnienia. Po prostu inicjalizuje mgłę.

Druga linia, glFogi(GL_FOG_MODE, fogMode[fogfilter]); ustawia tryb filtru mgły. Wcześniej zadeklarowaliśmy tablicę fogMode. Przechowuje ona GL_EXP, GL_EXP2 i GL_LINEAR. Pozwól mi każdą z nich wyjaśnić:

Trzecia linia, glFogfv(GL_FOG_COLOR, fogcolor); ustawia kolor mgły. Wcześniej ustaliliśmy go na (0.5f,0.5f,0.5f,1.0f) używając zmiennej fogcolor, daje nam to ładny szary kolor.

Następnie spójrzmy na ostatnie cztery linie tego kodu. Linia glFogf(GL_FOG_DENSITY, 0.35f); ustala gęstość mgły. Gdy zwiększymy wartość, mgła stanie się gęstsza, zmniejszenie spowoduje, że stanie się rzadsza.

Linia glHint (GL_FOG_HINT, GL_DONT_CARE); ustala sposób tworzenia mgły. Użyłem GL_DONT_CARE, ponieważ mnie to nie obchodzi.

Eric Desrosiers dodał: Małe wyjaśnienie glHint(GL_FOG_HINT, hintval);

hintval może przyjmować wartości: GL_DONT_CARE, GL_NICEST albo GL_FASTEST

Następna linia: glFogf(GL_FOG_START, 1.0f); ustala, jak blisko ekranu powinna zacząć się mgła. Możesz zmieniać tę wartość, kiedy tylko chcesz zmienić położenie mgły. Następna linia jest podobna, glFogf(GL_FOG_END, 5.0f);. Informuje OpenGL, jak daleko od ekranu powinna skończyć się mgła.

Zdarzenia naciśnięcia klawiszy

Teraz pozostaje nam dodanie reakcji na klawisze, aby móc zmieniać tryby mgły. Ten kod powinien znaleźć się pod koniec programu, czyli tam, gdzie znajduje się obsługa innych klawiszy.

        if (keys['G'] && !gp)         // Czy klawisz G został naciśnięty?
        {
            gp=TRUE;         // gp jest ustawiane na TRUE
            fogfilter+=1;         // Zwiększa fogfilter o jeden
            if (fogfilter>2)         // Czy fogfilter jest większy niż 2?
            {
        // Jeżeli tak, to fogfilter ma być równy zero
                fogfilter=0;
            }
            glFogi (GL_FOG_MODE, fogMode[fogfilter]);         // Tryb mgły
        }
        if (!keys['G'])         // Czy klawisz G został puszczony?
        {
            gp=FALSE;         // Jeżeli tak, ustawiamy gp na FALSE
        }

I to wszystko! Skończyliśmy! Teraz masz już mgłę w twoim programie OpenGL. Jak zauważyłeś, nie ma w tym nic trudnego.