/** * @file waterFogF.glsl * * $LicenseInfo:firstyear=2007&license=viewerlgpl$ * $/LicenseInfo$ */ #version 120 uniform vec4 lightnorm; uniform vec4 waterPlane; uniform vec4 waterFogColor; uniform float waterFogDensity; uniform float waterFogKS; vec3 getPositionEye(); vec4 applyWaterFog(vec4 color) { //normalize view vector vec3 view = normalize(getPositionEye()); float es = -(dot(view, waterPlane.xyz)); //find intersection point with water plane and eye vector //get eye depth float e0 = max(-waterPlane.w, 0.0); vec3 int_v = waterPlane.w > 0.0 ? view * waterPlane.w/es : vec3(0.0, 0.0, 0.0); //get object depth float depth = length(getPositionEye() - int_v); //get "thickness" of water float l = max(depth, 0.1); float kd = waterFogDensity; float ks = waterFogKS; vec4 kc = waterFogColor; float F = 0.98; float t1 = -kd * pow(F, ks * e0); float t2 = kd + ks * es; float t3 = pow(F, t2*l) - 1.0; float L = min(t1/t2*t3, 1.0); float D = pow(0.98, l*kd); color.rgb = color.rgb * D + kc.rgb * L; color.a = kc.a + color.a; return color; }