VariableSamplingBlurGeneric.frag.glsl 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. // Copyright (C) 2009-2017, Panagiotis Christopoulos Charitos and contributors.
  2. // All rights reserved.
  3. // Code licensed under the BSD License.
  4. // http://www.anki3d.org/LICENSE
  5. /// Defines:
  6. /// - VPASS or HPASS
  7. /// - COL_RGBA or COL_RGB or COL_R
  8. /// - SAMPLES is a number of 3 or 5 or 7 or 9
  9. /// - BLURRING_DIST is optional and it's extra pixels to move the blurring
  10. #include "shaders/Common.glsl"
  11. // Preprocessor switches sanity checks
  12. #if !defined(VPASS) && !defined(HPASS)
  13. #error See file
  14. #endif
  15. #if !(defined(COL_RGBA) || defined(COL_RGB) || defined(COL_R))
  16. #error See file
  17. #endif
  18. #if !defined(IMG_DIMENSION)
  19. #error See file
  20. #endif
  21. #if !defined(SAMPLES)
  22. #error See file
  23. #endif
  24. // Input RT with different binding for less GL API calls
  25. layout(ANKI_TEX_BINDING(0, 0)) uniform sampler2D uTex;
  26. layout(location = 0) in vec2 in_texCoord;
  27. #if !defined(BLURRING_DIST)
  28. #define BLURRING_DIST 0.0
  29. #endif
  30. // Determine color type
  31. #if defined(COL_RGBA)
  32. #define COL_TYPE vec4
  33. #elif defined(COL_RGB)
  34. #define COL_TYPE vec3
  35. #elif defined(COL_R)
  36. #define COL_TYPE float
  37. #endif
  38. // Determine tex fetch
  39. #if defined(COL_RGBA)
  40. #define TEX_FETCH rgba
  41. #elif defined(COL_RGB)
  42. #define TEX_FETCH rgb
  43. #elif defined(COL_R)
  44. #define TEX_FETCH r
  45. #endif
  46. // Calc the kernel. Use offsets of 3 to take advantage of bilinear filtering
  47. #define BLURRING(val, sign_) ((float(val) * (float(BLURRING_DIST) + 1.0) / float(IMG_DIMENSION)) * float(sign_))
  48. #if defined(HPASS)
  49. #define BLURRING_OFFSET_X(val, sign_) BLURRING(val, sign_)
  50. #define BLURRING_OFFSET_Y(val, sign_) 0.0
  51. #else
  52. #define BLURRING_OFFSET_X(val, sign_) 0.0
  53. #define BLURRING_OFFSET_Y(val, sign_) BLURRING(val, sign_)
  54. #endif
  55. #define BLURRING_OFFSET(v, s) vec2(BLURRING_OFFSET_X(v, s), BLURRING_OFFSET_Y(v, s))
  56. const vec2 KERNEL[SAMPLES - 1] = vec2[](BLURRING_OFFSET(1, -1),
  57. BLURRING_OFFSET(1, 1)
  58. #if SAMPLES > 3
  59. ,
  60. BLURRING_OFFSET(2, -1),
  61. BLURRING_OFFSET(2, 1)
  62. #endif
  63. #if SAMPLES > 5
  64. ,
  65. BLURRING_OFFSET(3, -1),
  66. BLURRING_OFFSET(3, 1)
  67. #endif
  68. #if SAMPLES > 7
  69. ,
  70. BLURRING_OFFSET(4, -1),
  71. BLURRING_OFFSET(4, 1)
  72. #endif
  73. #if SAMPLES > 9
  74. ,
  75. BLURRING_OFFSET(5, -1),
  76. BLURRING_OFFSET(5, 1)
  77. #endif
  78. #if SAMPLES > 11
  79. ,
  80. BLURRING_OFFSET(6, -1),
  81. BLURRING_OFFSET(6, 1)
  82. #endif
  83. #if SAMPLES > 13
  84. ,
  85. BLURRING_OFFSET(7, -1),
  86. BLURRING_OFFSET(7, 1)
  87. #endif
  88. #if SAMPLES > 15
  89. ,
  90. BLURRING_OFFSET(8, -1),
  91. BLURRING_OFFSET(8, 1)
  92. #endif
  93. #if SAMPLES > 17
  94. ,
  95. BLURRING_OFFSET(9, -1),
  96. BLURRING_OFFSET(9, 1)
  97. #endif
  98. );
  99. layout(location = 0) out COL_TYPE out_fragColor;
  100. void main()
  101. {
  102. // Get the first
  103. COL_TYPE col = texture(uTex, in_texCoord).TEX_FETCH;
  104. // Get the rest of the samples
  105. for(uint i = 0; i < SAMPLES - 1; i++)
  106. {
  107. col += texture(uTex, in_texCoord + KERNEL[i]).TEX_FETCH;
  108. }
  109. out_fragColor = col / float(SAMPLES);
  110. }