VariableSamplingBlurGeneric.glsl 2.8 KB

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