2
0

blur_raster.glsl 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. /* clang-format off */
  2. #[vertex]
  3. #version 450
  4. #VERSION_DEFINES
  5. #include "blur_raster_inc.glsl"
  6. layout(location = 0) out vec2 uv_interp;
  7. /* clang-format on */
  8. void main() {
  9. vec2 base_arr[4] = vec2[](vec2(0.0, 0.0), vec2(0.0, 1.0), vec2(1.0, 1.0), vec2(1.0, 0.0));
  10. uv_interp = base_arr[gl_VertexIndex];
  11. gl_Position = vec4(uv_interp * 2.0 - 1.0, 0.0, 1.0);
  12. }
  13. /* clang-format off */
  14. #[fragment]
  15. #version 450
  16. #VERSION_DEFINES
  17. #include "blur_raster_inc.glsl"
  18. layout(location = 0) in vec2 uv_interp;
  19. /* clang-format on */
  20. layout(set = 0, binding = 0) uniform sampler2D source_color;
  21. #ifdef GLOW_USE_AUTO_EXPOSURE
  22. layout(set = 1, binding = 0) uniform sampler2D source_auto_exposure;
  23. #endif
  24. layout(location = 0) out vec4 frag_color;
  25. void main() {
  26. // We do not apply our color scale for our mobile renderer here, we'll leave our colors at half brightness and apply scale in the tonemap raster.
  27. #ifdef MODE_MIPMAP
  28. vec2 pix_size = blur.pixel_size;
  29. vec4 color = texture(source_color, uv_interp + vec2(-0.5, -0.5) * pix_size);
  30. color += texture(source_color, uv_interp + vec2(0.5, -0.5) * pix_size);
  31. color += texture(source_color, uv_interp + vec2(0.5, 0.5) * pix_size);
  32. color += texture(source_color, uv_interp + vec2(-0.5, 0.5) * pix_size);
  33. frag_color = color / 4.0;
  34. #endif
  35. #ifdef MODE_GAUSSIAN_BLUR
  36. //Simpler blur uses SIGMA2 for the gaussian kernel for a stronger effect
  37. if (bool(blur.flags & FLAG_HORIZONTAL)) {
  38. vec2 pix_size = blur.pixel_size;
  39. pix_size *= 0.5; //reading from larger buffer, so use more samples
  40. vec4 color = texture(source_color, uv_interp + vec2(0.0, 0.0) * pix_size) * 0.214607;
  41. color += texture(source_color, uv_interp + vec2(1.0, 0.0) * pix_size) * 0.189879;
  42. color += texture(source_color, uv_interp + vec2(2.0, 0.0) * pix_size) * 0.131514;
  43. color += texture(source_color, uv_interp + vec2(3.0, 0.0) * pix_size) * 0.071303;
  44. color += texture(source_color, uv_interp + vec2(-1.0, 0.0) * pix_size) * 0.189879;
  45. color += texture(source_color, uv_interp + vec2(-2.0, 0.0) * pix_size) * 0.131514;
  46. color += texture(source_color, uv_interp + vec2(-3.0, 0.0) * pix_size) * 0.071303;
  47. frag_color = color;
  48. } else {
  49. vec2 pix_size = blur.pixel_size;
  50. vec4 color = texture(source_color, uv_interp + vec2(0.0, 0.0) * pix_size) * 0.38774;
  51. color += texture(source_color, uv_interp + vec2(0.0, 1.0) * pix_size) * 0.24477;
  52. color += texture(source_color, uv_interp + vec2(0.0, 2.0) * pix_size) * 0.06136;
  53. color += texture(source_color, uv_interp + vec2(0.0, -1.0) * pix_size) * 0.24477;
  54. color += texture(source_color, uv_interp + vec2(0.0, -2.0) * pix_size) * 0.06136;
  55. frag_color = color;
  56. }
  57. #endif
  58. #ifdef MODE_GAUSSIAN_GLOW
  59. //Glow uses larger sigma 1 for a more rounded blur effect
  60. #define GLOW_ADD(m_ofs, m_mult) \
  61. { \
  62. vec2 ofs = uv_interp + m_ofs * pix_size; \
  63. vec4 c = texture(source_color, ofs) * m_mult; \
  64. if (any(lessThan(ofs, vec2(0.0))) || any(greaterThan(ofs, vec2(1.0)))) { \
  65. c *= 0.0; \
  66. } \
  67. color += c; \
  68. }
  69. if (bool(blur.flags & FLAG_HORIZONTAL)) {
  70. vec2 pix_size = blur.pixel_size;
  71. pix_size *= 0.5; //reading from larger buffer, so use more samples
  72. vec4 color = texture(source_color, uv_interp + vec2(0.0, 0.0) * pix_size) * 0.174938;
  73. GLOW_ADD(vec2(1.0, 0.0), 0.165569);
  74. GLOW_ADD(vec2(2.0, 0.0), 0.140367);
  75. GLOW_ADD(vec2(3.0, 0.0), 0.106595);
  76. GLOW_ADD(vec2(-1.0, 0.0), 0.165569);
  77. GLOW_ADD(vec2(-2.0, 0.0), 0.140367);
  78. GLOW_ADD(vec2(-3.0, 0.0), 0.106595);
  79. color *= blur.glow_strength;
  80. frag_color = color;
  81. } else {
  82. vec2 pix_size = blur.pixel_size;
  83. vec4 color = texture(source_color, uv_interp + vec2(0.0, 0.0) * pix_size) * 0.288713;
  84. GLOW_ADD(vec2(0.0, 1.0), 0.233062);
  85. GLOW_ADD(vec2(0.0, 2.0), 0.122581);
  86. GLOW_ADD(vec2(0.0, -1.0), 0.233062);
  87. GLOW_ADD(vec2(0.0, -2.0), 0.122581);
  88. color *= blur.glow_strength;
  89. frag_color = color;
  90. }
  91. #undef GLOW_ADD
  92. if (bool(blur.flags & FLAG_GLOW_FIRST_PASS)) {
  93. #ifdef GLOW_USE_AUTO_EXPOSURE
  94. frag_color /= texelFetch(source_auto_exposure, ivec2(0, 0), 0).r / blur.glow_auto_exposure_grey;
  95. #endif
  96. frag_color *= blur.glow_exposure;
  97. float luminance = max(frag_color.r, max(frag_color.g, frag_color.b));
  98. float feedback = max(smoothstep(blur.glow_hdr_threshold, blur.glow_hdr_threshold + blur.glow_hdr_scale, luminance), blur.glow_bloom);
  99. frag_color = min(frag_color * feedback, vec4(blur.glow_luminance_cap));
  100. }
  101. #endif
  102. #ifdef MODE_COPY
  103. vec4 color = textureLod(source_color, uv_interp, 0.0);
  104. frag_color = color;
  105. #endif
  106. }