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; | ||
|  | } |