Lektion 16: Nebel
Mit Nebel läßt sich so mancher schöner und praktischer Effekt
erzielen. Er kann auch für Rauch, Dunst, Wolken oder ähnliches eingesetzt
werden und macht sehr trockene Szenerie wesentlich realistischer. Aber auch
wenn es darum geht die Sicht zu begrenzen, sei es um dem Spieler das Vorwärtskommen
zu erschweren oder um wertvolle Polygone zu sparenn kommt er zum Einsatz. Der
Code basiert auf Tutorial 7, die zusätzlichen Stücke müssen also
nur an die entsprechenden Stellen gesetzt werden.
Initialisierung:
Zuerst werden ein paar Werte festgelegt (Am besten hinter GLuint texture[3];
in den Quelltext packen). Es gibt drei verschiedene Arten Nebel zu berechnen,
die alle in fogMode gespeichert werden und durch "GLuint fogfilter"
angewählt werden. Dabei werden GL_EXP, GL_EXP2 und GL_LINEAR unterschieden
(Wird später nochmal angesprochen.). Als nächstes wird die Farbe im
RGBA-Modus festgelegt. In gp wird gespeichert ob die "G"-Taste gedrückt
wird.
bool gp; // G Pressed? ( New )
GLuint filter; // Which Filter To Use
GLuint fogMode[]= { GL_EXP, GL_EXP2, GL_LINEAR }; // Storage For Three Types Of Fog
GLuint fogfilter= 0; // Which Fog To Use
GLfloat fogColor[4]= {0.5f, 0.5f, 0.5f, 1.0f}; // Fog Color
InitGL:
glClearColor() wurde verändert um die Hintergrundfarbe der Nebelfarbe
anzupassen (Damit der Nebel "unverfälscht" zur Geltung kommt.).
glClearColor(0.5f,0.5f,0.5f,1.0f); // We'll Clear To The Color Of The Fog ( Modified )
glFogi(GL_FOG_MODE, fogMode[fogfilter]); // Fog Mode
glFogfv(GL_FOG_COLOR, fogColor); // Set Fog Color
glFogf(GL_FOG_DENSITY, 0.35f); // How Dense Will The Fog Be
glHint(GL_FOG_HINT, GL_DONT_CARE); // Fog Hint Value
glFogf(GL_FOG_START, 1.0f); // Fog Start Depth
glFogf(GL_FOG_END, 5.0f); // Fog End Depth
glEnable(GL_FOG); // Enables GL_FOG
Los gehts mit dem schon angesprochenen Modus, dieser wird durch "fogfilter"
ausgwählt. Die einzelnen Modi haben folgende Eigenschaften:
GL_EXP - Besonders auf älteren PCs wirkungsvoll, der ganz sichtbare Bereich
wird "vernebelt".
GL_EXP2 - Dichtere Nebel, der tiefere Bereiche noch stärker ausblendet.
GL_LINEAR - Der beste Nebeleffekt, die Übergänge sind fließender
und lassen Bereiche ganz verschwinden.
Als nächstes wir die Farbe festgelegt, das schon oben definierte Grau kommt
zum Einsatz.
glFogf(GL_FOG_DENSITY, 0.35f); legt die Dichte des Nebels fest. Je größer
der Wert, destso dichter wirkt der Nebel.
glHint (GL_FOG_HINT, GL_DONT_CARE); verändert die Formel zur Nebelberechnung.
Gültige Werte sind dabei:
GL_DONT_CARE - OpenGL wählt die Art des Nebels selbst aus (pixelgenau oder
grob für die Einzelpunkte)
GL_NICEST - pixelgenaue Nebelberechnung, sieht gut aus, frißt aber auch
Performance
GL_FASTEST - grobere Berechnung auf Grund der Vertexdaten, weniger schön,
aber sparsam
glFogf(GL_FOG_START, 1.0f); legt fest, wo vom Betrachter aus, der Nebel beginnt..
glFogf(GL_FOG_END, 5.0f);. Wo soll der Nebel enden?
Steuerung:
Damit man den Nebelmodus per "G"-Taste verändern kann, muss
der Status der Taste abgefragt werden. Der Codeschnipsel muss ans Ende des Programms
zu den anderen Abfragen:
if (keys['G'] && !gp) // Is The G Key Being Pressed?
{
gp=TRUE; // gp Is Set To TRUE
fogfilter+=1; // Increase fogfilter By One
if (fogfilter>2) // Is fogfilter Greater Than 2?
{
fogfilter=0; // If So, Set fogfilter To Zero
}
glFogi (GL_FOG_MODE, fogMode[fogfilter]); // Fog Mode
}
if (!keys['G']) // Has The G Key Been Released?
{
gp=FALSE; // If So, gp Is Set To FALSE
}
Und das wars auch schon.
Christopher Aliotta (Precursor) http://www.incinerated.com/precursor.
Jeff Molofee (NeHe) http://nehe.gamedev.net
Die Source Codes und Ausführbaren Dateien zu den Kursen liegen auf der Neon
Helium Website
Übersetzt und leicht modifiziert von Hans-Jakob Schwer 19.09.2k2, www.codeworx.org