glFog

Aus DGL Wiki
Wechseln zu: Navigation, Suche

glFog

Name

glFog - Bestimmt Parameter und Funktionen zur Berechnung von Nebel


Delphi-Spezifikation

procedure glFogf(pname: GLenum; param: TGLFloat)
procedure glFogfv(pname: GLenum; const params: PGLFloat)
procedure glFogi(pname: GLenum; param: TGLint)
procedure glFogiv(pname: GLenum; const params: PGLint)


glFog-Beispiel aus dem Spiel "OpenParty" von DGL Mitglied Ziz. Als Parameter wurden verwendet:
FogColor: (0.8,0.8,0.8); FogMode: GL_LINEAR; FogStart: 2.0; FogEnd: 15.0

Parameter

Für alle glFog-Befehle, denen die Werte direkt übergeben werden (ohne v):

pname Bestimmt den Parameter, der geändert weren soll (GL_FOG_MODE, GL_FOG_DENSITY, GL_FOG_START, GL_FOG_END oder GL_FOG_INDEX)
param Bestimmt den Wert, den der in pname angegebene Parameter annehmen soll.


Für alle glFog-Befehle, denen die Werte über einen Pointer übergeben werden (mit v):

pname Bestimmt den Parameter, der geändert weren soll (GL_FOG_MODE, GL_FOG_DENSITY, GL_FOG_START, GL_FOG_END, GL_FOG_COLOR oder GL_FOG_INDEX)
params Pointer auf den Wert, den der in pname angegebene Parameter annehmen soll.


Beschreibung

'Nebel' ist hier ein umfassender Begriff für verschiedene atmosphärische Effekte wie Nebel, Rauch, Dunst oder andere feine Partikel in der Luft.

Bei OpenGL sorgt angeschalteter Nebel dafür, dass die Farben gerendertet Objekte in die Farbe des Nebels übergehen, je weiter die Objekte vom ViewPoint entfernt sind. Dies geht so weit, dass sie im Extremfall ganz im Nebel verschwinden. Zur größeren Kontrolle können außerdem jedem Vertex mit der Funktion glFogCoord spezifische Nebel-Koordinaten übergeben werden, anstatt (wie im Normalfall) die automatisch berechneten Tiefenwerte zu verwenden.

Mit glFog werden Parameter wie Farbe, Dichte oder die Funktionen zur Berechnung des Nebels bestimmt.

Dabei können folgende symbolische Konstanten an den Parameter pname übergeben werden:

GL_FOG_MODE

Bestimmt die Art und Weise, auf die die Intensität mit zunehmender Entfernung abnimmt.
param kann dabei folgende Werte annehmen:
GL_LINEAR
Die Intensität der ursprünglichen Farbe gerenderter Objekte nimmt linear mit der Entfernung ab
GL_EXP (Standard)
Die Intensität der ursprünglichen Farbe gerenderter Objekte nimmt exponentiell mit der Entfernung ab. Dabei ist die Abnahmerate zu Anfang am stärksten und wird dann immer kleiner.
GL_EXP2
Wie bei GL_EXP nimmt die Intensität der ursprünglichen Farbe gerenderter Objekte auch hier exponentiell ab. Allerdings ist die Abnahmerate zu Anfang weniger stark, wird aber dann so groß, dass schnell der Punkt erreicht ist, an dem ein Objekt nicht mehr zu sehen ist.
Näheres zu GL_FOG_MODE weiter unten im Teil Mathematisches

GL_FOG_DENSITY

Bestimmt die Dichte des Nebels. param ist hier eine Integer- oder Fließkommazahl (params in den Vektorversionen respektive ein Pointer auf eine Integer- oder Fließkommazahl). Der Standardwert für GL_FOG_DENSITY ist 1.

GL_FOG_START

Bestimmt den z-Wert, an dem der Nebel beginnt. param ist wie bei GL_FOG_DENSITY eine Integer- oder Fließkommazahl bzw. ein entsprechender Pointer darauf. Der Standardwert für GL_FOG_START ist 0.

GL_FOG_END

Bestimmt den z-Wert, ab dem die Intensität des Nebels nicht weiter zunimmt. Für param gilt dasselbe wie bei GL_FOG_START. Der Standardwert für GL_FOG_END ist 1.

GL_FOG_COLOR

Bestimmt die Farbe des Nebels im RGBA-Modus. Dieser Parameter ist nur in den Vektorversionen der Funktion verfügbar, wobei mit params ein Pointer auf ein Array mit 4 Elementen ist, die die einzelnen Farbwerte darstellen.

GL_FOG_INDEX

Bestimmt die Farbe des Nebels im Farbindex-Modus. Die zu setzende Farbe wird mit dem in param enthaltenen Farbindex bzw. mit dem in params gegebenen Pointer darauf bestimmt.

Mathematisches

Zur Berechnung der neuen Farbe eines Pixels bei angeschaltetem Nebel wird die ursprüngliche Farbe mit der Nebelfarbe über einen Blend-Faktor kombiniert. Dieser Faktor wird je nach gesetzter FOG_MODE mit einer der folgenden Gleichungen berechnet und dann auf den Bereich [0, 1] skaliert:

GlFog fog factors.png

z ist dabei der Abstand des Fragments zum Viewpoint. density, start und end sind die mit glFog festgelegten Werte für GL_FOG_DENSITY, GL_FOG_START und GL_FOG_END.

Folgendes Diagramm veranschaulicht den Intensitätsverlauf der ursprünglichen Fragmentfarbe bei den einzelnen Fog-Modes:

GlFog equation diagram.png



Die endgültige Farbe wir dann mit folgender Formel berechnet:

GlFog calc new color.png



Hinweise

GL_FOG_DENSITY ist nur relevant, wenn GL_EXP oder GL_EXP2 gesetzt sind. Ist GL_FOG_MODE gleich GL_LINEAR, verläuft die Intensitätskurve linear von 100% bei der Entfernung GL_FOG_START bis 0% bei der Entfernung GL_FOG_END.

Entsprechend sind GL_FOG_START sowie GL_FOG_END nur dann relevant, wenn GL_FOG_MODE gleich GL_LINEAR ist.

Um Nebel zu benutzen, muss dieser erst mit glEnable(GL_FOG) aktiviert werden.

Außerdem kann mit glHint ein Vorschlag bezüglich der Qualität der Nebelberechnung gemacht werden: Der Aufruf

glHint(GL_FOG_HINT, GL_FASTEST) 

schlägt eine Berechnung auf Vertexbasis, der Aufruf

glHint(GL_FOG_HINT, GL_NICEST) 

dagegen eine Berechnung auf Pixelbasis vor.


Zugehörige Wertrückgaben

glGet mit Token GL_FOG_MODE

glGet mit Token GL_FOG_DENSITY

glGet mit Token GL_FOG_START

glGet mit Token GL_FOG_END

glGet mit Token GL_FOG_COLOR

glGet mit Token GL_FOG_INDEX


Siehe auch

glFogCoord, glHint