1uniform sampler2D m_Texture;
2uniform sampler2D m_DepthTexture;
3uniform sampler2D m_SSAOMap;
4uniform vec2 g_Resolution;
5uniform bool m_UseOnlyAo;
6uniform bool m_UseAo;
7uniform float m_XScale;
8uniform float m_YScale;
9uniform vec2 m_FrustumNearFar;
10
11varying vec2 texCoord;
12
13vec4 getColor(vec4 color){
14
15    
16    #ifdef USE_ONLY_AO
17        return color;
18    #endif
19    #ifdef USE_AO
20        return texture2D(m_Texture,texCoord)* color;
21    #endif
22    
23    return texture2D(m_Texture,texCoord);
24
25}
26
27float readDepth(in vec2 uv){
28    float depthv =texture2D(m_DepthTexture,uv).r;
29    return (2.0 * m_FrustumNearFar.x) / (m_FrustumNearFar.y + m_FrustumNearFar.x - depthv* (m_FrustumNearFar.y-m_FrustumNearFar.x));
30}
31
32 const float epsilon = 0.005;
33
34
35/*
36    const int kernelSize=7;
37   
38    vec4 bilateralFilter() {
39        vec4 color = vec4(0.0);
40
41        vec2 sample;
42        float sum = 0.0;
43        float coefZ;
44        float Zp = readDepth(texCoord);
45
46        for(int i = -(kernelSize-1); i <= (kernelSize-1); i+=2) {
47            for(int j = -(kernelSize-1); j <= (kernelSize-1); j+=2) {
48                  sample = texCoord + vec2(i,j) / g_Resolution;           
49                float zTmp =readDepth(sample);
50                coefZ = 1.0 / (epsilon + abs(Zp - zTmp));               
51                sum += coefZ;
52
53                color += coefZ * texture2D(m_SSAOMap,sample);
54             
55            }
56        }
57
58        return color / sum;
59    }
60*/
61
62    vec4 convolutionFilter(){
63           vec4 sum = vec4(0.0);
64
65            float x = texCoord.x;
66            float y = texCoord.y;
67
68            float xScale = m_XScale;
69            float yScale = m_YScale;
70       
71            float zsum = 1.0;
72        float Zp =readDepth(texCoord);
73
74
75        vec2 sample = vec2(x - 2.0 * xScale, y - 2.0 * yScale);           
76        float zTmp =readDepth(sample);
77        float coefZ = 1.0 / (epsilon + abs(Zp - zTmp));               
78        zsum += coefZ;
79        sum += coefZ* texture2D( m_SSAOMap, sample);
80
81        sample = vec2(x - 0.0 * xScale, y - 2.0 * yScale);           
82        zTmp =readDepth(sample);
83        coefZ = 1.0 / (epsilon + abs(Zp - zTmp));               
84        zsum += coefZ;
85        sum += coefZ* texture2D( m_SSAOMap, sample);
86
87        sample = vec2(x + 2.0 * xScale, y - 2.0 * yScale);           
88        zTmp =readDepth(sample);
89        coefZ = 1.0 / (epsilon + abs(Zp - zTmp));               
90        zsum += coefZ;
91        sum += coefZ* texture2D( m_SSAOMap, sample);
92
93        sample = vec2(x - 1.0 * xScale, y - 1.0 * yScale);           
94        zTmp =readDepth(sample);
95        coefZ = 1.0 / (epsilon + abs(Zp - zTmp));               
96        zsum += coefZ;
97        sum += coefZ* texture2D( m_SSAOMap, sample);
98
99        sample = vec2(x + 1.0 * xScale, y - 1.0 * yScale);           
100        zTmp =readDepth(sample);
101        coefZ = 1.0 / (epsilon + abs(Zp - zTmp));               
102        zsum += coefZ;
103        sum += coefZ* texture2D( m_SSAOMap, sample);
104  
105        sample = vec2(x - 2.0 * xScale, y - 0.0 * yScale);           
106        zTmp =readDepth(sample);
107        coefZ = 1.0 / (epsilon + abs(Zp - zTmp));               
108        zsum += coefZ;
109        sum += coefZ* texture2D( m_SSAOMap, sample);
110
111        sample = vec2(x + 2.0 * xScale, y - 0.0 * yScale);           
112        zTmp =readDepth(sample);
113        coefZ = 1.0 / (epsilon + abs(Zp - zTmp));               
114        zsum += coefZ;
115        sum += coefZ* texture2D( m_SSAOMap, sample);
116
117        sample = vec2(x - 1.0 * xScale, y + 1.0 * yScale);           
118        zTmp =readDepth(sample);
119        coefZ = 1.0 / (epsilon + abs(Zp - zTmp));               
120        zsum += coefZ;
121        sum += coefZ* texture2D( m_SSAOMap, sample);
122   
123        sample = vec2(x + 1.0 * xScale, y + 1.0 * yScale);           
124        zTmp =readDepth(sample);
125        coefZ = 1.0 / (epsilon + abs(Zp - zTmp));               
126        zsum += coefZ;
127        sum += coefZ* texture2D( m_SSAOMap, sample);
128
129        sample = vec2(x - 2.0 * xScale, y + 2.0 * yScale);           
130        zTmp =readDepth(sample);
131        coefZ = 1.0 / (epsilon + abs(Zp - zTmp));               
132        zsum += coefZ;
133        sum += coefZ* texture2D( m_SSAOMap, sample);
134  
135        sample = vec2(x - 0.0 * xScale, y + 2.0 * yScale);           
136        zTmp =readDepth(sample);
137        coefZ = 1.0 / (epsilon + abs(Zp - zTmp));               
138        zsum += coefZ;
139        sum += coefZ* texture2D( m_SSAOMap, sample);
140
141        sample = vec2(x + 2.0 * xScale, y + 2.0 * yScale);           
142        zTmp =readDepth(sample);
143        coefZ = 1.0 / (epsilon + abs(Zp - zTmp));               
144        zsum += coefZ;
145        sum += coefZ* texture2D( m_SSAOMap, sample);
146
147
148        return  sum / zsum;
149    }
150
151
152    void main(){
153        //  float depth =texture2D(m_DepthTexture,uv).r;
154
155       gl_FragColor=getColor(convolutionFilter());
156      // gl_FragColor=getColor(bilateralFilter());
157      //  gl_FragColor=texture2D(m_SSAOMap,texCoord);
158
159    }