mirror of
https://github.com/X0nk/Bliss-Shader.git
synced 2025-01-04 00:23:41 +08:00
25a2284a60
FIXED AND IMPROVED translucent rendering. FIXED random stuff from rendering over the hand. FIXED hand shading. FIXED blue horses. FIXED translucent lighting on the hand. FIXED translucent lighting on entities. IMPROVED colored shadows. IMPROVED SSAO application to the scene. IMPROVED subsurface scattering and give it more settings. IMPROVED bloom. ADD AgX tonemap and make it default.
231 lines
8.6 KiB
GLSL
231 lines
8.6 KiB
GLSL
#include "/lib/settings.glsl"
|
|
#include "/lib/res_params.glsl"
|
|
|
|
uniform float frameTimeCounter;
|
|
#include "/lib/Shadow_Params.glsl"
|
|
|
|
|
|
|
|
flat varying vec3 averageSkyCol_Clouds;
|
|
flat varying vec3 averageSkyCol;
|
|
|
|
flat varying vec3 sunColor;
|
|
flat varying vec3 moonColor;
|
|
flat varying vec3 lightSourceColor;
|
|
flat varying vec3 zenithColor;
|
|
|
|
flat varying vec2 tempOffsets;
|
|
|
|
flat varying float exposure;
|
|
flat varying float avgBrightness;
|
|
flat varying float rodExposure;
|
|
flat varying float avgL2;
|
|
flat varying float centerDepth;
|
|
|
|
flat varying vec4 dailyWeatherParams0;
|
|
flat varying vec4 dailyWeatherParams1;
|
|
|
|
uniform sampler2D colortex4;
|
|
uniform sampler2D colortex6;
|
|
uniform sampler2D depthtex0;
|
|
uniform sampler2D depthtex1;
|
|
uniform sampler2D depthtex2;
|
|
|
|
uniform mat4 gbufferModelViewInverse;
|
|
uniform vec3 sunPosition;
|
|
uniform vec2 texelSize;
|
|
uniform float sunElevation;
|
|
uniform float eyeAltitude;
|
|
uniform float near;
|
|
// uniform float far;
|
|
uniform float frameTime;
|
|
uniform int frameCounter;
|
|
uniform float rainStrength;
|
|
|
|
// uniform int worldTime;
|
|
vec3 sunVec = normalize(mat3(gbufferModelViewInverse) * sunPosition);
|
|
|
|
// vec3 sunVec = normalize(LightDir);
|
|
|
|
#include "/lib/sky_gradient.glsl"
|
|
#include "/lib/util.glsl"
|
|
#include "/lib/ROBOBO_sky.glsl"
|
|
|
|
float luma(vec3 color) {
|
|
return dot(color,vec3(0.21, 0.72, 0.07));
|
|
}
|
|
vec3 rodSample(vec2 Xi)
|
|
{
|
|
float r = sqrt(1.0f - Xi.x*Xi.y);
|
|
float phi = 2 * 3.14159265359 * Xi.y;
|
|
|
|
return normalize(vec3(cos(phi) * r, sin(phi) * r, Xi.x)).xzy;
|
|
}
|
|
//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);
|
|
}
|
|
float tanh(float x){
|
|
return (exp(x) - exp(-x))/(exp(x) + exp(-x));
|
|
}
|
|
float ld(float depth) {
|
|
return (2.0 * near) / (far + near - depth * (far - near)); // (-depth * (far - near)) = (2.0 * near)/ld - far - near
|
|
}
|
|
|
|
uniform float nightVision;
|
|
|
|
uniform int worldDay;
|
|
void getWeatherParams(
|
|
inout vec4 weatherParams0,
|
|
inout vec4 weatherParams1,
|
|
|
|
float layer0_coverage,
|
|
float layer1_coverage,
|
|
float layer2_coverage,
|
|
float uniformFog_density,
|
|
|
|
float layer0_density,
|
|
float layer1_density,
|
|
float layer2_density,
|
|
float cloudyFog_density
|
|
){
|
|
weatherParams0 = vec4(layer0_coverage, layer1_coverage, layer2_coverage, uniformFog_density);
|
|
weatherParams1 = vec4(layer0_density, layer1_density, layer2_density, cloudyFog_density);
|
|
}
|
|
|
|
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;
|
|
|
|
#ifdef OVERWORLD_SHADER
|
|
|
|
///////////////////////////////////
|
|
/// --- AMBIENT LIGHT STUFF --- ///
|
|
///////////////////////////////////
|
|
|
|
averageSkyCol_Clouds = vec3(0.0);
|
|
averageSkyCol = vec3(0.0);
|
|
|
|
vec2 sample3x3[9] = vec2[](
|
|
|
|
vec2(-1.0, -0.3),
|
|
vec2( 0.0, 0.0),
|
|
vec2( 1.0, -0.3),
|
|
|
|
vec2(-1.0, -0.5),
|
|
vec2( 0.0, -0.5),
|
|
vec2( 1.0, -0.5),
|
|
|
|
vec2(-1.0, -1.0),
|
|
vec2( 0.0, -1.0),
|
|
vec2( 1.0, -1.0)
|
|
);
|
|
|
|
// sample in a 3x3 pattern to get a good area for average color
|
|
|
|
int maxIT = 9;
|
|
// int maxIT = 20;
|
|
for (int i = 0; i < maxIT; i++) {
|
|
vec3 pos = vec3(0.0,1.0,0.0);
|
|
pos.xy += normalize(sample3x3[i]) * vec2(0.3183,0.9000);
|
|
|
|
averageSkyCol_Clouds += 1.5 * (skyCloudsFromTex(pos,colortex4).rgb/maxIT/150.0);
|
|
averageSkyCol += 1.5 * (skyFromTex(pos,colortex4).rgb/maxIT/150.0);
|
|
}
|
|
|
|
// only need to sample one spot for this
|
|
// averageSkyCol_Clouds = max(averageSkyCol_Clouds * (1.0/(luma(averageSkyCol_Clouds)*0.25+0.75)), minimumlight);
|
|
// averageSkyCol = max(averageSkyCol*PLANET_GROUND_BRIGHTNESS, minimumlight);
|
|
|
|
// maximum control of color and luminance
|
|
vec3 minimumlight = vec3(0.2,0.4,1.0) * (MIN_LIGHT_AMOUNT*0.003 + nightVision);
|
|
averageSkyCol_Clouds = max( normalize(averageSkyCol_Clouds) * min(luma(averageSkyCol_Clouds) * 3.0,2.5), minimumlight);
|
|
averageSkyCol = max(averageSkyCol * PLANET_GROUND_BRIGHTNESS, minimumlight);
|
|
|
|
////////////////////////////////////////
|
|
/// --- SUNLIGHT/MOONLIGHT STUFF --- ///
|
|
////////////////////////////////////////
|
|
|
|
vec2 planetSphere = vec2(0.0);
|
|
|
|
float sunVis = clamp(sunElevation,0.0,0.05)/0.05*clamp(sunElevation,0.0,0.05)/0.05;
|
|
float moonVis = clamp(-sunElevation,0.0,0.05)/0.05*clamp(-sunElevation,0.0,0.05)/0.05;
|
|
|
|
vec3 skyAbsorb = vec3(0.0);
|
|
sunColor = calculateAtmosphere(vec3(0.0), sunVec, vec3(0.0,1.0,0.0), sunVec, -sunVec, planetSphere, skyAbsorb, 25,0.0);
|
|
sunColor = sunColorBase/4000.0 * skyAbsorb;
|
|
moonColor = moonColorBase/4000.0;
|
|
|
|
lightSourceColor = (sunVis >= 1e-5 ? sunColor * sunVis : moonColor * moonVis) ;
|
|
|
|
#endif
|
|
|
|
//////////////////////////////////
|
|
/// --- WEATHER PARAMETERS --- ///
|
|
//////////////////////////////////
|
|
|
|
#ifdef Daily_Weather
|
|
int dayCounter = int(mod(worldDay, 10));
|
|
|
|
if(dayCounter == 0) getWeatherParams(dailyWeatherParams0, dailyWeatherParams1, DAY0_l0_coverage, DAY0_l1_coverage, DAY0_l2_coverage, DAY0_ufog_density, DAY0_l0_density, DAY0_l1_density, DAY0_l2_density, DAY0_cfog_density);
|
|
if(dayCounter == 1) getWeatherParams(dailyWeatherParams0, dailyWeatherParams1, DAY1_l0_coverage, DAY1_l1_coverage, DAY1_l2_coverage, DAY1_ufog_density, DAY1_l0_density, DAY1_l1_density, DAY1_l2_density, DAY1_cfog_density);
|
|
if(dayCounter == 2) getWeatherParams(dailyWeatherParams0, dailyWeatherParams1, DAY2_l0_coverage, DAY2_l1_coverage, DAY2_l2_coverage, DAY2_ufog_density, DAY2_l0_density, DAY2_l1_density, DAY2_l2_density, DAY2_cfog_density);
|
|
if(dayCounter == 3) getWeatherParams(dailyWeatherParams0, dailyWeatherParams1, DAY3_l0_coverage, DAY3_l1_coverage, DAY3_l2_coverage, DAY3_ufog_density, DAY3_l0_density, DAY3_l1_density, DAY3_l2_density, DAY3_cfog_density);
|
|
if(dayCounter == 4) getWeatherParams(dailyWeatherParams0, dailyWeatherParams1, DAY4_l0_coverage, DAY4_l1_coverage, DAY4_l2_coverage, DAY4_ufog_density, DAY4_l0_density, DAY4_l1_density, DAY4_l2_density, DAY4_cfog_density);
|
|
if(dayCounter == 5) getWeatherParams(dailyWeatherParams0, dailyWeatherParams1, DAY5_l0_coverage, DAY5_l1_coverage, DAY5_l2_coverage, DAY5_ufog_density, DAY5_l0_density, DAY5_l1_density, DAY5_l2_density, DAY5_cfog_density);
|
|
if(dayCounter == 6) getWeatherParams(dailyWeatherParams0, dailyWeatherParams1, DAY6_l0_coverage, DAY6_l1_coverage, DAY6_l2_coverage, DAY6_ufog_density, DAY6_l0_density, DAY6_l1_density, DAY6_l2_density, DAY6_cfog_density);
|
|
if(dayCounter == 7) getWeatherParams(dailyWeatherParams0, dailyWeatherParams1, DAY7_l0_coverage, DAY7_l1_coverage, DAY7_l2_coverage, DAY7_ufog_density, DAY7_l0_density, DAY7_l1_density, DAY7_l2_density, DAY7_cfog_density);
|
|
if(dayCounter == 8) getWeatherParams(dailyWeatherParams0, dailyWeatherParams1, DAY8_l0_coverage, DAY8_l1_coverage, DAY8_l2_coverage, DAY8_ufog_density, DAY8_l0_density, DAY8_l1_density, DAY8_l2_density, DAY8_cfog_density);
|
|
if(dayCounter == 9) getWeatherParams(dailyWeatherParams0, dailyWeatherParams1, DAY9_l0_coverage, DAY9_l1_coverage, DAY9_l2_coverage, DAY9_ufog_density, DAY9_l0_density, DAY9_l1_density, DAY9_l2_density, DAY9_cfog_density);
|
|
#endif
|
|
|
|
//////////////////////////////
|
|
/// --- EXPOSURE STUFF --- ///
|
|
//////////////////////////////
|
|
|
|
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;
|
|
float avgB = 0.0;
|
|
vec2 resScale = vec2(1920.,1080.)/clampedRes;
|
|
const int maxITexp = 50;
|
|
float w = 0.0;
|
|
for (int i = 0; i < maxITexp; i++){
|
|
vec2 ij = R2_samples((frameCounter%2000)*maxITexp+i);
|
|
vec2 tc = 0.5 + (ij-0.5) * 0.7;
|
|
vec3 sp = texture2D(colortex6, tc/16. * resScale+vec2(0.375*resScale.x+4.5*texelSize.x,.0)).rgb;
|
|
avgExp += log(luma(sp));
|
|
avgB += log(min(dot(sp,vec3(0.07,0.22,0.71)),8e-2));
|
|
}
|
|
|
|
avgExp = exp(avgExp/maxITexp);
|
|
avgB = exp(avgB/maxITexp);
|
|
|
|
avgBrightness = clamp(mix(avgExp,texelFetch2D(colortex4,ivec2(10,37),0).g,0.95),0.00003051757,65000.0);
|
|
|
|
float L = max(avgBrightness,1e-8);
|
|
float keyVal = 1.03-2.0/(log(L*4000/150.*8./3.0+1.0)/log(10.0)+2.0);
|
|
float expFunc = 0.5+0.5*tanh(log(L));
|
|
float targetExposure = 0.18/log2(L*2.5+1.045)*0.62;
|
|
|
|
avgL2 = clamp(mix(avgB,texelFetch2D(colortex4,ivec2(10,37),0).b,0.985),0.00003051757,65000.0);
|
|
float targetrodExposure = max(0.012/log2(avgL2+1.002)-0.1,0.0)*1.2;
|
|
|
|
|
|
exposure = max(targetExposure*EXPOSURE_MULTIPLIER, 0);
|
|
float currCenterDepth = ld(texture2D(depthtex2, vec2(0.5)).r);
|
|
centerDepth = mix(sqrt(texelFetch2D(colortex4,ivec2(14,37),0).g/65000.0), currCenterDepth, clamp(DoF_Adaptation_Speed*exp(-0.016/frameTime+1.0)/(6.0+currCenterDepth*far),0.0,1.0));
|
|
centerDepth = centerDepth * centerDepth * 65000.0;
|
|
|
|
rodExposure = targetrodExposure;
|
|
|
|
#ifndef AUTO_EXPOSURE
|
|
exposure = Manual_exposure_value;
|
|
rodExposure = clamp(log(Manual_exposure_value*2.0+1.0)-0.1,0.0,2.0);
|
|
#endif
|
|
} |