glFog
Inhaltsverzeichnis
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)
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:
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:
Die endgültige Farbe wir dann mit folgender Formel berechnet:
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