Bloom.ankiprog 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. // Copyright (C) 2009-2020, Panagiotis Christopoulos Charitos and contributors.
  2. // All rights reserved.
  3. // Code licensed under the BSD License.
  4. // http://www.anki3d.org/LICENSE
  5. ANKI_SPECIALIZATION_CONSTANT_UVEC2(FB_SIZE, 0, UVec2(1));
  6. const UVec2 WORKGROUP_SIZE = UVec2(16, 16);
  7. #pragma anki start comp
  8. #include <shaders/Common.glsl>
  9. #include <shaders/Tonemapping.glsl>
  10. layout(local_size_x = WORKGROUP_SIZE.x, local_size_y = WORKGROUP_SIZE.y, local_size_z = 1) in;
  11. // Vars
  12. layout(set = 0, binding = 0) uniform sampler u_linearAnyClampSampler;
  13. layout(set = 0, binding = 1) uniform texture2D u_tex; ///< Its the IS RT
  14. layout(push_constant) uniform pc_
  15. {
  16. Vec4 u_thresholdScalePad2;
  17. };
  18. layout(set = 0, binding = 2, std140) readonly buffer ss0_
  19. {
  20. Vec4 u_averageLuminancePad3;
  21. };
  22. layout(set = 0, binding = 3) writeonly uniform image2D out_img;
  23. void main()
  24. {
  25. if((FB_SIZE.x % WORKGROUP_SIZE.x) != 0u || (FB_SIZE.y % WORKGROUP_SIZE.y) != 0u) // This check is free
  26. {
  27. if(gl_GlobalInvocationID.x >= FB_SIZE.x || gl_GlobalInvocationID.y >= FB_SIZE.y)
  28. {
  29. return;
  30. }
  31. }
  32. const Vec2 uv = (Vec2(gl_GlobalInvocationID.xy) + 0.5) / Vec2(FB_SIZE);
  33. Vec3 color = textureLod(u_tex, u_linearAnyClampSampler, uv, 0.0).rgb;
  34. color += textureLodOffset(sampler2D(u_tex, u_linearAnyClampSampler), uv, 0.0, ivec2(+1, +1)).rgb;
  35. color += textureLodOffset(sampler2D(u_tex, u_linearAnyClampSampler), uv, 0.0, ivec2(-1, -1)).rgb;
  36. color += textureLodOffset(sampler2D(u_tex, u_linearAnyClampSampler), uv, 0.0, ivec2(-1, +1)).rgb;
  37. color += textureLodOffset(sampler2D(u_tex, u_linearAnyClampSampler), uv, 0.0, ivec2(+1, -1)).rgb;
  38. color *= (1.0 / 5.0);
  39. color = tonemap(color, u_averageLuminancePad3.x, u_thresholdScalePad2.x) * u_thresholdScalePad2.y;
  40. imageStore(out_img, IVec2(gl_GlobalInvocationID.xy), Vec4(color, 0.0));
  41. }
  42. #pragma anki end