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