80 lines
2.5 KiB
Plaintext
80 lines
2.5 KiB
Plaintext
|
#version 450
|
||
|
|
||
|
#include "compiled.inc" // bloomKnee, bloomThreshold
|
||
|
#include "std/resample.glsl"
|
||
|
|
||
|
uniform sampler2D tex;
|
||
|
uniform vec2 screenSizeInv;
|
||
|
uniform int currentMipLevel;
|
||
|
|
||
|
#ifdef _CPostprocess
|
||
|
uniform vec4 BloomThresholdData; // Only filled with data if currentMipLevel == 0
|
||
|
#endif
|
||
|
|
||
|
in vec2 texCoord;
|
||
|
|
||
|
out vec4 fragColor;
|
||
|
|
||
|
const float epsilon = 6.2e-5; // see https://github.com/keijiro/KinoBloom/issues/15
|
||
|
|
||
|
#ifdef _BloomAntiFlicker
|
||
|
const bool antiFlicker = true;
|
||
|
#else
|
||
|
const bool antiFlicker = false;
|
||
|
#endif
|
||
|
|
||
|
void main() {
|
||
|
if (antiFlicker && currentMipLevel == 0) {
|
||
|
#ifdef _BloomQualityHigh
|
||
|
fragColor.rgb = downsample_13_tap_anti_flicker(tex, texCoord, screenSizeInv);
|
||
|
#else
|
||
|
#ifdef _BloomQualityMedium
|
||
|
fragColor.rgb = downsample_dual_filter_anti_flicker(tex, texCoord, screenSizeInv);
|
||
|
#else // _BloomQualityLow
|
||
|
fragColor.rgb = downsample_box_filter_anti_flicker(tex, texCoord, screenSizeInv);
|
||
|
#endif
|
||
|
#endif
|
||
|
}
|
||
|
else {
|
||
|
#ifdef _BloomQualityHigh
|
||
|
fragColor.rgb = downsample_13_tap(tex, texCoord, screenSizeInv);
|
||
|
#else
|
||
|
#ifdef _BloomQualityMedium
|
||
|
fragColor.rgb = downsample_dual_filter(tex, texCoord, screenSizeInv);
|
||
|
#else // _BloomQualityLow
|
||
|
fragColor.rgb = downsample_box_filter(tex, texCoord, screenSizeInv);
|
||
|
#endif
|
||
|
#endif
|
||
|
}
|
||
|
|
||
|
if (currentMipLevel == 0) {
|
||
|
// https://catlikecoding.com/unity/tutorials/advanced-rendering/bloom/#3.2
|
||
|
// https://catlikecoding.com/unity/tutorials/advanced-rendering/bloom/#3.4
|
||
|
|
||
|
float brightness = max(fragColor.r, max(fragColor.g, fragColor.b));
|
||
|
|
||
|
#ifdef _CPostprocess
|
||
|
// Only apply precalculation optimization if _CPostprocess, otherwise
|
||
|
// the compiler is able to do the same optimization for the constant
|
||
|
// values from compiled.inc without the need to pass a uniform
|
||
|
float softeningCurve = brightness - BloomThresholdData.y;
|
||
|
softeningCurve = clamp(softeningCurve, 0.0, BloomThresholdData.z); // "connect" to hard knee curve
|
||
|
softeningCurve = softeningCurve * softeningCurve * BloomThresholdData.w;
|
||
|
|
||
|
float contributionFactor = max(softeningCurve, brightness - BloomThresholdData.x);
|
||
|
#else
|
||
|
float softeningCurve = brightness - bloomThreshold + bloomKnee;
|
||
|
softeningCurve = clamp(softeningCurve, 0.0, 2.0 * bloomKnee);
|
||
|
softeningCurve = softeningCurve * softeningCurve / (4 * bloomKnee + epsilon);
|
||
|
|
||
|
float contributionFactor = max(softeningCurve, brightness - bloomThreshold);
|
||
|
#endif
|
||
|
|
||
|
contributionFactor /= max(epsilon, brightness);
|
||
|
|
||
|
fragColor.rgb *= contributionFactor;
|
||
|
}
|
||
|
|
||
|
fragColor.a = 1.0;
|
||
|
}
|