So implementieren Sie einen GLSL-Shader für Bodennebel

Ich versuche, einen Bodennebel-Shader für meine Terrain-Rendering-Engine zu implementieren. Die Technik wird in diesem Artikel beschrieben:http://www.iquilezles.org/www/articles/fog/fog.htm

Die Idee ist, den Strahl, der von der Kamera zum Fragment geht, zu betrachten und die Nebeldichtefunktion entlang dieses Strahls zu integrieren.

Hier ist mein Shader-Code:

#version 330 core
in vec2 UV;
in vec3 posw;

out vec3 color;

uniform sampler2D tex;

uniform vec3 ambientLightColor;
uniform vec3 camPos;

const vec3 FogBaseColor = vec3(1., 1., 1.);

void main()
{
    vec3 light = ambientLightColor;
    vec TexBaseColor = texture(tex,UV).rgb;

    //***************************FOG********************************************
    vec3 camFrag = posw - camPos;
    float distance = length(camFrag);
    float a = 0.02;
    float b = 0.01;

    float fogAmount = a * exp(-camPos.z*b) * ( 1.0-exp( -distance*camFrag.z*b ) ) / (b*camFrag.z);
    color = mix( light*TexBaseColor, light*FogBaseColor, fogAmount );
}

Das erste ist, dass ich nicht verstehe, wie man a und b wählt und welche physikalische Rolle sie in der Nebeldichtefunktion spielen.

Dann ist das Ergebnis nicht das, was ich erwarte ... Ich habe einen Bodennebel, aber der Übergang von fogAmount von 0 zu 1 ist immer auf der Kamerahöhe zentriert. Ich habe viele verschiedene a und b ausprobiert, aber wenn ich in Kamerahöhe keinen Übergang habe, habe ich entweder ein voll beschlagenes oder gar kein beschlagenes Gelände.

Ich habe die von mir verwendeten Daten überprüft und alles ist korrekt:

camPos.z ist die Höhe meiner KameracamFrag.z ist die vertikale Komponente des Vektors, der von der Kamera zum Fragment verläuft

Ich kann nicht verstehen, welcher Teil der Gleichung dies verursacht.

Irgendeine Idee dazu?

EDIT: Hier ist der Effekt, den ich suche:image1 image2

Antworten auf die Frage(2)

Ihre Antwort auf die Frage