]> git.tdb.fi Git - libs/gl.git/blobdiff - shaderlib/ambientocclusion_occlude.glsl
Refactor the interface of SL::Compiler
[libs/gl.git] / shaderlib / ambientocclusion_occlude.glsl
index f9b755c9c7b71d0667dae0c940cd275b87c69ad0..2a10bde34613cb9cd933c2caa437c6cc781ff162 100644 (file)
@@ -1,23 +1,25 @@
 import postprocess;
 import ambientocclusion;
 
-////// fragment
+#pragma MSP stage(fragment)
 void main()
 {
-       mat2 transform = mat2(texture(rotate, texcoord*screen_size/4.0)*2.0-1.0)
-               *mat2(screen_size.y/screen_size.x, 0.0, 0.0, 1.0)*3.0/screen_size.y;
-       float sample = depth_ratio.x/(texture(depth, texcoord).r-depth_ratio.y);
-       float sum = 0.0;
-       for(int i=0; i<=3; ++i)
-               for(int j=0; j<=3; ++j)
+       vec4 rv = texture(rotate, gl_FragCoord.xy/4.0)*2.0-1.0;
+       mat3 transform = mat3(rv.xy, 0.0, rv.zx, 0.0, 0.0, 0.0, rv.w)*occlusion_radius;
+       vec3 center = unproject(vec3(vertex.xy, texture(depth, texcoord).r));
+       float min_depth = project(vec3(center.xy, center.z+occlusion_radius)).z;
+       float occlusion_sum = 0.0;
+       float count = 0.0;
+       for(int i=0; i<n_samples; ++i)
+       {
+               vec3 psp = project(center+transform*sample_points[i]);
+               float sample = texture(depth, psp.xy*0.5+0.5).r;
+               if(sample>=min_depth)
                {
-                       vec2 offs = transform*vec2(float(i)-1.5, float(j)-1.5);
-                       float dxy = length(offs)*-sample;
-                       float dz = depth_ratio.x/(texture(depth, texcoord+offs).r-depth_ratio.y)-sample;
-                       if(abs(dz)<3.0*dxy)
-                               sum += atan(dz/dxy)/1.570796;
-                       else if(dz<0.0)
-                               sum -= 0.8;
+                       if(sample<psp.z)
+                               occlusion_sum += 1.0;
+                       count += 1.0;
                }
-       frag_color = vec4(min(1.0-sum*darkness/16.0, 1.0), 0.0, 0.0, 1.0);
+       }
+       frag_color = vec4(1.0-occlusion_sum/count, 0.0, 0.0, 1.0);
 }