1uniform sampler2D dtex;
2uniform float density;
3uniform vec3 fogcol;
4
5flat in vec3 center;
6flat in float energy;
7flat in vec3 col;
8flat in float radius;
9
10out vec4 Fog;
11
12#stk_include "utils/getPosFromUVDepth.frag"
13
14void main()
15{
16    vec4 pseudocenter = u_view_matrix * vec4(center.xyz, 1.0);
17    pseudocenter /= pseudocenter.w;
18    vec3 light_pos = pseudocenter.xyz;
19    vec3 light_col = col.xyz;
20
21    // Compute pixel position
22    vec2 texc = 2. * gl_FragCoord.xy / u_screen;
23    float z = texture(dtex, texc).x;
24    vec4 pixelpos = getPosFromUVDepth(vec3(texc, z), u_inverse_projection_matrix);
25    vec3 eyedir = -normalize(pixelpos.xyz);
26
27    vec3 farthestpoint = - eyedir * (min(dot(-eyedir, light_pos) + radius, length(pixelpos.xyz)));
28    vec3 closestpoint = - eyedir * (dot(-eyedir, light_pos) - radius);
29    if (closestpoint.z < 1.) closestpoint = vec3(0.);
30
31    float stepsize = length(farthestpoint - closestpoint) / 16.;
32    vec3 fog = vec3(0.);
33    vec3 xpos = farthestpoint;
34    vec3 fog_factor = light_col * density * stepsize * energy * 20.;
35    vec3 xpos_step = eyedir * stepsize;
36
37    for (int i = 0; i < 16; i++)
38    {
39        float d = distance(light_pos, xpos);
40        float l = (16. - float(i)) * stepsize;
41        fog += fog_factor / (1. + d * d) * max((radius - d) / radius, 0.) * exp(- density * d) * exp(- density * l);
42        xpos += xpos_step;
43    }
44
45    Fog = vec4(fogcol * fog, 0.);
46}
47