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
Vous devez vous connecter pour publier un commentaire.
C'est une jolie application standard de la diffusion atmosphérique.
Il est abordé sous l'égide de l'éclairage volumétrique d'habitude, ce qui implique la transmission de la lumière à travers les différents médias (par exemple de la fumée, l'air, l'eau). À la fine pointe de shader graphiques, cela peut être réalisé en temps réel à l'aide de ray-marche ou si il y a un seul uniforme participant moyen (comme il est dans ce cas, le brouillard ne s'applique qu'à l'air), simplifié à l'intégration sur une certaine distance.
Normalement vous auriez ray-mars à travers la participation des médias dans le but de déterminer les propriétés de la lumière de transfert, mais cette application est simplifiée à assumer un milieu qui a bien défini les caractéristiques de distribution et c'est là que les coefficients vous êtes confus au sujet de viennent de. La densité de brouillard varie de façon exponentielle avec la distance, et c'est ce que
b
contrôle, de même elle varie également avec l'altitude (pas montré dans l'équation directement ci-dessous).(source: iquilezles.org)
Ce que cet article est une introduction à la discussion, cependant, sont mal nommée coefficients
a
etb
. Ces contrôle de la dispersion et de l'extinction. L'auteur mentionne à plusieurs reprises la extinction coefficient de extintion, qui ne fait pas vraiment de sens pour moi - j'espère que c'est juste parce que l'anglais n'était pas l'auteur de la langue maternelle. L'Extinction peut être considéré comme la façon dont rapidement la lumière est absorbée, et il décrit l'opacité d'un moyen. Si vous voulez une base théorique pour tout cela, jetez un oeil à le document suivant.Avec cela à l'esprit, prendre un autre regard sur le code de votre article:
Vous pouvez voir que
c
dans ce code faita
à partir de l'équation d'origine.Plus important encore, il existe une autre expression ici:
Cette expression supplémentaire de contrôles de la densité relative de l'altitude. À en juger par votre mise en œuvre de l'ombrage, vous n'avez pas correctement mise en œuvre de la deuxième expression.
camFrag.z
est très probable pas de l'altitude, mais plutôt de la profondeur. De plus, je ne comprends pas pourquoi vous en le multipliant par leb
coefficient.-distance
. Mais vu comment il est difficile d'utiliser le LaTeX sur un Débordement de Pile vs Maths, je ne vais même pas la peine de le changer.camFrag.z
est monrayDir.y
qui, je pense, est la composante verticale de mon vecteur de direction, n'est-ce pas ? Mon dénominateur est multiplié parb
parce que c'est le résultat de l'intégration deexp(-b*Dy*t)
qui estexp(-b*Dy*t)/(-b*Dy)
. En fait, je ne sais pas pourquoi cette multiplication dissappears à partir de l'article du code du shader puisque l'auteur le mentionne juste avant : liencamFrag
normalisé?J'ai trouvé une méthode qui donne le résultat que je cherchais.
La méthode est décrite dans cet article de Eric Lengyel : [lien]http://www.terathon.com/lengyel/Lengyel-UnifiedFog.pdf
Il explique comment créer un brouillard couche avec la densité de l'altitude et de paramètres. Vous pouvez voler à travers elle, il a progressivement mélanges de toute la géométrie au-dessus du brouillard.