2023-01-12 15:00:14 -05:00
#version 120
#extension GL_EXT_gpu_shader4 : enable
2023-04-16 16:18:26 -04:00
# include "/lib/settings.glsl"
2023-01-12 15:00:14 -05:00
flat varying vec3 ambientUp ;
flat varying vec3 ambientLeft ;
flat varying vec3 ambientRight ;
flat varying vec3 ambientB ;
flat varying vec3 ambientF ;
flat varying vec3 ambientDown ;
flat varying vec3 zenithColor ;
flat varying vec3 sunColor ;
flat varying vec3 sunColorCloud ;
flat varying vec3 moonColor ;
flat varying vec3 moonColorCloud ;
flat varying vec3 lightSourceColor ;
flat varying vec3 avgSky ;
flat varying vec2 tempOffsets ;
flat varying float exposure ;
flat varying float avgBrightness ;
flat varying float exposureF ;
flat varying float rodExposure ;
flat varying float fogAmount ;
flat varying float VFAmount ;
uniform sampler2D colortex4 ;
uniform sampler2D colortex6 ;
uniform mat4 gbufferModelViewInverse ;
uniform vec3 sunPosition ;
uniform vec2 texelSize ;
uniform float rainStrength ;
uniform float sunElevation ;
uniform float nightVision ;
uniform float frameTime ;
uniform float eyeAltitude ;
uniform int frameCounter ;
uniform int worldTime ;
vec3 sunVec = vec3 ( 0.0 , 1.0 , 0.0 ) ;
2023-04-16 16:18:26 -04:00
# include "/lib/sky_gradient.glsl"
2023-01-12 15:00:14 -05:00
# include "/lib/util.glsl"
# include "/lib/ROBOBO_sky.glsl"
2023-04-16 16:18:26 -04:00
2023-01-12 15:00:14 -05:00
vec3 rodSample ( vec2 Xi )
{
float r = sqrt ( 1.0 f - Xi . x * Xi . y ) ;
float phi = 2 * 3.14159265359 * Xi . y ;
return normalize ( vec3 ( cos ( phi ) * r , sin ( phi ) * r , Xi . x ) ) . xzy ;
}
vec3 cosineHemisphereSample ( vec2 Xi )
{
float r = sqrt ( Xi . x ) ;
float theta = 2.0 * 3.14159265359 * Xi . y ;
float x = r * cos ( theta ) ;
float y = r * sin ( theta ) ;
return vec3 ( x , y , sqrt ( clamp ( 1.0 - Xi . x , 0 . , 1 . ) ) ) ;
}
float luma ( vec3 color ) {
return dot ( color , vec3 ( 0.21 , 0.72 , 0.07 ) ) ;
}
vec3 toLinear ( vec3 sRGB ) {
return sRGB * ( sRGB * ( sRGB * 0.305306011 + 0.682171111 ) + 0.012522878 ) ;
}
vec2 tapLocation ( int sampleNumber , int nb , float nbRot , float jitter )
{
float alpha = float ( sampleNumber + jitter ) / nb ;
float angle = ( jitter + alpha ) * ( nbRot * 6.28 ) ;
float ssR = alpha ;
float sin_v , cos_v ;
sin_v = sin ( angle ) ;
cos_v = cos ( angle ) ;
return vec2 ( cos_v , sin_v ) * ssR ;
}
//Low discrepancy 2D sequence, integration error is as low as sobol but easier to compute : http://extremelearning.com.au/unreasonable-effectiveness-of-quasirandom-sequences/
vec2 R2_samples ( int n ) {
vec2 alpha = vec2 ( 0.75487765 , 0.56984026 ) ;
return fract ( alpha * n ) ;
}
void main ( ) {
gl_Position = ftransform ( ) * 0.5 + 0.5 ;
gl_Position . xy = gl_Position . xy * vec2 ( 18 . + 258 * 2 , 258 . ) * texelSize ;
gl_Position . xy = gl_Position . xy * 2 . - 1.0 ;
2023-04-16 16:18:26 -04:00
// tempOffsets = R2_samples(frameCounter%10000);
// ambientUp = vec3(0.0);
// ambientDown = vec3(0.0);
// ambientLeft = vec3(0.0);
// ambientRight = vec3(0.0);
// ambientB = vec3(0.0);
// ambientF = vec3(0.0);
// avgSky = vec3(0.0);
// //Fake bounced sunlight
// vec3 bouncedSun = clamp(gl_Fog.color.rgb*pow(luma(gl_Fog.color.rgb),-0.75)*0.65,0.0,1.0)/4000.*0.08;
// ambientUp += bouncedSun*clamp(-sunVec.y+5.,0.,6.0);
// ambientLeft += bouncedSun*clamp(sunVec.x+5.,0.0,6.);
// ambientRight += bouncedSun*clamp(-sunVec.x+5.,0.0,6.);
// ambientB += bouncedSun*clamp(-sunVec.z+5.,0.0,6.);
// ambientF += bouncedSun*clamp(sunVec.z+5.,0.0,6.);
// ambientDown += bouncedSun*clamp(sunVec.y+5.,0.0,6.);
// float avgLuma = 0.0;
// float m2 = 0.0;
// int n=100;
// vec2 clampedRes = max(1.0/texelSize,vec2(1920.0,1080.));
// float avgExp = 0.0;
// vec2 resScale = vec2(1920.,1080.)/clampedRes;
// float v[25];
// float temp;
// // 5x5 Median filter by morgan mcguire
// // We take the median value of the most blurred bloom buffer
// #define s2(a, b) temp = a; a = min(a, b); b = max(temp, b);
// #define t2(a, b) s2(v[a], v[b]);
// #define t24(a, b, c, d, e, f, g, h) t2(a, b); t2(c, d); t2(e, f); t2(g, h);
// #define t25(a, b, c, d, e, f, g, h, i, j) t24(a, b, c, d, e, f, g, h); t2(i, j);
// for (int i = 0; i < 5; i++){
// for (int j = 0; j < 5; j++){
// vec2 tc = 0.5 + vec2(i-2,j-2)/2.0 * 0.35;
// v[i+j*5] = luma(texture2D(colortex6,tc/128. * resScale+vec2(0.484375*resScale.x+10.5*texelSize.x,.0)).rgb);
// }
// }
// t25(0, 1, 3, 4, 2, 4, 2, 3, 6, 7);
// t25(5, 7, 5, 6, 9, 7, 1, 7, 1, 4);
// t25(12, 13, 11, 13, 11, 12, 15, 16, 14, 16);
// t25(14, 15, 18, 19, 17, 19, 17, 18, 21, 22);
// t25(20, 22, 20, 21, 23, 24, 2, 5, 3, 6);
// t25(0, 6, 0, 3, 4, 7, 1, 7, 1, 4);
// t25(11, 14, 8, 14, 8, 11, 12, 15, 9, 15);
// t25(9, 12, 13, 16, 10, 16, 10, 13, 20, 23);
// t25(17, 23, 17, 20, 21, 24, 18, 24, 18, 21);
// t25(19, 22, 8, 17, 9, 18, 0, 18, 0, 9);
// t25(10, 19, 1, 19, 1, 10, 11, 20, 2, 20);
// t25(2, 11, 12, 21, 3, 21, 3, 12, 13, 22);
// t25(4, 22, 4, 13, 14, 23, 5, 23, 5, 14);
// t25(15, 24, 6, 24, 6, 15, 7, 16, 7, 19);
// t25(3, 11, 5, 17, 11, 17, 9, 17, 4, 10);
// t25(6, 12, 7, 14, 4, 6, 4, 7, 12, 14);
// t25(10, 14, 6, 7, 10, 12, 6, 10, 6, 17);
// t25(12, 17, 7, 17, 7, 10, 12, 18, 7, 12);
// t24(10, 18, 12, 20, 10, 20, 10, 12);
// avgExp = v[12]; // Median value
// avgBrightness = clamp(mix(avgExp,texelFetch2D(colortex4,ivec2(10,37),0).g,0.95),0.00003051757,65000.0);
// float currentExposure = texelFetch2D(colortex4,ivec2(10,37),0).b;
// float L = max(avgBrightness,1e-8);
// float keyVal = 1.03-2.0/(log(L+1.0)/log(10.0)+2.0);
// float targetExposure = 1.0*keyVal/L;
// float targetrodExposure = clamp(log(targetExposure*2.0+1.0)-0.1,0.0,2.0);
// float currentrodExposure = texelFetch2D(colortex4,ivec2(14,37),0).r;
// targetExposure = clamp(targetExposure,2.0,3.0);
// float rad = sqrt(currentExposure);
// float rtarget = sqrt(targetExposure);
// float dir = sign(rtarget-rad);
// float dist = abs(rtarget-rad);
// float maxApertureChange = 0.0032*frameTime/0.016666*Exposure_Speed * exp2(max(rad,rtarget)*0.5);
// maxApertureChange *= 1.0+nightVision*4.;
// rad = rad+dir*min(dist,maxApertureChange);
// exposureF = rad*rad;
// exposure=exposureF*EXPOSURE_MULTIPLIER;
// dir = sign(targetrodExposure-currentrodExposure);
// dist = abs(targetrodExposure-currentrodExposure);
// maxApertureChange = 0.0032*frameTime/0.016666*Exposure_Speed * exp2(max(rad,rtarget)*0.5);
// rodExposure = currentrodExposure + dir * min(dist,maxApertureChange);
exposure = 1.0 ;
rodExposure = clamp ( log ( 1.0 * 2.0 + 1.0 ) - 0.1 , 0.0 , 2.0 ) ;
2023-01-12 15:00:14 -05:00
}