- uniform sampler2D Tex0, Tex1, Tex2;
- uniform vec2 screenSize;
- float random_size =64.0; // size of random texture
- uniform mat4 proM;
- uniform mat4 InvViewMat;
- uniform float zFar;
- uniform float SampleRad;
- uniform float Intensity;
- uniform float Scale;
- uniform float Bias;
- vec3 GetDFSpos(vec2 uv)
- {
- float fDepth = texture2D(Tex2, uv).x;
- vec4 vVertex;
- vVertex.xy = uv * 2.0 - 1.0 ;
- vVertex.z = fDepth * 2.0 - 1.0;
- vVertex.w = 1.0;
- vVertex = proM * vVertex;
- vVertex *= 1.0 / vVertex.w;
- return vVertex.xyz ;
- }
- float calcAO(vec2 uv, vec2 coord, vec3 pos, vec3 norm)
- {
- vec3 diff = GetDFSpos(uv + coord).xyz - pos;
- vec3 v = normalize(diff);
- float d = length(diff) * Scale;
- return max(0.0, dot(norm, v) - Bias) * (1.0 / (1.0 + d)) * Intensity;
- }
- void main(void)
- {
- vec2 rand;
- vec3 n;
- vec2 vec[4];
- vec[0] = vec2(1, 0);
- vec[1] = vec2(-1, 0);
- vec[2] = vec2(0, 1);
- vec[3] = vec2(0, -1);
- vec2 uv = gl_TexCoord[0].st;
- vec2 randomMap = texture2D(Tex0, vec2(screenSize) * uv / random_size).xy;
- vec3 normalMap = texture2D(Tex1, uv).xyz;
- vec3 pos = GetDFSpos(uv);
- n = (normalMap * 2.0 - 1.0);
- rand = normalize(randomMap * 2.0 - 1.0);
- float ao = 0.0;
- float rad = SampleRad / pos.z;
- int iterations = int(mix(4.0, 1.0, -pos.z / zFar));
- for (int i = 0; i < iterations; ++i) {
- vec2 coord1 = reflect(vec[i], rand) * rad;
- vec2 coord2 = vec2(coord1.x * 0.707 - coord1.y * 0.707, coord1.x * 0.707 + coord1.y * 0.707);
- ao += calcAO(uv, coord1 * 0.25, pos, n);
- ao += calcAO(uv, coord2 * 0.5, pos, n);
- ao += calcAO(uv, coord1 * 0.75, pos, n);
- ao += calcAO(uv, coord2, pos, n);
- }
- ao /= float(iterations) * 4.0;
- gl_FragColor = vec4(1.0-ao);
- }