#version 450 layout(binding = 0) uniform UniformBufferObject { mat4 model; mat4 geom_rot; mat4 view; mat4 proj; vec3 camera_pos; bool[16] use_geom_shader; } ubo; layout(binding = 3) readonly buffer CompoundBuffer { uint compounds[]; }; layout(binding = 4) readonly buffer ColorBuffer { uint grid_in[]; }; layout(binding = 9) readonly buffer TransparentBuffer { bool transparent_grid[]; }; layout(binding = 7) readonly buffer SizeBuffer2D { uint grid_size_in[]; }; layout(binding = 8) buffer SizeBuffer3D { uint grid_out[]; }; layout (local_size_x = 16, local_size_y = 1, local_size_z = 1) in; void main() { uint index = gl_GlobalInvocationID.x * 2 + 1; uint output_offset = 0; uint compound_start = 1; // iterate over the compounds and find the work index inside of it while (index > compounds[compound_start] * compounds[compound_start]) { output_offset += compounds[compound_start] * compounds[compound_start] * compounds[compound_start]; index -= compounds[compound_start] * compounds[compound_start]; compound_start = compounds[compound_start + 2]; } // grid pos in the task uint compound_grid_size = compounds[compound_start]; float compound_scale = uintBitsToFloat(compounds[compound_start + 1]); vec3 mid_offset = vec3(compound_scale * 0.5, compound_scale * 0.5, compound_scale * 0.5); uint x = index % compound_grid_size; uint y = (index - x) / compound_grid_size; // iterate upwards along the z axis uint sum = 0; for (uint z=0; z < compound_grid_size; z++) { sum += grid_size_in[output_offset + x * compound_grid_size * compound_grid_size + y * compound_grid_size + z]; grid_out[output_offset + x * compound_grid_size * compound_grid_size + y * compound_grid_size + z] = sum; } }