import postprocess; import ambientocclusion; #pragma MSP stage(fragment) void main() { 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 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 += occ; count += 1.0; } } 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); }