GaussianBlur.glsl 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. // Copyright (C) 2009-2018, Panagiotis Christopoulos Charitos and contributors.
  2. // All rights reserved.
  3. // Code licensed under the BSD License.
  4. // http://www.anki3d.org/LICENSE
  5. // Defines it needs:
  6. // HORIZONTAL | VERTICAL | BOX
  7. // COLOR_COMPONENTS
  8. // WORKGROUP_SIZE (only for compute)
  9. // TEXTURE_SIZE
  10. // KERNEL_SIZE (must be odd number)
  11. #ifndef ANKI_SHADERS_GAUSSIAN_BLUR_GLSL
  12. #define ANKI_SHADERS_GAUSSIAN_BLUR_GLSL
  13. #include "shaders/GaussianBlurCommon.glsl"
  14. #if defined(ANKI_COMPUTE_SHADER)
  15. # define USE_COMPUTE 1
  16. #else
  17. # define USE_COMPUTE 0
  18. #endif
  19. // Determine color type
  20. #if COLOR_COMPONENTS == 4
  21. # define COL_TYPE vec4
  22. # define TEX_FETCH rgba
  23. # define TO_VEC4(x_) x_
  24. #elif COLOR_COMPONENTS == 3
  25. # define COL_TYPE vec3
  26. # define TEX_FETCH rgb
  27. # define TO_VEC4(x_) vec4(x_, 0.0)
  28. #elif COLOR_COMPONENTS == 1
  29. # define COL_TYPE float
  30. # define TEX_FETCH r
  31. # define TO_VEC4(x_) vec4(x_, 0.0, 0.0, 0.0)
  32. #else
  33. # error See file
  34. #endif
  35. layout(ANKI_TEX_BINDING(0, 0)) uniform sampler2D u_tex; ///< Input texture
  36. #if USE_COMPUTE
  37. layout(local_size_x = WORKGROUP_SIZE.x, local_size_y = WORKGROUP_SIZE.y, local_size_z = 1) in;
  38. layout(ANKI_IMAGE_BINDING(0, 0)) writeonly uniform image2D u_outImg;
  39. #else
  40. layout(location = 0) in vec2 in_uv;
  41. layout(location = 0) out COL_TYPE out_color;
  42. #endif
  43. void main()
  44. {
  45. // Set UVs
  46. #if USE_COMPUTE
  47. ANKI_BRANCH if(gl_GlobalInvocationID.x >= TEXTURE_SIZE.x || gl_GlobalInvocationID.y >= TEXTURE_SIZE.y)
  48. {
  49. // Out of bounds
  50. return;
  51. }
  52. vec2 uv = (vec2(gl_GlobalInvocationID.xy) + 0.5) / vec2(TEXTURE_SIZE);
  53. #else
  54. vec2 uv = in_uv;
  55. #endif
  56. const vec2 TEXEL_SIZE = 1.0 / vec2(TEXTURE_SIZE);
  57. #if !defined(BOX)
  58. // Do seperable
  59. # if defined(HORIZONTAL)
  60. # define X_OR_Y x
  61. # else
  62. # define X_OR_Y y
  63. # endif
  64. COL_TYPE color = textureLod(u_tex, uv, 0.0).TEX_FETCH * WEIGHTS[0u];
  65. vec2 uvOffset = vec2(0.0);
  66. uvOffset.X_OR_Y = 1.5 * TEXEL_SIZE.X_OR_Y;
  67. ANKI_UNROLL for(uint i = 0u; i < STEP_COUNT; ++i)
  68. {
  69. COL_TYPE col =
  70. textureLod(u_tex, uv + uvOffset, 0.0).TEX_FETCH + textureLod(u_tex, uv - uvOffset, 0.0).TEX_FETCH;
  71. color += WEIGHTS[i + 1u] * col;
  72. uvOffset.X_OR_Y += 2.0 * TEXEL_SIZE.X_OR_Y;
  73. }
  74. #else
  75. // Do box
  76. const vec2 OFFSET = 1.5 * TEXEL_SIZE;
  77. COL_TYPE color = textureLod(u_tex, uv, 0.0).TEX_FETCH * BOX_WEIGHTS[0u];
  78. COL_TYPE col;
  79. col = textureLod(u_tex, uv + vec2(OFFSET.x, 0.0), 0.0).TEX_FETCH;
  80. col += textureLod(u_tex, uv + vec2(0.0, OFFSET.y), 0.0).TEX_FETCH;
  81. col += textureLod(u_tex, uv + vec2(-OFFSET.x, 0.0), 0.0).TEX_FETCH;
  82. col += textureLod(u_tex, uv + vec2(0.0, -OFFSET.y), 0.0).TEX_FETCH;
  83. color += col * BOX_WEIGHTS[1u];
  84. col = textureLod(u_tex, uv + vec2(+OFFSET.x, +OFFSET.y), 0.0).TEX_FETCH;
  85. col += textureLod(u_tex, uv + vec2(+OFFSET.x, -OFFSET.y), 0.0).TEX_FETCH;
  86. col += textureLod(u_tex, uv + vec2(-OFFSET.x, +OFFSET.y), 0.0).TEX_FETCH;
  87. col += textureLod(u_tex, uv + vec2(-OFFSET.x, -OFFSET.y), 0.0).TEX_FETCH;
  88. color += col * BOX_WEIGHTS[2u];
  89. #endif
  90. // Write value
  91. #if USE_COMPUTE
  92. imageStore(u_outImg, ivec2(gl_GlobalInvocationID.xy), TO_VEC4(color));
  93. #else
  94. out_color = color;
  95. #endif
  96. }
  97. #endif