]> git.tdb.fi Git - r2c2.git/blob - data/r2c2/sky.shader
66dd8ec0e9e308a2d4ec805443e4936e961175f5
[r2c2.git] / data / r2c2 / sky.shader
1 vertex_shader "
2         varying vec3 eye_look_dir;
3         void main()
4         {
5                 vec4 eye_pos = vec4(mat3(gl_ModelViewMatrix)*gl_Vertex.xyz, 1);
6                 gl_Position = gl_ProjectionMatrix*eye_pos;
7                 eye_look_dir = eye_pos.xyz;
8         }";
9
10 fragment_shader "
11         uniform vec3 eye_sky_dir;
12         uniform vec3 wavelengths;
13         uniform float scatter_constant;
14         uniform float sun_intensity;
15         uniform float sun_size;
16         varying vec3 eye_look_dir;
17         float thickness(float c, float r)
18         {
19                 float rc = r*c;
20                 return sqrt(2.0*r+1.0+rc*rc)-rc;
21         }
22         float srgb(float c)
23         {
24                 if(c<0.0031308)
25                         return 12.92*c;
26                 else
27                         return (1.055)*pow(c, 1.0/2.4)-0.055;
28         }
29         void main()
30         {
31                 vec3 n_eye_look_dir = normalize(eye_look_dir);
32                 vec3 n_eye_sun_dir = normalize(gl_LightSource[0].position.xyz);
33
34                 if(dot(n_eye_look_dir, eye_sky_dir)>0)
35                 {
36                         float look_scale = thickness(dot(n_eye_look_dir, eye_sky_dir), 635.0);
37                         float sun_scale = thickness(dot(n_eye_sun_dir, eye_sky_dir), 635.0);
38                         float c = dot(n_eye_look_dir, n_eye_sun_dir);
39                         float scatter_strength = (1.0+c*c)/2.0;
40                         vec3 scatter_factor = scatter_constant/pow(wavelengths, vec3(4.0));
41
42                         vec3 color;
43                         float scale_ratio = look_scale/sun_scale;
44                         if(scale_ratio>0.999 && scale_ratio<1.001)
45                                 color = sun_intensity*scatter_strength*scatter_factor*sun_scale*exp(-scatter_factor*sun_scale);
46                         else
47                                 color = sun_intensity*scatter_strength*(exp(-scatter_factor*sun_scale)-exp(-scatter_factor*look_scale))/(1.0-sun_scale/look_scale);
48                         if(dot(n_eye_look_dir, n_eye_sun_dir)>cos(sun_size))
49                                 color += exp(-scatter_factor*look_scale)*sun_intensity;
50                         gl_FragColor = vec4(srgb(color.r), srgb(color.g), srgb(color.b), 1.0);
51                 }
52                 else
53                         gl_FragColor = vec4(vec3(0.0), 1.0);
54         }";