45 lines
1.3 KiB
GLSL
45 lines
1.3 KiB
GLSL
#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);
|
|
}
|