Vylsain

02-04-2014, 02:59 AM

Hello everyone.

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 algorithm.

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 ?

Thank you very much.

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 algorithm.

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 ?

Thank you very much.