258 lines
7.7 KiB
GLSL
258 lines
7.7 KiB
GLSL
/*
|
|
Complementary Shaders by EminGT, based on BSL Shaders by Capt Tatsu
|
|
*/
|
|
|
|
//Common//
|
|
#include "/lib/common.glsl"
|
|
|
|
//Varyings//
|
|
varying vec2 texCoord;
|
|
|
|
varying vec3 sunVec, upVec;
|
|
|
|
//////////Fragment Shader//////////Fragment Shader//////////Fragment Shader//////////
|
|
#ifdef FSH
|
|
|
|
//Uniforms//
|
|
uniform int isEyeInWater;
|
|
|
|
uniform float blindFactor;
|
|
uniform float rainStrengthS;
|
|
uniform float screenBrightness;
|
|
uniform float viewWidth, viewHeight;
|
|
|
|
uniform ivec2 eyeBrightnessSmooth;
|
|
|
|
uniform vec3 skyColor;
|
|
|
|
uniform mat4 gbufferProjectionInverse;
|
|
|
|
uniform sampler2D colortex0;
|
|
uniform sampler2D colortex1;
|
|
|
|
#ifdef VL_CLOUDS
|
|
uniform sampler2D colortex5;
|
|
#endif
|
|
|
|
#if NIGHT_VISION > 1
|
|
uniform float nightVision;
|
|
#endif
|
|
|
|
#if MC_VERSION >= 11900
|
|
uniform float darknessFactor;
|
|
#endif
|
|
|
|
//Optifine Constants//
|
|
#if !(LIGHT_SHAFT_QUALITY == 3)
|
|
const bool colortex1MipmapEnabled = true;
|
|
#endif
|
|
|
|
#ifdef VL_CLOUDS
|
|
const bool colortex5MipmapEnabled = true;
|
|
#endif
|
|
|
|
//Common Variables//
|
|
float eBS = eyeBrightnessSmooth.y / 240.0;
|
|
float sunVisibility = clamp(dot( sunVec,upVec) + 0.0625, 0.0, 0.125) * 8.0;
|
|
float sunVisibilityLSM = clamp(dot( sunVec,upVec) + 0.125, 0.0, 0.25) * 4.0;
|
|
float vsBrightness = clamp(screenBrightness, 0.0, 1.0);
|
|
float rainStrengthSp2 = rainStrengthS * rainStrengthS;
|
|
float lightShaftTime = pow(abs(sunVisibility - 0.5) * 2.0, 10.0);
|
|
float worldBrightness = max(timeBrightness, moonBrightness);
|
|
|
|
//Common Functions//
|
|
float GetLuminance(vec3 color) {
|
|
return dot(color,vec3(0.299, 0.587, 0.114));
|
|
}
|
|
|
|
//Includes//
|
|
#include "/lib/color/dimensionColor.glsl"
|
|
|
|
//Program//
|
|
void main() {
|
|
vec4 color = texture2D(colortex0,texCoord.xy);
|
|
|
|
#ifdef VL_CLOUDS
|
|
float offsetC = 2.0;
|
|
float lodC = 1.5;
|
|
vec4 clouds1 = texture2DLod(colortex5, texCoord.xy + vec2( 0.0, offsetC / viewHeight), lodC);
|
|
vec4 clouds2 = texture2DLod(colortex5, texCoord.xy + vec2( 0.0, -offsetC / viewHeight), lodC);
|
|
vec4 clouds3 = texture2DLod(colortex5, texCoord.xy + vec2( offsetC / viewWidth, 0.0), lodC);
|
|
vec4 clouds4 = texture2DLod(colortex5, texCoord.xy + vec2(-offsetC / viewWidth, 0.0), lodC);
|
|
vec4 clouds = (clouds1 + clouds2 + clouds3 + clouds4) * 0.25;
|
|
clouds *= clouds;
|
|
#endif
|
|
|
|
#ifdef END
|
|
vec3 vl = texture2DLod(colortex1, texCoord.xy, 1.5).rgb;
|
|
vl *= vl;
|
|
#else
|
|
#if LIGHT_SHAFT_QUALITY == 1
|
|
float lod = 1.0;
|
|
#elif LIGHT_SHAFT_QUALITY == 2
|
|
float lod = 0.5;
|
|
#else
|
|
float lod = 0.0;
|
|
#endif
|
|
|
|
#ifndef MC_GL_RENDERER_GEFORCE
|
|
if (fract(viewHeight / 2.0) > 0.25 || fract(viewWidth / 2.0) > 0.25)
|
|
lod = 0.0;
|
|
#endif
|
|
|
|
float offset = 1.0;
|
|
vec3 vl1 = texture2DLod(colortex1, texCoord.xy + vec2( 0.0, offset / viewHeight), lod).rgb;
|
|
vec3 vl2 = texture2DLod(colortex1, texCoord.xy + vec2( 0.0, -offset / viewHeight), lod).rgb;
|
|
vec3 vl3 = texture2DLod(colortex1, texCoord.xy + vec2( offset / viewWidth, 0.0), lod).rgb;
|
|
vec3 vl4 = texture2DLod(colortex1, texCoord.xy + vec2(-offset / viewWidth, 0.0), lod).rgb;
|
|
vec3 vlSum = (vl1 + vl2 + vl3 + vl4) * 0.25;
|
|
vec3 vl = vlSum;
|
|
|
|
vl *= vl;
|
|
#endif
|
|
#if MC_VERSION >= 11900
|
|
vl *= 1.0 - darknessFactor;
|
|
#endif
|
|
vec3 vlP = vl;
|
|
|
|
#ifdef OVERWORLD
|
|
if (isEyeInWater == 0) {
|
|
#if LIGHT_SHAFT_MODE == 2
|
|
vec4 screenPos = vec4(gl_FragCoord.xy / vec2(viewWidth, viewHeight), gl_FragCoord.z, 1.0);
|
|
vec4 viewPos = gbufferProjectionInverse * (screenPos * 2.0 - 1.0);
|
|
viewPos /= viewPos.w;
|
|
vec3 nViewPos = normalize(viewPos.xyz);
|
|
|
|
float NdotU = dot(nViewPos, upVec);
|
|
NdotU = max(NdotU, 0.0);
|
|
NdotU = 1.0 - NdotU;
|
|
if (NdotU > 0.5) NdotU = smoothstep(0.0, 1.0, NdotU);
|
|
NdotU *= NdotU;
|
|
NdotU *= NdotU;
|
|
NdotU = mix(NdotU, 1.0, rainStrengthSp2 * 0.75);
|
|
vl *= NdotU * NdotU;
|
|
#else
|
|
vec4 screenPos = vec4(gl_FragCoord.xy / vec2(viewWidth, viewHeight), gl_FragCoord.z, 1.0);
|
|
vec4 viewPos = gbufferProjectionInverse * (screenPos * 2.0 - 1.0);
|
|
viewPos /= viewPos.w;
|
|
vec3 nViewPos = normalize(viewPos.xyz);
|
|
|
|
float NdotU = dot(nViewPos, upVec);
|
|
NdotU = max(NdotU, 0.0);
|
|
NdotU = 1.0 - NdotU;
|
|
if (NdotU > 0.5) NdotU = smoothstep(0.0, 1.0, NdotU);
|
|
NdotU = mix(NdotU, 1.0, rainStrengthSp2 * 0.75);
|
|
NdotU = pow(NdotU, 8.0 * smoothstep(0.0, 1.0, pow2(1.0 - worldBrightness)));
|
|
vl *= max(NdotU, 0.0); // Using max() here fixes a bug that affects auto exposure
|
|
#endif
|
|
vlP = vl;
|
|
|
|
vec3 lightCol2 = lightCol * lightCol;
|
|
vec3 dayLightCol = lightCol2 * 0.73;
|
|
vec3 nightLightCol = lightCol2 * 20.0;
|
|
vec3 vlColor = mix(nightLightCol, dayLightCol, sunVisibility);
|
|
//duplicate 98765
|
|
vec3 weatherSky = weatherCol * weatherCol;
|
|
weatherSky *= GetLuminance(ambientCol / (weatherSky)) * 1.4;
|
|
weatherSky *= mix(SKY_RAIN_NIGHT, SKY_RAIN_DAY, sunVisibility);
|
|
weatherSky = max(weatherSky, skyColor * skyColor * 0.75); // Lightning Sky Color
|
|
weatherSky *= rainStrengthS;
|
|
vlColor = mix(vlColor, weatherSky * 10.0, rainStrengthSp2);
|
|
vl *= vlColor;
|
|
|
|
float rainMult = mix(LIGHT_SHAFT_NIGHT_RAIN_MULTIPLIER,
|
|
LIGHT_SHAFT_DAY_RAIN_MULTIPLIER * (0.65 + 0.2 * vsBrightness),
|
|
sunVisibility);
|
|
#if LIGHT_SHAFT_MODE == 2
|
|
vl *= mix(1.0, LIGHT_SHAFT_NOON_MULTIPLIER * 0.4, timeBrightness * (1.0 - rainStrengthS * 0.8));
|
|
vl *= mix(LIGHT_SHAFT_NIGHT_MULTIPLIER * 0.65, 2.0, sunVisibility);
|
|
vl *= mix(1.0, rainMult, rainStrengthSp2);
|
|
#else
|
|
float timeBrightnessSqrt = sqrt1(timeBrightness);
|
|
|
|
vl *= mix(1.0, LIGHT_SHAFT_NOON_MULTIPLIER * 0.75, timeBrightnessSqrt * (1.0 - rainStrengthS * 0.8));
|
|
vl *= mix(LIGHT_SHAFT_NIGHT_MULTIPLIER * (0.91 - moonBrightness * 0.39), 2.0, sunVisibility);
|
|
vl *= mix(1.0, rainMult, rainStrengthSp2);
|
|
#endif
|
|
} else vl *= length(lightCol) * 0.175 * LIGHT_SHAFT_UNDERWATER_MULTIPLIER * (1.0 - rainStrengthS * 0.85);
|
|
#endif
|
|
|
|
#ifdef END
|
|
vl *= endCol * 0.1 * LIGHT_SHAFT_THE_END_MULTIPLIER;
|
|
vl *= LIGHT_SHAFT_STRENGTH * (1.0 - rainStrengthS * eBS * 0.875) * shadowFade * (1.0 + isEyeInWater*1.5) * (1.0 - blindFactor);
|
|
#else
|
|
vl *= LIGHT_SHAFT_STRENGTH * shadowFade * (1.0 - blindFactor);
|
|
|
|
float vlFactor = (1.0 - min((timeBrightness)*2.0, 0.75));
|
|
vlFactor = mix(vlFactor, 0.05, rainStrengthS);
|
|
if (isEyeInWater == 1) vlFactor = 3.0;
|
|
vl *= vlFactor * 1.15;
|
|
#endif
|
|
|
|
#if NIGHT_VISION > 1
|
|
if (nightVision > 0.0) {
|
|
vl = vec3(0.0, length(vl), 0.0);
|
|
}
|
|
#endif
|
|
|
|
#ifdef END
|
|
color.rgb += vl;
|
|
#else
|
|
vec3 addedColor = color.rgb + vl * lightShaftTime;
|
|
#if LIGHT_SHAFT_MODE == 2
|
|
vec3 vlMixBlend = vlP * (1.0 - 0.5 * rainStrengthS);
|
|
#else
|
|
vec3 vlMixBlend = vlP * 0.5;
|
|
vlP *= 0.75;
|
|
#endif
|
|
float mixedTime = sunVisibility < 0.5 ?
|
|
sqrt3(max(moonBrightness - 0.3, 0.0) / 0.7) * lightShaftTime
|
|
: pow2(pow2((sunVisibilityLSM - 0.5) * 2.0));
|
|
vec3 mixedColor = mix(color.rgb, vl / max(vlP, 0.01), vlMixBlend * mixedTime);
|
|
color.rgb = mix(mixedColor, addedColor, sunVisibility * (1.0 - rainStrengthS));
|
|
#endif
|
|
|
|
#ifdef VL_CLOUDS
|
|
clouds.a *= CLOUD_OPACITY;
|
|
color.rgb = mix(color.rgb, clouds.rgb, clouds.a);
|
|
#endif
|
|
|
|
/*DRAWBUFFERS:0*/
|
|
gl_FragData[0] = color;
|
|
}
|
|
|
|
#endif
|
|
|
|
//////////Vertex Shader//////////Vertex Shader//////////Vertex Shader//////////
|
|
#ifdef VSH
|
|
|
|
//Uniforms//
|
|
|
|
uniform mat4 gbufferModelView;
|
|
|
|
//Common Variables//
|
|
#ifdef OVERWORLD
|
|
float timeAngleM = timeAngle;
|
|
#else
|
|
#if !defined SEVEN && !defined SEVEN_2
|
|
float timeAngleM = 0.25;
|
|
#else
|
|
float timeAngleM = 0.5;
|
|
#endif
|
|
#endif
|
|
|
|
//Program//
|
|
void main() {
|
|
texCoord = gl_MultiTexCoord0.xy;
|
|
|
|
gl_Position = ftransform();
|
|
|
|
const vec2 sunRotationData = vec2(cos(sunPathRotation * 0.01745329251994), -sin(sunPathRotation * 0.01745329251994));
|
|
float ang = fract(timeAngleM - 0.25);
|
|
ang = (ang + (cos(ang * 3.14159265358979) * -0.5 + 0.5 - ang) / 3.0) * 6.28318530717959;
|
|
sunVec = normalize((gbufferModelView * vec4(vec3(-sin(ang), cos(ang) * sunRotationData) * 2000.0, 1.0)).xyz);
|
|
|
|
upVec = normalize(gbufferModelView[1].xyz);
|
|
}
|
|
|
|
#endif |