ssaoFragment.fs 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. #version 430
  2. layout (binding = 0) uniform sampler2D worldPositionSamp;
  3. layout (binding = 1) uniform sampler2D worldNormalSamp;
  4. layout (binding = 2) uniform sampler2D worldColorSamp;
  5. layout (binding = 3) uniform sampler2D worldDepthSamp;
  6. layout (binding = 4) uniform sampler2D ssaoNoise;
  7. const int numberOfSamples = 32;
  8. const vec3 ssaoKernel[32] =
  9. {
  10. vec3( 0.001, 0.000, -0.000), vec3(-0.002, 0.002, -0.003), vec3( 0.004, -0.007, 0.002), vec3(-0.002, 0.012, 0.010),
  11. vec3(-0.012, 0.018, -0.011), vec3(-0.013, 0.023, -0.023), vec3(-0.005, -0.021, 0.043), vec3( 0.034, -0.039, 0.034),
  12. vec3(-0.063, -0.040, 0.027), vec3( 0.095, -0.025, -0.001), vec3( 0.048, -0.089, 0.062), vec3(-0.084, 0.041, -0.105),
  13. vec3(-0.148, -0.047, -0.056), vec3(-0.039, 0.026, -0.186), vec3(-0.161, 0.065, -0.135), vec3(-0.203, 0.123, -0.079),
  14. vec3( 0.216, 0.091, -0.157), vec3( 0.066, 0.305, -0.051), vec3(-0.084, -0.332, 0.083), vec3(-0.050, 0.351, -0.165),
  15. vec3(-0.330, 0.127, -0.245), vec3(-0.020, 0.319, 0.348), vec3(-0.396, 0.281, -0.178), vec3(-0.376, -0.413, -0.069),
  16. vec3( 0.510, 0.153, -0.298), vec3(-0.451, -0.476, -0.074), vec3(-0.596, -0.302, 0.245), vec3( 0.311, -0.490, -0.499),
  17. vec3(-0.439, 0.464, 0.517), vec3( 0.397, -0.557, 0.551), vec3( 0.632, -0.677, 0.151), vec3( 0.574, -0.246, 0.781)
  18. };
  19. uniform mat4 proj;
  20. uniform mat4 view;
  21. uniform int width;
  22. uniform int height;
  23. const float radius = 0.25;
  24. in vec2 varTex;
  25. out float color;
  26. void main()
  27. {
  28. vec3 fragPos = texture(worldPositionSamp, varTex).xyz;
  29. vec3 random = texture(ssaoNoise, varTex * vec2(width * 0.25, height * 0.25)).xyz * radius * 0.5;
  30. float occlusion = 0.0;
  31. for(int i = 0; i < numberOfSamples; i++)
  32. {
  33. vec4 projFragPos = proj * vec4(fragPos + ssaoKernel[i] * radius + random, 1.0);
  34. projFragPos.xyz /= projFragPos.w;
  35. projFragPos.xyz = projFragPos.xyz * 0.5 + 0.5;
  36. float depth1 = texture(worldDepthSamp, projFragPos.xy).x;
  37. float depth2 = projFragPos.z;
  38. float rangeCheck = float(abs(depth2 - depth1) < radius);
  39. occlusion += float(depth2 > depth1) * rangeCheck;
  40. }
  41. color = 1 - occlusion / numberOfSamples;
  42. }