#extension GL_EXT_buffer_reference : require #extension GL_EXT_nonuniform_qualifier : require layout(local_size_x = 8, local_size_y = 8, local_size_z = 1) in; layout(buffer_reference) readonly buffer scene_metadata { uint[39] unused; uint downscale_factor; }; layout(set = 0, binding = 0, rgba32f) uniform image2D images[]; layout(push_constant) uniform constants { scene_metadata scene; uint output_image_index; uint accumulation_image_index; } consts; void main() { uint x = gl_GlobalInvocationID.x * consts.scene.downscale_factor; uint y = gl_GlobalInvocationID.y * consts.scene.downscale_factor; vec4 color = imageLoad(images[nonuniformEXT(consts.accumulation_image_index)], ivec2(x, y)); vec4 out_color = sqrt(color); for (uint i = 0; i < consts.scene.downscale_factor; i++) { for (uint j = 0; j < consts.scene.downscale_factor; j++) { imageStore(images[nonuniformEXT(consts.output_image_index)], ivec2(x + i, y + j), out_color); } } }