VariableSamplingBlurGeneric.glsl 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. /// Defines:
  2. /// - VPASS or HPASS
  3. /// - COL_RGBA or COL_RGB or COL_R
  4. /// - SAMPLES is a number of 3 or 5 or 7 or 9
  5. /// - BLURRING_DIST is optional and it's extra pixels to move the blurring
  6. #pragma anki start vertexShader
  7. layout(location = 0) in vec2 position;
  8. out vec2 vTexCoords;
  9. void main()
  10. {
  11. vTexCoords = position;
  12. gl_Position = vec4(position * 2.0 - 1.0, 0.0, 1.0);
  13. }
  14. #pragma anki start fragmentShader
  15. #define DEFAULT_FLOAT_PRECISION mediump
  16. #pragma anki include "shaders/Common.glsl"
  17. // Preprocessor switches sanity checks
  18. #if !defined(VPASS) && !defined(HPASS)
  19. # error See file
  20. #endif
  21. #if !(defined(COL_RGBA) || defined(COL_RGB) || defined(COL_R))
  22. # error See file
  23. #endif
  24. #if !defined(IMG_DIMENSION)
  25. # error See file
  26. #endif
  27. #if !defined(SAMPLES)
  28. # error See file
  29. #endif
  30. uniform mediump sampler2D img; ///< Input FAI
  31. in vec2 vTexCoords;
  32. #if !defined(BLURRING_DIST)
  33. # define BLURRING_DIST 0.0
  34. #endif
  35. // Determine color type
  36. #if defined(COL_RGBA)
  37. # define COL_TYPE vec4
  38. #elif defined(COL_RGB)
  39. # define COL_TYPE vec3
  40. #elif defined(COL_R)
  41. # define COL_TYPE float
  42. #endif
  43. // Determine tex fetch
  44. #if defined(COL_RGBA)
  45. # define TEX_FETCH rgba
  46. #elif defined(COL_RGB)
  47. # define TEX_FETCH rgb
  48. #elif defined(COL_R)
  49. # define TEX_FETCH r
  50. #endif
  51. // Calc the kernel. Use offsets of 3 to take advantage of bilinear filtering
  52. #define BLURRING(val, sign_) ((float(val) * (float(BLURRING_DIST) + 1.0) / float(IMG_DIMENSION)) * float(sign_))
  53. #if defined(VPASS)
  54. # define BLURRING_OFFSET_X(val, sign_) BLURRING(val, sign_)
  55. # define BLURRING_OFFSET_Y(val, sign_) 0.0
  56. #else
  57. # define BLURRING_OFFSET_X(val, sign_) 0.0
  58. # define BLURRING_OFFSET_Y(val, sign_) BLURRING(val, sign_)
  59. #endif
  60. #define BLURRING_OFFSET(v, s) vec2(BLURRING_OFFSET_X(v, s), BLURRING_OFFSET_Y(v, s))
  61. #if SAMPLES == 3
  62. const vec2 kernel[SAMPLES] = vec2[](
  63. BLURRING_OFFSET(1, -1),
  64. BLURRING_OFFSET(0, 1),
  65. BLURRING_OFFSET(1, 1));
  66. #elif SAMPLES == 5
  67. const vec2 kernel[SAMPLES] = vec2[](
  68. BLURRING_OFFSET(2, -1),
  69. BLURRING_OFFSET(1, -1),
  70. BLURRING_OFFSET(0, 0),
  71. BLURRING_OFFSET(1, 1),
  72. BLURRING_OFFSET(2, 1));
  73. #elif SAMPLES == 7
  74. const vec2 kernel[SAMPLES] = vec2[](
  75. BLURRING_OFFSET(3, -1),
  76. BLURRING_OFFSET(2, -1),
  77. BLURRING_OFFSET(1, -1),
  78. BLURRING_OFFSET(0, 1),
  79. BLURRING_OFFSET(1, 1),
  80. BLURRING_OFFSET(2, 1),
  81. BLURRING_OFFSET(3, 1));
  82. #elif SAMPLES == 9
  83. const vec2 kernel[SAMPLES] = vec2[](
  84. BLURRING_OFFSET(4, -1),
  85. BLURRING_OFFSET(3, -1),
  86. BLURRING_OFFSET(2, -1),
  87. BLURRING_OFFSET(1, -1),
  88. BLURRING_OFFSET(0, 1),
  89. BLURRING_OFFSET(1, 1),
  90. BLURRING_OFFSET(2, 1),
  91. BLURRING_OFFSET(3, 1),
  92. BLURRING_OFFSET(4, 1));
  93. #endif
  94. layout(location = 0) out COL_TYPE fFragColor;
  95. void main()
  96. {
  97. // Get the first
  98. COL_TYPE col = textureFai(img, vTexCoords + kernel[0]).TEX_FETCH;
  99. // Get the rest of the samples
  100. for(int i = 1; i < SAMPLES; i++)
  101. {
  102. col += textureFai(img, vTexCoords + kernel[i]).TEX_FETCH;
  103. }
  104. fFragColor = col * (1.0 / float(SAMPLES));
  105. }