Advertisement
Guest User

Blackops - Better SSAO

a guest
Feb 5th, 2011
12,146
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.15 KB | None | 0 0
  1. uniform sampler2D sampler0;
  2. uniform sampler2D sampler1;
  3. uniform sampler2D sampler2;
  4.  
  5. uniform float displayWidth;
  6. uniform float displayHeight;
  7. uniform float aspectRatio;
  8. uniform float near;
  9. uniform float far;
  10.  
  11. float readDepth( vec2 coord );
  12.  
  13. void main(void)
  14. {  
  15.    float depth = readDepth( gl_TexCoord[0].st );
  16.    float d;
  17.    
  18.    float pw = 1.0 / displayWidth;
  19.    float ph = 1.0 / displayHeight;
  20.  
  21.    float aoCap = 1.0;
  22.    float ao = 0.0;
  23.    float aoMultiplier=250.0;
  24.    float depthTolerance = 0.01;
  25.    
  26.    d=readDepth( vec2(gl_TexCoord[0].x+pw,gl_TexCoord[0].y+ph));
  27.    ao+=min(aoCap,max(0.0,depth-d-depthTolerance) * aoMultiplier);
  28.  
  29.    d=readDepth( vec2(gl_TexCoord[0].x-pw,gl_TexCoord[0].y+ph));
  30.    ao+=min(aoCap,max(0.0,depth-d-depthTolerance) * aoMultiplier);
  31.  
  32.    d=readDepth( vec2(gl_TexCoord[0].x+pw,gl_TexCoord[0].y-ph));
  33.    ao+=min(aoCap,max(0.0,depth-d-depthTolerance) * aoMultiplier);
  34.  
  35.    d=readDepth( vec2(gl_TexCoord[0].x-pw,gl_TexCoord[0].y-ph));
  36.    ao+=min(aoCap,max(0.0,depth-d-depthTolerance) * aoMultiplier);
  37.    
  38.    pw*=2.0;
  39.    ph*=2.0;
  40.    aoMultiplier/=2.0;
  41.  
  42.    d=readDepth( vec2(gl_TexCoord[0].x+pw,gl_TexCoord[0].y+ph));
  43.    ao+=min(aoCap,max(0.0,depth-d-depthTolerance) * aoMultiplier);
  44.  
  45.    d=readDepth( vec2(gl_TexCoord[0].x-pw,gl_TexCoord[0].y+ph));
  46.    ao+=min(aoCap,max(0.0,depth-d-depthTolerance) * aoMultiplier);
  47.  
  48.    d=readDepth( vec2(gl_TexCoord[0].x+pw,gl_TexCoord[0].y-ph));
  49.    ao+=min(aoCap,max(0.0,depth-d-depthTolerance) * aoMultiplier);
  50.  
  51.    d=readDepth( vec2(gl_TexCoord[0].x-pw,gl_TexCoord[0].y-ph));
  52.    ao+=min(aoCap,max(0.0,depth-d-depthTolerance) * aoMultiplier);
  53.  
  54.    pw*=2.0;
  55.    ph*=2.0;
  56.    aoMultiplier/=2.0;
  57.  
  58.    d=readDepth( vec2(gl_TexCoord[0].x+pw,gl_TexCoord[0].y+ph));
  59.    ao+=min(aoCap,max(0.0,depth-d-depthTolerance) * aoMultiplier);
  60.  
  61.    d=readDepth( vec2(gl_TexCoord[0].x-pw,gl_TexCoord[0].y+ph));
  62.    ao+=min(aoCap,max(0.0,depth-d-depthTolerance) * aoMultiplier);
  63.  
  64.    d=readDepth( vec2(gl_TexCoord[0].x+pw,gl_TexCoord[0].y-ph));
  65.    ao+=min(aoCap,max(0.0,depth-d-depthTolerance) * aoMultiplier);
  66.  
  67.    d=readDepth( vec2(gl_TexCoord[0].x-pw,gl_TexCoord[0].y-ph));
  68.    ao+=min(aoCap,max(0.0,depth-d-depthTolerance) * aoMultiplier);
  69.  
  70.    pw*=2.0;
  71.    ph*=2.0;
  72.    aoMultiplier/=2.0;
  73.  
  74.    d=readDepth( vec2(gl_TexCoord[0].x+pw,gl_TexCoord[0].y+ph));
  75.    ao+=min(aoCap,max(0.0,depth-d-depthTolerance) * aoMultiplier);
  76.  
  77.    d=readDepth( vec2(gl_TexCoord[0].x-pw,gl_TexCoord[0].y+ph));
  78.    ao+=min(aoCap,max(0.0,depth-d-depthTolerance) * aoMultiplier);
  79.  
  80.    d=readDepth( vec2(gl_TexCoord[0].x+pw,gl_TexCoord[0].y-ph));
  81.    ao+=min(aoCap,max(0.0,depth-d-depthTolerance) * aoMultiplier);
  82.  
  83.    d=readDepth( vec2(gl_TexCoord[0].x-pw,gl_TexCoord[0].y-ph));
  84.    ao+=min(aoCap,max(0.0,depth-d-depthTolerance) * aoMultiplier);
  85.  
  86.    ao/=16.0;
  87.    
  88.    gl_FragColor = vec4(1.0-ao) * texture2D( sampler0, gl_TexCoord[0].st );
  89. }
  90.  
  91. float readDepth( vec2 coord ) {
  92.    float depth = texture2D( sampler1, coord ).x;
  93.    float depth2 = texture2D( sampler2, coord ).x;
  94.    if ( depth2 < 1.0 ) {
  95.       depth = depth2;
  96.    }
  97.     depth = 2.0 * near * far / ( far + near - ( 2.0 * depth - 1.0 ) * ( far - near ) );
  98.     return depth;
  99. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement