]> git.tdb.fi Git - libs/gl.git/blobdiff - builtin_data/_ambientocclusion_occlude.glsl
Take ambient occlusion samples only from the forward hemisphere
[libs/gl.git] / builtin_data / _ambientocclusion_occlude.glsl
index 62fd153b712589e205f73738887a7db4e05f05c9..7ff813e8d27a1c175d8716a0c20fa7e0a4aabbee 100644 (file)
@@ -5,9 +5,21 @@ import _ambientocclusion;
 layout(location=0) out float frag_out;
 void main()
 {
+       vec3 tex_scale = vec3(1.0/vec2(textureSize(depth, 0)), 0.0);
+
+       vec3 center = get_fragment_position(texcoord);
+       vec3 left = get_fragment_position(texcoord-tex_scale.xz);
+       vec3 right = get_fragment_position(texcoord+tex_scale.xz);
+       vec3 bottom = get_fragment_position(texcoord-tex_scale.zy);
+       vec3 top = get_fragment_position(texcoord+tex_scale.zy);
+
+       vec3 normal = normalize(cross(get_slope(left, center, right), get_slope(bottom, center, top)));
+       vec3 tangent = (abs(normal.x)>abs(normal.y) ? vec3(-normal.z, 0.0, normal.x) : vec3(0.0, -normal.z, normal.y));
+       vec3 binormal = cross(normal, tangent);
+
        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));
+       mat3 transform = mat3(tangent, binormal, normal)*mat3(rv.xy, 0.0, rv.zx, 0.0, 0.0, 0.0, 1.0)*occlusion_radius;
+
        float min_depth = project(vec3(center.xy, center.z+occlusion_radius)).z;
        float occlusion_sum = 0.0;
        float count = 0.0;