51 lines
1.0 KiB
GLSL
51 lines
1.0 KiB
GLSL
#ifdef OPENGL32
|
|
in vec3 intensity;
|
|
in vec3 view;
|
|
out vec4 fragColor;
|
|
#else
|
|
varying vec3 intensity;
|
|
varying vec3 view;
|
|
#endif
|
|
|
|
|
|
float ComputeMieScattering(in vec3 V, in vec3 sunDir)
|
|
{
|
|
const float g = 0.924;
|
|
// const float g = 0.7;
|
|
|
|
float cosTheta = dot(normalize(V), normalize(sunDir));
|
|
|
|
float num = 1.0 - g * g;
|
|
float den = (1.0 + g * g - 2.0 * g * cosTheta);
|
|
|
|
den = sqrt(den);
|
|
den = den * den * den;
|
|
|
|
float phase = (1.0 / (4.0 * 3.14159)) * (num / den);
|
|
|
|
return phase;
|
|
}
|
|
|
|
void main()
|
|
{
|
|
vec3 up = invBasis * vec3(0.0,0.0,1.0);
|
|
vec3 refractedLight = refract(-sunDir, up, 1.0/1.333);
|
|
|
|
float phase = ComputeMieScattering(-normalize(view), refractedLight);
|
|
|
|
vec3 finalIntensity = intensity * vec3(phase, phase, phase);
|
|
finalIntensity *= exp(-length(view) * (3.912 / visibility) * 8.0);
|
|
|
|
finalIntensity *= sunColor;
|
|
|
|
vec4 color = vec4(finalIntensity, 1.0);
|
|
|
|
color = clamp(color, 0.0, 1.0);
|
|
|
|
#ifdef OPENGL32
|
|
fragColor = color;
|
|
#else
|
|
gl_FragColor = color;
|
|
#endif
|
|
}
|