1 uniform sampler2D m_Texture; 2 uniform sampler2D m_DepthTexture; 3 uniform sampler2D m_SSAOMap; 4 uniform vec2 g_Resolution; 5 uniform bool m_UseOnlyAo; 6 uniform bool m_UseAo; 7 uniform float m_XScale; 8 uniform float m_YScale; 9 uniform vec2 m_FrustumNearFar; 10 11 varying vec2 texCoord; 12 13 vec4 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 27 float 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 }