X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=shaderlib%2Fambientocclusion_combine.glsl;h=1e8bd821d48d1fa4b2ad749dd19bd4ad0b01d6ec;hp=572ba2f14bcf73858c3b500d992ffebafa14d3db;hb=ff85f90d33023d908c534b0bf5d9a65e9fc2cce2;hpb=e55f79ccb21e8c1be3d86f127e3ec1583e58ce92 diff --git a/shaderlib/ambientocclusion_combine.glsl b/shaderlib/ambientocclusion_combine.glsl index 572ba2f1..1e8bd821 100644 --- a/shaderlib/ambientocclusion_combine.glsl +++ b/shaderlib/ambientocclusion_combine.glsl @@ -1,23 +1,27 @@ 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)); + float min_depth = project(vec3(center.xy, center.z+occlusion_radius*0.1)).z; + float max_depth = project(vec3(center.xy, center.z-occlusion_radius*0.1)).z; + 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)-1.5, float(j)-1.5)*tex_scale; + float occ = texture(occlusion, texcoord+offset).r; + float sample = texture(depth, texcoord+offset).r; + 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); }