How to implement a ground fog GLSL shader

glsl, opengl, shader

Solution

I found a method that gives the result I was looking for.

The method is described in this article of Eric Lengyel: http://www.terathon.com/lengyel/Lengyel-UnifiedFog.pdf

It explains how to create a fog layer with density and altitude parameters. You can fly through it, it progressively blends all the geometry above the fog.

Problem

I'm trying to implement a ground fog shader for my terrain rendering engine. The technique is described in this article: http://www.iquilezles.org/www/articles/fog/fog.htm The idea is to consider the ray going from the camera to the fragment and integrate the fog density function along this ray. Here's my 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 ); } ``` The first thing is that I don't understand how to choose a and b and what are their physical role in the fog density function. Then, the result is not what I expect… I have a ground fog but the transition of fogAmount from 0 to 1 is always centered at the camera altitude. I've tried a lot of different a and b but when I don't have a transition at camera altitude, I either have a full fogged or not fogged at all terrain. I checked the data I use and everything's correct: - camPos.z is the altitude of my camera - camFrag.z is the vertical component of the vector going from the camera to the fragment I can't get to understand what part of the equation cause this. Any idea about this ? EDIT : Here's the effect I'm looking for : image1 image2

Original source