<@include gpu/Config.slh@> <$VERSION_HEADER$> // BloomThreshold.frag // Perform a soft threshold on an input texture and downsample to half size in one go. // // Created by Olivier Prat on 09/26/2017 // Copyright 2017 High Fidelity, Inc. // Copyright 2024 Overte e.V. // // Distributed under the Apache License, Version 2.0. // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // <@include BloomThreshold.shared.slh@> <@include render-utils/ShaderConstants.h@> // Luminance in bloom effect needs to be clamped to avoid excessive sparkling. #define BLOOM_MAX_LUMINANCE 10.0 TEXTURE(RENDER_UTILS_TEXTURE_BLOOM_COLOR, sampler2D, colorMap); UNIFORM_BUFFER(RENDER_UTILS_BUFFER_BLOOM_PARAMS, parametersBuffer) { Parameters parameters; }; OUTPUT(0, vec4, outFragColor); void main(void) { vec2 startUv = (vec2(gl_FragCoord.xy) + vec2(parameters._offset)) * parameters._deltaUV * float(parameters._downsamplingFactor); vec4 maskedColor = vec4(0,0,0,0); for (int y=0 ; y BLOOM_MAX_LUMINANCE) { float clampedLuminance = clamp(luminance, 0.0, BLOOM_MAX_LUMINANCE); color /= luminance / clampedLuminance; luminance = clampedLuminance; } float mask = clamp((luminance-parameters._threshold)*0.25, 0.0, 1.0); color *= mask; maskedColor += color; uv.x += parameters._deltaUV.x; } startUv.y += parameters._deltaUV.y; } maskedColor /= float(parameters._downsamplingFactor * parameters._downsamplingFactor); outFragColor = vec4(maskedColor.rgb, 1.0); }