DepthAwareBlur.glsl 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  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. // SAMPLE_COUNT (must be odd number)
  11. #ifndef ANKI_SHADERS_DEPTH_AWARE_BLUR_GLSL
  12. #define ANKI_SHADERS_DEPTH_AWARE_BLUR_GLSL
  13. #include "shaders/Common.glsl"
  14. #if SAMPLE_COUNT < 3
  15. # error See file
  16. #endif
  17. #if defined(ANKI_COMPUTE_SHADER)
  18. # define USE_COMPUTE 1
  19. #else
  20. # define USE_COMPUTE 0
  21. #endif
  22. // Define some macros depending on the number of components
  23. #if COLOR_COMPONENTS == 4
  24. # define COL_TYPE vec4
  25. # define TEX_FETCH rgba
  26. # define TO_VEC4(x_) x_
  27. #elif COLOR_COMPONENTS == 3
  28. # define COL_TYPE vec3
  29. # define TEX_FETCH rgb
  30. # define TO_VEC4(x_) vec4(x_, 0.0)
  31. #elif COLOR_COMPONENTS == 1
  32. # define COL_TYPE float
  33. # define TEX_FETCH r
  34. # define TO_VEC4(x_) vec4(x_, 0.0, 0.0, 0.0)
  35. #else
  36. # error See file
  37. #endif
  38. layout(ANKI_TEX_BINDING(0, 0)) uniform sampler2D u_inTex;
  39. layout(ANKI_TEX_BINDING(0, 1)) uniform sampler2D u_depthTex;
  40. #if USE_COMPUTE
  41. layout(local_size_x = WORKGROUP_SIZE.x, local_size_y = WORKGROUP_SIZE.y, local_size_z = 1) in;
  42. layout(ANKI_IMAGE_BINDING(0, 0)) writeonly uniform image2D u_outImg;
  43. #else
  44. layout(location = 0) in vec2 in_uv;
  45. layout(location = 0) out COL_TYPE out_color;
  46. #endif
  47. float computeDepthWeight(float refDepth, float depth)
  48. {
  49. float diff = abs(refDepth - depth);
  50. float weight = 1.0 / (EPSILON + diff);
  51. return sqrt(weight);
  52. }
  53. float readDepth(vec2 uv)
  54. {
  55. return textureLod(u_depthTex, uv, 0.0).r;
  56. }
  57. void sampleTex(vec2 uv, float refDepth, inout COL_TYPE col, inout float weight)
  58. {
  59. COL_TYPE color = textureLod(u_inTex, uv, 0.0).TEX_FETCH;
  60. float w = computeDepthWeight(refDepth, readDepth(uv));
  61. col += color * w;
  62. weight += w;
  63. }
  64. void main()
  65. {
  66. // Set UVs
  67. #if USE_COMPUTE
  68. ANKI_BRANCH if(gl_GlobalInvocationID.x >= TEXTURE_SIZE.x || gl_GlobalInvocationID.y >= TEXTURE_SIZE.y)
  69. {
  70. // Out of bounds
  71. return;
  72. }
  73. vec2 uv = (vec2(gl_GlobalInvocationID.xy) + 0.5) / vec2(TEXTURE_SIZE);
  74. #else
  75. vec2 uv = in_uv;
  76. #endif
  77. const vec2 TEXEL_SIZE = 1.0 / vec2(TEXTURE_SIZE);
  78. // Sample
  79. COL_TYPE color = textureLod(u_inTex, uv, 0.0).TEX_FETCH;
  80. float refDepth = readDepth(uv);
  81. float weight = 1.0;
  82. #if !defined(BOX)
  83. // Do seperable
  84. # if defined(HORIZONTAL)
  85. # define X_OR_Y x
  86. # else
  87. # define X_OR_Y y
  88. # endif
  89. vec2 uvOffset = vec2(0.0);
  90. uvOffset.X_OR_Y = 1.5 * TEXEL_SIZE.X_OR_Y;
  91. ANKI_UNROLL for(uint i = 0u; i < (SAMPLE_COUNT - 1u) / 2u; ++i)
  92. {
  93. sampleTex(uv + uvOffset, refDepth, color, weight);
  94. sampleTex(uv - uvOffset, refDepth, color, weight);
  95. uvOffset.X_OR_Y += 2.0 * TEXEL_SIZE.X_OR_Y;
  96. }
  97. #else
  98. // Do box
  99. const vec2 OFFSET = 1.5 * TEXEL_SIZE;
  100. sampleTex(uv + vec2(+OFFSET.x, +OFFSET.y), refDepth, color, weight);
  101. sampleTex(uv + vec2(+OFFSET.x, -OFFSET.y), refDepth, color, weight);
  102. sampleTex(uv + vec2(-OFFSET.x, +OFFSET.y), refDepth, color, weight);
  103. sampleTex(uv + vec2(-OFFSET.x, -OFFSET.y), refDepth, color, weight);
  104. sampleTex(uv + vec2(OFFSET.x, 0.0), refDepth, color, weight);
  105. sampleTex(uv + vec2(0.0, OFFSET.y), refDepth, color, weight);
  106. sampleTex(uv + vec2(-OFFSET.x, 0.0), refDepth, color, weight);
  107. sampleTex(uv + vec2(0.0, -OFFSET.y), refDepth, color, weight);
  108. #endif
  109. color = color / weight;
  110. // Write value
  111. #if USE_COMPUTE
  112. imageStore(u_outImg, ivec2(gl_GlobalInvocationID.xy), TO_VEC4(color));
  113. #else
  114. out_color = color;
  115. #endif
  116. }
  117. #endif