50 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			50 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|  | // Exclusive to volumetric light for now | ||
|  | #version 450 | ||
|  | 
 | ||
|  | #include "compiled.inc" | ||
|  | 
 | ||
|  | uniform sampler2D tex; | ||
|  | uniform vec2 dir; | ||
|  | uniform vec2 screenSize; | ||
|  | 
 | ||
|  | in vec2 texCoord; | ||
|  | out float fragColor; | ||
|  | 
 | ||
|  | const float weight[10] = float[] (0.132572, 0.125472, 0.106373, 0.08078, 0.05495, 0.033482, 0.018275, 0.008934, 0.003912, 0.001535); | ||
|  | 
 | ||
|  | float normpdf(float x, float sigma) { | ||
|  | 	return 0.39894 * exp(-0.5 * x * x / (sigma * sigma)) / sigma; | ||
|  | } | ||
|  | 
 | ||
|  | float normpdf3(vec3 v, float sigma) { | ||
|  | 	return 0.39894 * exp(-0.5 * dot(v, v) / (sigma * sigma)) / sigma; | ||
|  | } | ||
|  | 
 | ||
|  | void main() { | ||
|  | 	vec2 step = (dir / screenSize.xy); | ||
|  | 	vec3 colf = textureLod(tex, texCoord, 0.0).rgb * weight[0]; | ||
|  | 
 | ||
|  | 	float col; | ||
|  | 	float sumfactor = 0.0; | ||
|  | 	float factor; | ||
|  | 	float f = 1.0 / normpdf(0.0, 1.0); | ||
|  | 	fragColor = 0.0; | ||
|  | 
 | ||
|  | 	for (int i = 1; i < 10; i++) { | ||
|  | 		float fw = f * weight[i]; | ||
|  | 		vec2 s = step * (float(i) + 0.5); | ||
|  | 
 | ||
|  | 		col = textureLod(tex, texCoord + s, 0.0).r; | ||
|  | 		factor = normpdf3(col - colf, 1.0) * fw; | ||
|  | 		sumfactor += factor; | ||
|  | 		fragColor += factor * col; | ||
|  | 
 | ||
|  | 		col = textureLod(tex, texCoord - s, 0.0).r; | ||
|  | 		factor = normpdf3(col - colf, 1.0) * fw; | ||
|  | 		sumfactor += factor; | ||
|  | 		fragColor += factor * col; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	fragColor /= sumfactor; | ||
|  | } |