www.codeworx.org/opengl-tutorials/Tutorial 16: Nebel

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