VoxelEngine2/shaders/rt_compute_combine.comp
2025-04-17 17:15:57 +02:00

51 lines
No EOL
1.9 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 = 8) 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;
uint output_offset = 0;
uint compound_start = 0;
// 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] * 2;
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) % (compound_grid_size * compound_grid_size) - x) / (compound_grid_size);
uint z = (index - x - y * compound_grid_size) / (compound_grid_size * compound_grid_size);
uint size_x = grid_size_in[output_offset + (x * compound_grid_size * compound_grid_size + y * compound_grid_size + z) * 3];
uint size_y = grid_size_in[output_offset + (x * compound_grid_size * compound_grid_size + y * compound_grid_size + z) * 3 + 1];
uint size_z = grid_size_in[output_offset + (x * compound_grid_size * compound_grid_size + y * compound_grid_size + z) * 3 + 2];
}