80 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			GLSL
		
	
	
	
	
	
			
		
		
	
	
			80 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			GLSL
		
	
	
	
	
	
#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;
 | 
						|
}
 |