]> git.tdb.fi Git - libs/gl.git/blobdiff - shaderlib/ambientocclusion_combine.glsl
Set both min and mag filters when exporting textures
[libs/gl.git] / shaderlib / ambientocclusion_combine.glsl
index 572ba2f14bcf73858c3b500d992ffebafa14d3db..c1e7f27270a1388703ac8cc744901278180f2ac3 100644 (file)
@@ -1,23 +1,29 @@
 import postprocess;
 import ambientocclusion;
 
-////// fragment
+#pragma MSP stage(fragment)
 void main()
 {
-       float sample = depth_ratio.x/(texture(depth, texcoord).r-depth_ratio.y);
-       float sum = 1.0;
-       float count = 1.0;
-       for(int i=0; i<=3; ++i)
-               for(int j=0; j<=3; ++j)
+       vec3 center = unproject(vec3(vertex.xy, texture(depth, texcoord).r));
+       vec2 tex_scale = 1.0/vec2(textureSize(occlusion, 0));
+       float sum = 0.0;
+       float count = 0.0;
+       for(int i=0; i<4; ++i)
+               for(int j=0; j<4; ++j)
                {
-                       vec2 offs = vec2(float(i)-1.5, float(j)-1.5)/screen_size;
-                       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)
+                       vec2 offset = vec2(float(i), float(j))-1.5;
+                       vec2 sample_coord = texcoord+offset*tex_scale;
+                       float occ = texture(occlusion, sample_coord).r;
+                       float sample = texture(depth, sample_coord).r;
+                       float z_range = occlusion_radius*length(offset)*edge_depth_threshold;
+                       float min_depth = project(vec3(center.xy, center.z+z_range)).z;
+                       float max_depth = project(vec3(center.xy, center.z-z_range)).z;
+                       if(sample>=min_depth && sample<=max_depth)
                        {
-                               sum += texture(occlusion, texcoord+offs).r;
+                               sum += occ;
                                count += 1.0;
                        }
                }
-       frag_color = texture(source, texcoord)*sum/count;
+       vec4 src_color = texture(source, texcoord);
+       frag_color = vec4(src_color.rgb*mix(1.0, min(sum*2.0/count, 1.0), darkness), src_color.a);
 }