#version 450 layout(location = 0) out vec4 FragColor; layout(location = 0) in vec2 TexCoords; layout(set = 0, binding = 0) uniform sampler2D bloomImage; layout(push_constant) uniform PassConfig { int horizontal; float GAMMA_CONST; float Exposure; float blur_radius; vec2 bloomSize; } config; const float weight[5] = float[](0.227027, 0.1945946, 0.1216216, 0.054054, 0.016216); vec3 safeBloomSample(vec2 uv) { return max(texture(bloomImage, uv).rgb, vec3(0.0)); } void main() { vec2 tex_offset = config.blur_radius / vec2(textureSize(bloomImage, 0)); vec2 direction = config.horizontal != 0 ? vec2(tex_offset.x, 0.0) : vec2(0.0, tex_offset.y); vec3 result = safeBloomSample(TexCoords) * weight[0]; for (int i = 1; i < 5; i++) { result += safeBloomSample(TexCoords + direction * i) * weight[i]; result += safeBloomSample(TexCoords - direction * i) * weight[i]; } FragColor = vec4(result, 1.0); }