Cómo implementar un sombreador de niebla GLSL

Estoy tratando de implementar un sombreador de niebla de tierra para mi motor de renderizado de terreno. La técnica se describe en este artículo:http://www.iquilezles.org/www/articles/fog/fog.htm

La idea es considerar el rayo que va de la cámara al fragmento e integrar la función de densidad de niebla a lo largo de este rayo.

Aquí está mi código de sombreado:

#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 );
}

Lo primero es que no entiendo cómo elegir a y b, y cuál es su función física en la función de densidad de niebla.

Entonces, el resultado no es lo que espero ... Tengo una niebla de fondo, pero la transición de fogAmount de 0 a 1 siempre se centra en la altitud de la cámara. He intentado un montón de a y b diferentes, pero cuando no tengo una transición a la altura de la cámara, tengo un empañado completo o no empañado en todo el terreno.

Revisé los datos que uso y todo es correcto:

camPos.z es la altitud de mi cámaracamFrag.z es el componente vertical del vector que va desde la cámara al fragmento.

No puedo entender qué parte de la ecuación causa esto.

¿Alguna idea sobre esto?

EDIT: Aquí está el efecto que estoy buscando:imagen1 imagen2

Respuestas a la pregunta(2)

Su respuesta a la pregunta