NeHe - Lektion 16 - Cool aussehender Nebel

Lektion 16



Dieses Tutorial kommt von Chris Aliotta...

Sie wollen also Nebel in Ihr OpenGL-Programm einfügen? Nun denn, in diesem Tutorial zeige ich genau wie man das macht. Das ist das erste Mal, dass ich ein Tutorial schreibe und ich bin auch noch realtiv neu, was OpenGL/C++ Programmierung angeht, deshalb die Bitte, wenn Sie etwas finden, was falsch ist, lassen Sie es mich wissen und haben Sie etwas Nachsicht. Dieser Code basiert auf dem Code aus Lektion 7.

Daten initialisieren:
Wir fangen mit der Initialisierung unserer Variablen an, die die Informationen für Nebel enthalten. Die Variable fogMode wird benutzt, um drei Arten von Nebel aufzunehmen: GL_EXP, GL_EXP2 und GL_LINEAR. Ich werde die Unterschiede zwischen den dreien später erklären. Die Variablen stehen am Anfang des Codes hinter der Zeile GLuint texture[3]. Die Variable fogfilter wird benutzt um auf dem laufenden zu bleiben, welche Art Nebel gerade verwendet wird. Die Variable fogColor enthält die Farbe die unser Nebel haben soll. Ich habe außerdem die boolesche Variable gp am Anfang des Codes eingefügt, so dass wir überprüfen können, ob die 'g'-Taste später in diesem Tutorial gedrückt wurde.

bool   gp;                        // G gedrückt? ( Neu )
GLuint filter;                        // Welcher Filter benutzt wird
GLuint fogMode[]= { GL_EXP, GL_EXP2, GL_LINEAR };    // Speicher für drei Arten von Nebel
GLuint fogfilter= 0;                    // Welche Nebel benutzt wird
GLfloat fogColor[4]= {0.5f, 0.5f, 0.5f, 1.0f};        // Nebel Farbe

DrawGLScene Setup

Nachdem wir unsere Variablen eingeführt haben gehen wir weiter zu InitGL. Die glClearColor() Zeile wurde geändert, um den Bildschirm mit der selbe Farbe wie dem Nebel zu löschen, um einen besseren Effekt zu erzielen. Es wird nicht viel Code benötigt, um Nebe zu erzeugen. Sie werden es sehr leicht finden.

glClearColor(0.5f,0.5f,0.5f,1.0f);            // Wir löschen auf die Farbe des Nebels ( Geändert)

glFogi(GL_FOG_MODE, fogMode[fogfilter]);        // Nebel Modus
glFogfv(GL_FOG_COLOR, fogColor);            // Setze Nebel Farbe
glFogf(GL_FOG_DENSITY, 0.35f);                // Wie dicht wird der Nebel
glHint(GL_FOG_HINT, GL_DONT_CARE);            // Nebel Hinweis Wert
glFogf(GL_FOG_START, 1.0f);                // Nebel Anfangs-Tiefe
glFogf(GL_FOG_END, 5.0f);                // Nebel End-Tiefe
glEnable(GL_FOG);                    // Aktiviert GL_FOG

Schauen wir uns die ersten drei Zeilen an. Die erste Zeile glEnable(GL_FOG); ist ziemlich selbsterklärend. Grundsätzlich initialisiert sie den Nebel.

Die zweite Zeile, glFogi(GL_FOG_MODE, fogMode[fogfilter]); stellt den Filter-Modus ein. Vorher haben wir das Array fogMode deklariert. Es enthält GL_EXP, GL_EXP2 und GL_LINEAR. Hier kommen diese Variablen ins Spiel. Lassen Sie mich jede einzelne erklären:
  • GL_EXP - Rudimentär gezeichneter Nebel welcher den gesamten Bildschirm ausnebelt. Sieht nicht gerade nach einem Nebel-Effekt aus, aber verrichtet die Arbeit auf älteren PCs.
  • GL_EXP2 - Die nächst höhere Stufe von GL_EXP. Dieser Nebel wird auch den ganzen Bildschirm ausnebeln, aber gibt der Szene wesentlich mehr Tiefe.
  • GL_LINEAR - Das ist der beste Nebel-Modus. Objekte erscheinen und verschwinden wesentlich besser im Nebel.
Die dritte Zeile, glFogfv(GL_FOG_COLOR, fogcolor); setzt die Farbe des Nebels. Vorher hatten wir diese auf (0.5f,0.5f,0.5f,1.0f) gesetzt, indem wir die Variable fogcolor benutzen, um ein netten Grauton zu erhalten.

Schauen wir uns die letzten vier Zeilen an. Die Zeile glFogf(GL_FOG_DENSITY, 0.35f); gibt an, wie Dicht der Nebel sein soll. Erhöhen Sie diesen Wert, um den Nebel dicker zu machen oder senken Sie den Wert um den Nebel zu lichten.

Die Zeile glHint (GL_FOG_HINT, GL_DONT_CARE); signalisiert einen Hinweis. Ich habe GL_DONT_CARE benutzt, weil ich keinen Wert auf den Hinweis-Wert lege.

Eric Desrosiers fügt hinzu: Kleine Erklärung von glHint(GL_FOG_HINT, hintval);

hintval kann sein : GL_DONT_CARE, GL_NICEST oder GL_FASTEST

gl_dont_care - Lässt OpenGL die Art des Nebels auswählen (per vertex oder per pixel) und eine unbekannte Formel.
gl_nicest - Erzeugt den Nebel per Pixel (sieht gut aus)
glfastest - Erzeugt den Nebel per Vertex (schneller, aber weniger schön)

Die nächste zeile, glFogf(GL_FOG_START, 1.0f); bestimmt, wie dicht am Bildschirm der Nebel beginnen soll. Sie können diesen Wert auf was immer Sie wollen ändern, abhängig davon, wo Sie den Nebel starten lassen wollen. Die nächste Zeile ist ähnlich, glFogf(GL_FOG_END, 5.0f);. Diese teilt dem OpenGL-Programm mit, wie weit hinein der Nebel gehen soll.

Ereignisse beim Tastendruck

Nun, da wir den Code zum Zeichnen des Nebels fertig haben, fügen wir noch die Tastatur-Befehle ein, um zwischen den verschiedenen Nebel-Modi umzuschalten. Dieser Code kommt ans Ende des Programms, zu dem anderen Code, wo auch die anderen Tasten abgefragt werden.

if (keys['G'] && !gp)                    // Wurde die Taste G gedrückt?
{
    gp=TRUE;                    // gp wird auf TRUE gesetzt
    fogfilter+=1;                    // Erhöhe fogfilter um 1
    if (fogfilter>2)                // Ist fogfilter größer als 2?
    {
        fogfilter=0;                // Wenn ja, setze fogfilter auf 0
    }
    glFogi (GL_FOG_MODE, fogMode[fogfilter]);    // Nebel-Modus (Fog Mode)
}
if (!keys['G'])                        // Wurde die Taste G wieder losgelassen?
{
    gp=FALSE;                    // Wenn ja, setze gp auf FALSE
}



Das war's! Wir sind fertig! Nun haben Sie Nebel in Ihrem OpenGL Programm. Ich muss sagen, dass das ziemlich schmerzlos war. Wenn Sie Fragen oder Kommentare haben, können Sie mich gerne unter chris@incinerated.com kontaktieren. Bitte besucht auch meine Webseite: http://www.incinerated.com/ und http://www.incinerated.com/precursor.

Christopher Aliotta (Precursor)

Jeff Molofee (NeHe)

* DOWNLOAD Visual C++ Code für diese Lektion.

* DOWNLOAD Borland C++ Builder 6 Code für diese Lektion. ( Conversion by Christian Kindahl )
* DOWNLOAD C# Code für diese Lektion. ( Conversion by Brian Holley )
* DOWNLOAD Code Warrior 5.3 Code für diese Lektion. ( Conversion by Scott Lupton )
* DOWNLOAD Cygwin Code für diese Lektion. ( Conversion by Stephan Ferraro )
* DOWNLOAD Delphi Code für diese Lektion. ( Conversion by Michal Tucek )
* DOWNLOAD Dev C++ Code für diese Lektion. ( Conversion by Dan )
* DOWNLOAD Euphoria Code für diese Lektion. ( Conversion by Evan Marshall )
* DOWNLOAD Game GLUT Code für diese Lektion. ( Conversion by Milikas Anastasios )
* DOWNLOAD Irix / GLUT Code für diese Lektion. ( Conversion by Rob Fletcher )
* DOWNLOAD Java Code für diese Lektion. ( Conversion by Jeff Kirby )
* DOWNLOAD JoGL Code für diese Lektion. ( Conversion by Nicholas Campbell )
* DOWNLOAD LCC Win32 Code für diese Lektion. ( Conversion by Robert Wishlaw )
* DOWNLOAD Linux Code für diese Lektion. ( Conversion by Daniel Davis )
* DOWNLOAD Linux/GLX Code für diese Lektion. ( Conversion by Mihael Vrbanec )
* DOWNLOAD Linux/SDL Code für diese Lektion. ( Conversion by Ti Leggett )
* DOWNLOAD LWJGL Code für diese Lektion. ( Conversion by Mark Bernard )
* DOWNLOAD Mac OS Code für diese Lektion. ( Conversion by Anthony Parker )
* DOWNLOAD Mac OS X/Cocoa Code für diese Lektion. ( Conversion by Bryan Blackburn )
* DOWNLOAD MASM Code für diese Lektion. ( Conversion by Greg Helps )
* DOWNLOAD Visual C++ / OpenIL Code für diese Lektion. ( Conversion by Denton Woods )
* DOWNLOAD Pelles C Code für diese Lektion. ( Conversion by Pelle Orinius )
* DOWNLOAD SDL Code für diese Lektion. ( Conversion by Ken Rockot )
* DOWNLOAD Visual Basic Code für diese Lektion. ( Conversion by Ross Dawson )
* DOWNLOAD Visual Basic Code für diese Lektion. ( Conversion by Peter De Tagyos )
* DOWNLOAD Visual Studio .NET Code für diese Lektion. ( Conversion by Grant James )



Deutsche Übersetzung: Joachim Rohde
Der original Text ist hier zu finden.
Die original OpenGL Tutorials stammen von NeHe's Seite.