71 lines
1.6 KiB
GLSL
71 lines
1.6 KiB
GLSL
#version 450
|
|
#pragma shader_stage(compute)
|
|
#extension GL_EXT_samplerless_texture_functions : require
|
|
|
|
layout (local_size_x = 8, local_size_y = 8, local_size_z = 8) in;
|
|
|
|
layout (constant_id = 0) const uint CASCADES = 16;
|
|
layout (constant_id = 1) const uint MIPS = 16;
|
|
|
|
layout( push_constant ) uniform PushBlock {
|
|
uint cascade;
|
|
uint mip;
|
|
} PushConstant;
|
|
|
|
#if VXGI_HDR
|
|
layout (binding = 1, rgba32f) uniform volatile coherent image3D voxelRadiance[CASCADES * MIPS];
|
|
#else
|
|
layout (binding = 1, rgba16f) uniform volatile coherent image3D voxelRadiance[CASCADES * MIPS];
|
|
#endif
|
|
|
|
const float gaussianWeights[] = {
|
|
//Top slice
|
|
1 / 64.0f,
|
|
1 / 32.0f,
|
|
1 / 64.0f,
|
|
1 / 32.0f,
|
|
1 / 16.0f,
|
|
1 / 32.0f,
|
|
1 / 64.0f,
|
|
1 / 32.0f,
|
|
1 / 64.0f,
|
|
|
|
//Center slice
|
|
1 / 32.0f,
|
|
1 / 16.0f,
|
|
1 / 32.0f,
|
|
1 / 16.0f,
|
|
1 / 4.0f,
|
|
1 / 16.0f,
|
|
1 / 32.0f,
|
|
1 / 16.0f,
|
|
1 / 32.0f,
|
|
|
|
//Bottom slice
|
|
1 / 64.0f,
|
|
1 / 32.0f,
|
|
1 / 64.0f,
|
|
1 / 32.0f,
|
|
1 / 16.0f,
|
|
1 / 32.0f,
|
|
1 / 64.0f,
|
|
1 / 32.0f,
|
|
1 / 64.0f,
|
|
};
|
|
|
|
void main() {
|
|
const ivec3 inUVW = ivec3(gl_GlobalInvocationID.xyz) * 2;
|
|
const ivec3 outUVW = ivec3(gl_GlobalInvocationID.xyz);
|
|
const uint CASCADE_IN = PushConstant.cascade * CASCADES + PushConstant.mip;
|
|
const uint CASCADE_OUT = PushConstant.cascade * CASCADES + (PushConstant.mip + 1);
|
|
|
|
vec4 color = vec4(0);
|
|
for ( int z = -1; z <= 1; ++z ) {
|
|
for ( int y = -1; y <= 1; ++y ) {
|
|
for ( int x = -1; x <= 1; ++x ) {
|
|
color += imageLoad( voxelRadiance[CASCADE_IN], inUVW + ivec3(x,y,z) ) * gaussianWeights[x + 1 + (y + 1) * 3 + (z + 1) * 9];
|
|
}
|
|
}
|
|
}
|
|
imageStore(voxelRadiance[CASCADE_OUT], ivec3(outUVW), vec4(color));
|
|
} |