Na poczatku wykonaj kopię przygotowanego projektu w artykule „OpenGl – Szablon programu”, następnie nazwij ją np. Mgla. Otwórz projekt i przejdź do pliku render.pas. Dodaj do niego
poniższą procedurę, która będzie tworzyć mgłę :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
procedure Fog; var r, g, b: glfloat; // Zmienne decydujące o kolorze mgly begin glEnable(GL_FOG); //Włączamy obslugę mgły glFogi(GL_FOG_MODE, GL_LINEAR); // Wybieramy rodzaj mgly r := 0.5; // Nasycenie koloru czerwonego g := 0.5; // Nasycenie koloru zielonego b := 0.5; // Nasycenie koloru czerwonego glFogfv(GL_FOG_COLOR, @b); // Przypisanie barwy niebieskiej glFogfv(GL_FOG_COLOR, @g); // Przypisanie barwy zielonej glFogfv(GL_FOG_COLOR, @r); // Przypisanie barwy czerwonej glFogf(GL_FOG_DENSITY, 0.5); // Gęstosc mgly glFogf(GL_FOG_START, 0.0); // Zakres mgły - początek glFogf(GL_FOG_end, 50 - t); // Zakres mgły - koniec end; |
Możemy ustawić jakość mgły za pomocą parametru GL_FOG_MODE. Może przyjmować wartości :
– GL_LINEAR – liniowa
– GL_EXP2 – eksponencjalna kwadratowa
– GL_EXP – eksponencjalna
Im lepsza jakość mgły tym wolniejsze działanie programu.
Oprócz użytych przez nas parametrów istnieje jeszcze jeden. Poleceniem glHint(GL_FOG_HINT, … ); ustawiamy dokładność perspektywy. Możemy przypisać następujące wartości:
– GL_FASTEST – szybka, niezbyt dokładna
– GL_NICEST – powolna, bardzo dokładna
– GL_DONT_CARE – średnia
Tłumaczenie reszty parametów znajduje się w kodzie procedury i nie wymaga dodatkowego opisu. Teraz musimy wywołać mgłę.
Przejdź do procedury RenderFrame i dopisz na jej początku :
1 |
Fog; |
To wystarczy do stworzenia mgły. My jednak, aby lepiej widoczne było jej istnienie zmienimy procedurę
RenderFrame, aby wyświetlała obiekt 3D składający się z trzech trójkątów. Oto jej kod :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
procedure RenderFrame; begin //Mgla Fog; //Obrót glTranslatef(0.0, 0.0, -12.0); glRotate(30, 0.0, 0.5, 0.0); glbegin(GL_TRIANGLES); // pierwszy trójkąt glColor3f(1.0, 0.0, 0.0); glVertex3f(-5, -3, 2); glColor3f(1.0, 0.0, 0.0); glVertex3f(5, -3, 2); glColor3f(1.0, 0.0, 0.0); glVertex3f(0, 3, -20); // drugi trójkąt glColor3f(0.5, 0.0, 0.0); glVertex3f(-5, -3, 2); glColor3f(0.5, 0.0, 0.0); glVertex3f(0, 3, -20); glColor3f(0.5, 0.0, 0.0); glVertex3f(0, 10, -20); // trzeci trójkąt glColor3f(0.5, 0.0, 0.0); glVertex3f(5, -3, 2); glColor3f(0.5, 0.0, 0.0); glVertex3f(0, 3, -20); glColor3f(0.5, 0.0, 0.0); glVertex3f(0, 10, -20); glEnd(); end; |
Aby dopasować Timera do nowej procedury rysującej, otwórz plik timer.pas.
Usuń wszystkie zbędne funkcje, pozostaw tylko :
1 2 3 4 5 6 |
procedure FrameMath; begin t := t + 0.1; end; |
Po uruchomieniu programu zobaczy jak mgła będzie powoli zajmować coraz większą powierzchnię naszej sceny. Na tym kończymy ten artykuł.
Autor: Nakiel