Files
Gregtech-New-Bastards/.minecraft/shaderpacks/ComplementaryShaders_v4.6/shaders/program/composite1.glsl
2025-05-29 23:31:29 +02:00

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