56 lines · 2.0 KB · Text
RawDownload
<@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);}