Home | History | Annotate | Download | only in SSAO
      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     }