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