56 lines
No EOL
1.8 KiB
Text
56 lines
No EOL
1.8 KiB
Text
#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) buffer SizeBuffer2D {
|
|
uint grid_out[];
|
|
};
|
|
|
|
layout(binding = 8) readonly buffer SizeBuffer3D {
|
|
uint grid_size_in[];
|
|
};
|
|
|
|
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 z = (index - x) / compound_grid_size;
|
|
// iterate upwards along the y axis
|
|
uint sum = 0;
|
|
for (uint y=0; y < compound_grid_size; y++) {
|
|
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;
|
|
}
|
|
} |