#version 330 // Input vertex attributes in vec3 fragPosition; in vec2 fragTexCoord; in vec4 fragColor; in vec3 fragNormal; // Input uniform values uniform sampler2D texture0; uniform vec4 colDiffuse; // Fog uniforms uniform vec3 viewPos; uniform float fogDensity; uniform float fogStart; // <--- New Uniform: Distance where fog begins // Output fragment color out vec4 finalColor; void main() { // 1. Get the base color vec4 texelColor = texture(texture0, fragTexCoord); vec4 baseColor = texelColor * colDiffuse * fragColor; // 2. Calculate distance from camera to fragment float dist = length(viewPos - fragPosition); // 3. Calculate effective distance (distance minus the clear zone) // We use max() to ensure we don't get negative distance inside the fogStart radius float effectiveDist = max(0.0, dist - fogStart); // 4. Calculate fog factor using Exponential Squared formula // We use effectiveDist so fog only begins accumulating after fogStart float fogFactor = exp(-pow(effectiveDist * fogDensity, 2.0)); fogFactor = clamp(fogFactor, 0.0, 1.0); // 5. Define fog color vec3 fogColor = vec3(0.47, 0.7, 0.70); // 6. Final Mix finalColor = vec4(mix(fogColor, baseColor.rgb, fogFactor), baseColor.a); }