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