#version 450 layout(location = 0) out vec4 FragColor; layout(location = 0) in vec2 TexCoords; layout(set = 0, binding = 0) uniform sampler2D image; layout(set = 0, binding = 1) uniform sampler2D bloomImage; layout(set = 1 , binding = 0) uniform PassConfig{ int ApplyToFinalImage; int horizontal; float GAMMA_CONST; float Exposure; float blur_radius; vec3 padding; } config; const float weight[5] = float[] (0.227027, 0.1945946, 0.1216216, 0.054054, 0.016216); vec3 safeBloomSample(vec2 uv) { vec3 value = texture(bloomImage, uv).rgb; return clamp(value, vec3(0.0), vec3(8.0)); } void main() { if(config.ApplyToFinalImage != 0){ vec3 bloomColour = safeBloomSample(TexCoords); vec3 hdrColour = texture(image, TexCoords).rgb; hdrColour += bloomColour; vec3 result = vec3(1.0) - exp(-hdrColour * config.Exposure); result = pow(result, vec3(1.0 / config.GAMMA_CONST)); FragColor = vec4(result, 1.0); return; } float blurRadius = config.blur_radius; vec2 tex_offset = blurRadius / vec2(textureSize(bloomImage, 0)); vec3 result = safeBloomSample(TexCoords) * weight[0]; if(config.horizontal != 0) { for(int i = 1; i < 5; ++i) { result += safeBloomSample(TexCoords + vec2(tex_offset.x * i, 0.0)) * weight[i]; result += safeBloomSample(TexCoords - vec2(tex_offset.x * i, 0.0)) * weight[i]; } } else { for(int i = 1; i < 5; ++i) { result += safeBloomSample(TexCoords + vec2(0.0, tex_offset.y * i)) * weight[i]; result += safeBloomSample(TexCoords - vec2(0.0, tex_offset.y * i)) * weight[i]; } } FragColor = vec4(result, 1.0); }