X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=builtin_data%2F_ambientocclusion_occlude.glsl;h=e1900323a6cc9a66432f4d70e29312dcaa5a92c0;hp=62fd153b712589e205f73738887a7db4e05f05c9;hb=HEAD;hpb=1e3b07299f798983ee0b861121a65ca2e8c8830a diff --git a/builtin_data/_ambientocclusion_occlude.glsl b/builtin_data/_ambientocclusion_occlude.glsl index 62fd153b..7ff813e8 100644 --- a/builtin_data/_ambientocclusion_occlude.glsl +++ b/builtin_data/_ambientocclusion_occlude.glsl @@ -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;