varying vec3 eye_look_dir;
void main()
{
- vec4 eye_pos = vec4(mat3(gl_ModelViewMatrix)*gl_Vertex.xyz, 1);
+ vec4 eye_pos = vec4((gl_ModelViewMatrix*vec4(gl_Vertex.xyz, 0.0)).xyz, 1.0);
gl_Position = gl_ProjectionMatrix*eye_pos;
eye_look_dir = eye_pos.xyz;
}";
uniform float scatter_constant;
uniform float sun_intensity;
uniform float sun_size;
+ uniform bool srgb_output;
varying vec3 eye_look_dir;
float thickness(float c, float r)
{
if(c<0.0031308)
return 12.92*c;
else
- return (1.055)*pow(c, 1.0/2.4)-0.055;
+ return 1.055*pow(c, 1.0/2.4)-0.055;
}
void main()
{
vec3 n_eye_look_dir = normalize(eye_look_dir);
vec3 n_eye_sun_dir = normalize(gl_LightSource[0].position.xyz);
- if(dot(n_eye_look_dir, eye_sky_dir)>0)
+ if(dot(n_eye_look_dir, eye_sky_dir)>0.0)
{
float look_scale = thickness(dot(n_eye_look_dir, eye_sky_dir), 635.0);
float sun_scale = thickness(dot(n_eye_sun_dir, eye_sky_dir), 635.0);
color = sun_intensity*scatter_strength*(exp(-scatter_factor*sun_scale)-exp(-scatter_factor*look_scale))/(1.0-sun_scale/look_scale);
if(dot(n_eye_look_dir, n_eye_sun_dir)>cos(sun_size))
color += exp(-scatter_factor*look_scale)*sun_intensity;
- gl_FragColor = vec4(srgb(color.r), srgb(color.g), srgb(color.b), 1.0);
+ if(srgb_output)
+ gl_FragColor = vec4(srgb(color.r), srgb(color.g), srgb(color.b), 1.0);
+ else
+ gl_FragColor = vec4(color, 1.0);
}
else
gl_FragColor = vec4(vec3(0.0), 1.0);