Comment mettre en œuvre un brouillard de sol shader GLSL

Je suis en train de mettre en œuvre un brouillard de sol shader pour mon terrain moteur de rendu.
La technique est décrite dans cet article: http://www.iquilezles.org/www/articles/fog/fog.htm

L'idée est de considérer que le rayon passe de l'appareil sur le fragment et d'intégrer le brouillard d'une fonction de densité le long de ce rayon.

Voici mon code du shader:

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

La première chose, c'est que je ne comprends pas comment choisir a et b, et quelles sont leurs physiques rôle dans le brouillard d'une fonction de densité.

Ensuite, le résultat n'est pas ce que j'attends...
J'ai un brouillard de sol, mais la transition de fogAmount de 0 à 1 est toujours centré au niveau de la caméra d'altitude. J'en ai essayé beaucoup de différents a et b, mais quand je n'ai pas de transition de la caméra de l'altitude, je avoir un plein voilées ou non voilées à tous les terrains.

J'ai vérifié les données que j'utilise et tout est correct:

  • camPos.z est l'altitude de mon appareil photo
  • camFrag.z est la composante verticale du vecteur allant de la caméra pour le fragment

Je n'arrive pas à comprendre quelle partie de l'équation cause de cela.

Toute idée de ce ?

EDIT : Voici l'effet, je suis à la recherche de :
image1
image2

InformationsquelleAutor Vylsain | 2014-02-04