1#import "Common/ShaderLib/MultiSample.glsllib" 2 3uniform COLORTEXTURE m_Texture; 4uniform DEPTHTEXTURE m_DepthTexture; 5 6uniform vec2 g_Resolution; 7uniform vec2 m_FrustumNearFar; 8uniform sampler2D m_Normals; 9uniform sampler2D m_RandomMap; 10uniform vec3 m_FrustumCorner; 11uniform float m_SampleRadius; 12uniform float m_Intensity; 13uniform float m_Scale; 14uniform float m_Bias; 15uniform vec2[4] m_Samples; 16 17in vec2 texCoord; 18 19float depthv; 20 21vec3 getPosition(in vec2 uv){ 22 //Reconstruction from depth 23 depthv =getDepth(m_DepthTexture,uv).r; 24 float depth= (2.0 * m_FrustumNearFar.x) / (m_FrustumNearFar.y + m_FrustumNearFar.x - depthv* (m_FrustumNearFar.y-m_FrustumNearFar.x)); 25 26 //one frustum corner method 27 float x = mix(-m_FrustumCorner.x, m_FrustumCorner.x, uv.x); 28 float y = mix(-m_FrustumCorner.y, m_FrustumCorner.y, uv.y); 29 30 return depth* vec3(x, y, m_FrustumCorner.z); 31} 32 33vec3 getNormal(in vec2 uv){ 34 return normalize(texture2D(m_Normals, uv).xyz * 2.0 - 1.0); 35} 36 37vec2 getRandom(in vec2 uv){ 38 //float rand=(fract(uv.x*(g_Resolution.x/2.0))*0.25)+(fract(uv.y*(g_Resolution.y/2.0))*0.5); 39 vec4 rand=texture2D(m_RandomMap,g_Resolution * uv / 128.0 * 3.0)*2.0 -1.0; 40 41 return normalize(rand.xy); 42} 43 44float doAmbientOcclusion(in vec2 tc, in vec3 pos, in vec3 norm){ 45 vec3 diff = getPosition(tc)- pos; 46 vec3 v = normalize(diff); 47 float d = length(diff) * m_Scale; 48 49 return max(0.0, dot(norm, v) - m_Bias) * ( 1.0/(1.0 + d) ) * m_Intensity; 50} 51 52 53vec2 reflection(in vec2 v1,in vec2 v2){ 54 vec2 result= 2.0 * dot(v2, v1) * v2; 55 result=v1-result; 56 return result; 57} 58 59 60//const vec2 vec[4] = vec2[4](vec2(1.0,0.0), vec2(-1.0,0.0), vec2(0.0,1.0), vec2(0.0,-1.0)); 61void main(){ 62 63 float result; 64 65 //vec2 vec[4] = { vec2(1.0, 0.0), vec2(-1.0, 0.0), vec2(0.0, 1.0), vec2(0.0, -1.0) }; 66 vec3 position = getPosition(texCoord); 67 //optimization, do not calculate AO if depth is 1 68 if(depthv==1.0){ 69 gl_FragColor=vec4(1.0); 70 return; 71 } 72 vec3 normal = getNormal(texCoord); 73 vec2 rand = getRandom(texCoord); 74 75 float ao = 0.0; 76 float rad =m_SampleRadius / position.z; 77 78 79 int iterations = 4; 80 for (int j = 0; j < iterations; ++j){ 81 vec2 coord1 = reflection(vec2(m_Samples[j]), rand) * vec2(rad,rad); 82 vec2 coord2 = vec2(coord1.x* 0.707 - coord1.y* 0.707, coord1.x* 0.707 + coord1.y* 0.707) ; 83 84 ao += doAmbientOcclusion(texCoord + coord1.xy * 0.25, position, normal); 85 ao += doAmbientOcclusion(texCoord + coord2 * 0.50, position, normal); 86 ao += doAmbientOcclusion(texCoord + coord1.xy * 0.75, position, normal); 87 ao += doAmbientOcclusion(texCoord + coord2 * 1.00, position, normal); 88 89 } 90 ao /= float(iterations) * 4.0; 91 result = 1.0-ao; 92 93 gl_FragColor=vec4(result,result,result, 1.0); 94//gl_FragColor=vec4(depthv,depthv,depthv, 1.0); 95 96}