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