cluster_debug.glsl 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. #[compute]
  2. #version 450
  3. #VERSION_DEFINES
  4. layout(local_size_x = 8, local_size_y = 8, local_size_z = 1) in;
  5. const vec3 usage_gradient[33] = vec3[]( // 1 (none) + 32
  6. vec3(0.14, 0.17, 0.23),
  7. vec3(0.24, 0.44, 0.83),
  8. vec3(0.23, 0.57, 0.84),
  9. vec3(0.22, 0.71, 0.84),
  10. vec3(0.22, 0.85, 0.83),
  11. vec3(0.21, 0.85, 0.72),
  12. vec3(0.21, 0.85, 0.57),
  13. vec3(0.20, 0.85, 0.42),
  14. vec3(0.20, 0.85, 0.27),
  15. vec3(0.27, 0.86, 0.19),
  16. vec3(0.51, 0.85, 0.19),
  17. vec3(0.57, 0.86, 0.19),
  18. vec3(0.62, 0.85, 0.19),
  19. vec3(0.67, 0.86, 0.20),
  20. vec3(0.73, 0.85, 0.20),
  21. vec3(0.78, 0.85, 0.20),
  22. vec3(0.83, 0.85, 0.20),
  23. vec3(0.85, 0.82, 0.20),
  24. vec3(0.85, 0.76, 0.20),
  25. vec3(0.85, 0.81, 0.20),
  26. vec3(0.85, 0.65, 0.20),
  27. vec3(0.84, 0.60, 0.21),
  28. vec3(0.84, 0.56, 0.21),
  29. vec3(0.84, 0.51, 0.21),
  30. vec3(0.84, 0.46, 0.21),
  31. vec3(0.84, 0.41, 0.21),
  32. vec3(0.84, 0.36, 0.21),
  33. vec3(0.84, 0.31, 0.21),
  34. vec3(0.84, 0.27, 0.21),
  35. vec3(0.83, 0.22, 0.22),
  36. vec3(0.83, 0.22, 0.27),
  37. vec3(0.83, 0.22, 0.32),
  38. vec3(1.00, 0.63, 0.70));
  39. layout(push_constant, std430) uniform Params {
  40. uvec2 screen_size;
  41. uvec2 cluster_screen_size;
  42. uint cluster_shift;
  43. uint cluster_type;
  44. float z_near;
  45. float z_far;
  46. bool orthogonal;
  47. uint max_cluster_element_count_div_32;
  48. uint pad1;
  49. uint pad2;
  50. }
  51. params;
  52. layout(set = 0, binding = 1, std430) buffer restrict readonly ClusterData {
  53. uint data[];
  54. }
  55. cluster_data;
  56. layout(rgba16f, set = 0, binding = 2) uniform restrict writeonly image2D screen_buffer;
  57. layout(set = 0, binding = 3) uniform texture2D depth_buffer;
  58. layout(set = 0, binding = 4) uniform sampler depth_buffer_sampler;
  59. void main() {
  60. uvec2 screen_pos = gl_GlobalInvocationID.xy;
  61. if (any(greaterThanEqual(screen_pos, params.screen_size))) {
  62. return;
  63. }
  64. uvec2 cluster_pos = screen_pos >> params.cluster_shift;
  65. uint offset = cluster_pos.y * params.cluster_screen_size.x + cluster_pos.x;
  66. offset += params.cluster_screen_size.x * params.cluster_screen_size.y * params.cluster_type;
  67. offset *= (params.max_cluster_element_count_div_32 + 32);
  68. //depth buffers generally can't be accessed via image API
  69. float depth = texelFetch(sampler2D(depth_buffer, depth_buffer_sampler), ivec2(screen_pos), 0).r * 2.0 - 1.0;
  70. if (params.orthogonal) {
  71. depth = ((depth + (params.z_far + params.z_near) / (params.z_far - params.z_near)) * (params.z_far - params.z_near)) / 2.0;
  72. } else {
  73. depth = 2.0 * params.z_near * params.z_far / (params.z_far + params.z_near - depth * (params.z_far - params.z_near));
  74. }
  75. depth /= params.z_far;
  76. uint slice = uint(clamp(floor(depth * 32.0), 0.0, 31.0));
  77. uint slice_minmax = cluster_data.data[offset + params.max_cluster_element_count_div_32 + slice];
  78. uint item_min = slice_minmax & 0xFFFF;
  79. uint item_max = slice_minmax >> 16;
  80. uint item_count = 0;
  81. for (uint i = 0; i < params.max_cluster_element_count_div_32; i++) {
  82. uint slice_bits = cluster_data.data[offset + i];
  83. while (slice_bits != 0) {
  84. uint bit = findLSB(slice_bits);
  85. uint item = i * 32 + bit;
  86. if ((item >= item_min && item < item_max)) {
  87. item_count++;
  88. }
  89. slice_bits &= ~(1 << bit);
  90. }
  91. }
  92. item_count = min(item_count, 32);
  93. vec3 color = usage_gradient[item_count];
  94. color = mix(color * 1.2, color * 0.3, float(slice) / 31.0);
  95. imageStore(screen_buffer, ivec2(screen_pos), vec4(color, 1.0));
  96. }