<@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<parameters._downsamplingFactor ; y++) { vec2 uv = startUv; for (int x=0 ; x<parameters._downsamplingFactor ; x++) { vec4 color = texture(colorMap, uv); color = mix(color, vec4(0.0), isnan(color)); float luminance = (color.r+color.g+color.b) / 3.0; // Luminance in bloom effect needs to be clamped to avoid excessive sparkling. if (luminance > 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);}
<@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<parameters._downsamplingFactor ; y++) {
vec2 uv = startUv;
for (int x=0 ; x<parameters._downsamplingFactor ; x++) {
vec4 color = texture(colorMap, uv);
color = mix(color, vec4(0.0), isnan(color));
float luminance = (color.r+color.g+color.b) / 3.0;
// Luminance in bloom effect needs to be clamped to avoid excessive sparkling.
if (luminance > 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);
}