2026-05-01 13:07:13 +02:00

431 lines
17 KiB
GLSL

/////////////////////////////////////
// Complementary Shaders by EminGT //
/////////////////////////////////////
//Common//
#include "/lib/common.glsl"
#include "/lib/shaderSettings/composite1.glsl"
#include "/lib/shaderSettings/endBeams.glsl"
#include "/lib/shaderSettings/overworldBeams.glsl"
#include "/lib/shaderSettings/longExposure.glsl"
#define NETHER_STORM
#define NETHER_STORM_LOWER_ALT 28 //[-296 -292 -288 -284 -280 -276 -272 -268 -264 -260 -256 -252 -248 -244 -240 -236 -232 -228 -224 -220 -216 -212 -208 -204 -200 -196 -192 -188 -184 -180 -176 -172 -168 -164 -160 -156 -152 -148 -144 -140 -136 -132 -128 -124 -120 -116 -112 -108 -104 -100 -96 -92 -88 -84 -80 -76 -72 -68 -64 -60 -56 -52 -48 -44 -40 -36 -32 -28 -24 -20 -16 -12 -8 -4 0 4 8 12 16 20 22 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 100 104 108 112 116 120 124 128 132 136 140 144 148 152 156 160 164 168 172 176 180 184 188 192 196 200 204 208 212 216 220 224 228 232 236 240 244 248 252 256 260 264 268 272 276 280 284 288 292 296 300]
#define NETHER_STORM_HEIGHT 200 //[25 30 35 40 45 50 55 60 65 70 75 80 85 90 95 100 110 120 130 140 150 160 170 180 190 200 220 240 260 280 300 325 350 375 400 425 450 475 500 550 600 650 700 750 800 850 900]
#define NETHER_STORM_I 0.40 //[0.05 0.06 0.07 0.08 0.09 0.10 0.12 0.14 0.16 0.18 0.22 0.26 0.30 0.35 0.40 0.45 0.50 0.55 0.60 0.65 0.70 0.75 0.80 0.85 0.90 0.95 1.00 1.05 1.10 1.15 1.20 1.25 1.30 1.35 1.40 1.45 1.50]
#ifndef NETHER
#undef NETHER_STORM
#endif
#define COLORED_LIGHT_FOG_RAIN_I 0 //[0 5 10 15 20 25 30 35 40 45 50 55 60 65 70 75 80 85 90 95 100 105 110 115 120 125 130 135 140 145 150 155 160 165 170 175 180 185 190 195 200]
#ifdef COLORED_LIGHT_FOG_RAIN_I
#endif
//////////Fragment Shader//////////Fragment Shader//////////Fragment Shader//////////
#ifdef FRAGMENT_SHADER
noperspective in vec2 texCoord;
flat in vec3 upVec, sunVec;
#ifdef LIGHTSHAFTS_ACTIVE
flat in float vlFactor;
#endif
//Pipeline Constants//
//Common Variables//
float SdotU = dot(sunVec, upVec);
float sunFactor = SdotU < 0.0 ? clamp(SdotU + 0.375, 0.0, 0.75) / 0.75 : clamp(SdotU + 0.03125, 0.0, 0.0625) / 0.0625;
float sunVisibility = clamp(SdotU + 0.0625, 0.0, 0.125) / 0.125;
float sunVisibility2 = sunVisibility * sunVisibility;
vec2 view = vec2(viewWidth, viewHeight);
#ifdef OVERWORLD
vec3 lightVec = sunVec * ((timeAngle < 0.5325 || timeAngle > 0.9675) ? 1.0 : -1.0);
#else
vec3 lightVec = sunVec;
#endif
#ifdef LIGHTSHAFTS_ACTIVE
float shadowTimeVar1 = abs(sunVisibility - 0.5) * 2.0;
float shadowTimeVar2 = shadowTimeVar1 * shadowTimeVar1;
float shadowTime = shadowTimeVar2 * shadowTimeVar2;
float vlTime = min(abs(SdotU) - 0.05, 0.15) / 0.15;
#endif
//Common Functions//
float GetLinearDepth(float depth) {
return (2.0 * near) / (far + near - depth * (far - near));
}
//Includes//
#include "/lib/atmospherics/fog/waterFog.glsl"
#include "/lib/atmospherics/fog/caveFactor.glsl"
#if defined PBR_REFLECTIONS || WATER_REFLECT_QUALITY > 0 && WORLD_SPACE_REFLECTIONS_INTERNAL > 0
#include "/lib/materials/materialMethods/reflectionBlurFilter.glsl"
#endif
#ifdef BLOOM_FOG_COMPOSITE1
#include "/lib/atmospherics/fog/bloomFog.glsl"
#endif
#ifdef ATM_COLOR_MULTS
#include "/lib/colors/colorMultipliers.glsl"
#endif
#ifdef AURORA_INFLUENCE
#include "/lib/atmospherics/auroraBorealis.glsl"
#endif
#ifdef LIGHTSHAFTS_ACTIVE
#if defined END && defined END_BEAMS
#include "/lib/atmospherics/enderBeams.glsl"
#elif defined OVERWORLD && defined OVERWORLD_BEAMS
#include "/lib/atmospherics/overworldBeams.glsl"
#endif
#include "/lib/atmospherics/volumetricLight.glsl"
#endif
#if WATER_MAT_QUALITY >= 3 || defined NETHER_STORM || defined COLORED_LIGHT_FOG || END_CRYSTAL_VORTEX_INTERNAL > 0 || DRAGON_DEATH_EFFECT_INTERNAL > 0 || defined END_PORTAL_BEAM_INTERNAL || (defined END && END_CENTER_LIGHTING > 0 && MC_VERSION >= 10900)
#include "/lib/util/spaceConversion.glsl"
#endif
#if WATER_MAT_QUALITY >= 3
#include "/lib/materials/materialMethods/refraction.glsl"
#endif
#ifdef NETHER_STORM
#include "/lib/atmospherics/netherStorm.glsl"
#endif
#ifdef MOON_PHASE_INF_ATMOSPHERE
#include "/lib/colors/moonPhaseInfluence.glsl"
#endif
#if RAINBOWS > 0 && defined OVERWORLD
#include "/lib/atmospherics/rainbow.glsl"
#endif
#ifdef COLORED_LIGHT_FOG
#include "/lib/voxelization/lightVoxelization.glsl"
#include "/lib/atmospherics/fog/coloredLightFog.glsl"
#endif
#if END_CRYSTAL_VORTEX_INTERNAL > 0 || DRAGON_DEATH_EFFECT_INTERNAL > 0
#include "/lib/atmospherics/endCrystalVortex.glsl"
#endif
#ifdef END_PORTAL_BEAM_INTERNAL
#include "/lib/atmospherics/endPortalBeam.glsl"
#endif
//Program//
void main() {
vec3 color = texelFetch(colortex0, texelCoord, 0).rgb;
float z0 = texelFetch(depthtex0, texelCoord, 0).r;
float z1 = texelFetch(depthtex1, texelCoord, 0).r;
vec4 screenPos = vec4(texCoord, z0, 1.0);
vec4 viewPos = gbufferProjectionInverse * (screenPos * 2.0 - 1.0);
viewPos /= viewPos.w;
float lViewPos = length(viewPos.xyz);
#if defined DISTANT_HORIZONS && !defined OVERWORLD
float z0DH = texelFetch(dhDepthTex, texelCoord, 0).r;
vec4 screenPosDH = vec4(texCoord, z0DH, 1.0);
vec4 viewPosDH = dhProjectionInverse * (screenPosDH * 2.0 - 1.0);
viewPosDH /= viewPosDH.w;
lViewPos = min(lViewPos, length(viewPosDH.xyz));
#endif
float dither = texture2DLod(noisetex, texCoord * view / 128.0, 0.0).b;
#ifdef TAA
dither = fract(dither + goldenRatio * mod(float(frameCounter), 3600.0));
#endif
/* TM5723: The "1.0 - translucentMult" trick is done because of the default color attachment
value being vec3(0.0). This makes it vec3(1.0) to avoid issues especially on improved glass */
vec3 translucentMult = 1.0 - texelFetch(colortex3, texelCoord, 0).rgb; //TM5723
vec4 volumetricEffect = vec4(0.0);
vec2 texCoordM = texCoord;
#if WATER_MAT_QUALITY >= 3
texCoordM = DoRefraction(color, z0, z1, viewPos.xyz, lViewPos);
#endif
#if defined PBR_REFLECTIONS || WATER_REFLECT_QUALITY > 0 && WORLD_SPACE_REFLECTIONS_INTERNAL > 0
if (z0 < 1.0) {
vec4 compositeReflection = texture2D(colortex7, texCoord);
// Partial fix for half resolution WSR-only reflections having a lot of sky gaps
#if WORLD_SPACE_REF_MODE == 1
if (REFLECTION_RES < 0.6) {
vec2 refOffsets[4] = vec2[4](
vec2( 1.0, 1.0),
vec2(-1.0, 1.0),
vec2( 1.0,-1.0),
vec2(-1.0,-1.0)
);
for (int i = 0; i < 4; i++) {
vec4 compositeRefSample = texture2D(colortex7, texCoord + refOffsets[i] * 1.5 / view);
if (compositeRefSample.a > compositeReflection.a * 1.01) compositeReflection = compositeRefSample;
}
}
#endif
float fresnelM = pow2(texture2D(colortex4, texCoord).a); // including attenuation through fog and clouds
if (abs(fresnelM - 0.5) < 0.5) { // 0.0 fresnel doesnt need ref calculations, and 1.0 fresnel basically means error
if (z0 == z1 || z0 <= 0.56) { // Solids
#ifdef PBR_REFLECTIONS
if (fresnelM > 0.00001) {
compositeReflection = sampleBlurFilteredReflection(compositeReflection, dither, z0);
compositeReflection.rgb = max(compositeReflection.rgb, vec3(0.0)); // We seem to have some negative values for some reason
// This physically doesn't make sense but fits Minecraft
const float texturePreservation = 0.7;
compositeReflection.rgb = mix(compositeReflection.rgb, max(color, compositeReflection.rgb), texturePreservation);
color = mix(color, compositeReflection.rgb, fresnelM);
}
#endif
}
#if WORLD_SPACE_REFLECTIONS_INTERNAL > 0
else { // Translucents
vec4 ssrReflection = texture2D(colortex8, texCoordM);
color = max(color - ssrReflection.rgb, vec3(0.0));
compositeReflection.rgb *= fresnelM;
compositeReflection = mix(compositeReflection, ssrReflection, float(ssrReflection.a > 0.999));
vec3 combinedRef = mix(ssrReflection.rgb, compositeReflection.rgb, compositeReflection.a);
color += combinedRef;
}
#endif
}
}
#endif
vec4 screenPos1 = vec4(texCoord, z1, 1.0);
vec4 viewPos1 = gbufferProjectionInverse * (screenPos1 * 2.0 - 1.0);
viewPos1 /= viewPos1.w;
float lViewPos1 = length(viewPos1.xyz);
#if defined DISTANT_HORIZONS && !defined OVERWORLD
float z1DH = texelFetch(dhDepthTex1, texelCoord, 0).r;
vec4 screenPos1DH = vec4(texCoord, z1DH, 1.0);
vec4 viewPos1DH = dhProjectionInverse * (screenPos1DH * 2.0 - 1.0);
viewPos1DH /= viewPos1DH.w;
lViewPos1 = min(lViewPos1, length(viewPos1DH.xyz));
#endif
#if defined LIGHTSHAFTS_ACTIVE || RAINBOWS > 0 && defined OVERWORLD
vec3 nViewPos = normalize(viewPos1.xyz);
float VdotL = dot(nViewPos, lightVec);
float VdotU = dot(nViewPos, upVec);
#endif
#if defined NETHER_STORM || defined COLORED_LIGHT_FOG || END_CRYSTAL_VORTEX_INTERNAL > 0 || DRAGON_DEATH_EFFECT_INTERNAL > 0 || defined END_PORTAL_BEAM_INTERNAL || (defined END && END_CENTER_LIGHTING > 0 && MC_VERSION >= 10900)
vec3 playerPos = ViewToPlayer(viewPos1.xyz);
vec3 nPlayerPos = normalize(playerPos);
#endif
#if RAINBOWS > 0 && defined OVERWORLD
color += GetRainbow(translucentMult, nViewPos, z0, z1, lViewPos, lViewPos1, VdotL, VdotU, dither);
#endif
float vlFactorM = 0.0;
#ifdef LIGHTSHAFTS_ACTIVE
vlFactorM = vlFactor;
volumetricEffect = GetVolumetricLight(color, vlFactorM, translucentMult, lViewPos, lViewPos1, nViewPos, VdotL, VdotU, texCoord, z0, z1, dither);
#endif
float lightFogLength = 0.0;
#if END_CRYSTAL_VORTEX_INTERNAL > 0 || DRAGON_DEATH_EFFECT_INTERNAL > 0
vec4 endCrystalVortex = pow2(EndCrystalVortices(vec3(0.0), playerPos, dither));
volumetricEffect = sqrt(pow2(volumetricEffect) + endCrystalVortex);
lightFogLength = sqrt(pow2(lightFogLength) + length(endCrystalVortex.rgb));
#endif
#ifdef NETHER_STORM
volumetricEffect = GetNetherStorm(color, translucentMult, nPlayerPos, playerPos, lViewPos, lViewPos1, dither);
#endif
#ifdef ATM_COLOR_MULTS
volumetricEffect.rgb *= GetAtmColorMult();
#endif
#ifdef MOON_PHASE_INF_ATMOSPHERE
volumetricEffect.rgb *= moonPhaseInfluence;
#endif
#ifdef END_PORTAL_BEAM_INTERNAL
vec4 endPortalBeam = pow2(GetEndPortalBeam(vec3(0.0), playerPos));
volumetricEffect = sqrt(pow2(volumetricEffect) + endPortalBeam);
lightFogLength = sqrt(pow2(lightFogLength) + length(endPortalBeam.rgb));
#endif
#ifdef NETHER_STORM
color = mix(color, volumetricEffect.rgb, volumetricEffect.a);
#endif
#ifdef COLORED_LIGHT_FOG
vec3 lightFog = GetColoredLightFog(nPlayerPos, translucentMult, lViewPos, lViewPos1, dither, vlFactorM);
float lightFogMult = COLORED_LIGHT_FOG_I;
lightFogLength += length(lightFog);
//if (heldItemId == 40000 && heldItemId2 != 40000) lightFogMult = 0.0; // Hold spider eye to disable light fog
#ifdef OVERWORLD
#if COLORED_LIGHT_FOG_RAIN_I > 0
lightFogMult = mix(lightFogMult, COLORED_LIGHT_FOG_RAIN_I * 0.01, rainFactor * inRainy);
#endif
lightFogMult *= 0.2 + 0.6 * mix(1.0, 1.0 - sunFactor * invRainFactor, eyeBrightnessM);
#endif
#endif
if (isEyeInWater == 1) {
if (z0 == 1.0) color.rgb = waterFogColor;
vec3 underwaterMult = vec3(0.80, 0.87, 0.97);
#if DARKER_DEPTH_OCEANS > 0
vec4 texture6 = texelFetch(colortex6, texelCoord, 0);
float renderDistanceFade = lViewPos * 20.0 / far;
float lightSourceFactor = pow3(1.0 - texture6.a);
lightSourceFactor += renderDistanceFade;
lightSourceFactor = clamp01(lightSourceFactor);
float heldLight = max(heldBlockLightValue, heldBlockLightValue2);
if (heldLight > 0){
if (heldItemId == 45032 || heldItemId2 == 45032) heldLight = 15; // Lava Bucket
heldLight = clamp(heldLight, 0.0, 15.0);
heldLight = sqrt2(heldLight / 15.0) * -1.0 + 1.0; // Normalize and invert
heldLight = mix(heldLight, 1.0, clamp01((lViewPos) * 35.0 / far)); // Only do it around the player
} else {
heldLight = 1.0;
}
float mixFactor = heldLight * lightSourceFactor * (1.0 - nightVision);
float waterDepthStart = waterAltitude + 10;
float depthFactor = clamp01(10.0 / abs(min(cameraPosition.y, waterDepthStart + 0.001) - waterDepthStart));
float depthDarkness = clamp(abs(1.0 - (1.0 - depthFactor) * (1.0 - depthFactor)), DARKER_DEPTH_OCEANS * 0.05, 1.0);
underwaterMult *= mix(1.0, depthDarkness, mixFactor);
#endif
color.rgb *= underwaterMult * 0.85;
volumetricEffect.rgb *= pow2(underwaterMult * 0.71);
#ifdef COLORED_LIGHT_FOG
lightFog *= underwaterMult;
#endif
} else if (isEyeInWater == 2) {
if (z1 == 1.0) color.rgb = fogColor * 5.0;
#ifdef SOUL_SAND_VALLEY_OVERHAUL_INTERNAL
color.rgb = changeColorFunction(color.rgb, 1.0, colorSoul, inSoulValley);
#endif
#ifdef PURPLE_END_FIRE_INTERNAL
color.rgb = changeColorFunction(color.rgb, 1.0, colorEndBreath, 1.0);
#endif
volumetricEffect.rgb *= 0.0;
#ifdef COLORED_LIGHT_FOG
lightFog *= 0.0;
#endif
}
#ifdef COLORED_LIGHT_FOG
color /= 1.0 + pow2(GetLuminance(lightFog)) * lightFogMult * 2.0;
lightFog = lightFog * lightFogMult * 0.5;
#ifdef TAA
// TAA neighbourhood clamping causes light fog to go too bandy. Extra dither fixes it.
lightFog = max(vec3(0.0), lightFog + (dither - 0.5) * 0.02);
#endif
color += lightFog;
#endif
color = pow(color, vec3(2.2));
#if defined LIGHTSHAFTS_ACTIVE || defined END_PORTAL_BEAM_INTERNAL
#ifdef END
volumetricEffect.rgb *= volumetricEffect.rgb;
#endif
color += volumetricEffect.rgb;
#endif
#ifdef BLOOM_FOG_COMPOSITE1
color *= GetBloomFog(lViewPos); // Reminder: Bloom Fog can move between composite1-2-3
#endif
#if RETRO_LOOK == 1
color.rgb *= vec3(RETRO_LOOK_R, RETRO_LOOK_G, RETRO_LOOK_B) * 0.5 * RETRO_LOOK_I;
#elif RETRO_LOOK == 2
color.rgb *= mix(vec3(1.0), vec3(RETRO_LOOK_R, RETRO_LOOK_G, RETRO_LOOK_B) * 0.5, nightVision) * RETRO_LOOK_I;
#endif
/* DRAWBUFFERS:0 */
gl_FragData[0] = vec4(color, 1.0);
#if LIGHTSHAFT_QUALI_DEFINE > 0 && LIGHTSHAFT_BEHAVIOUR == 1 && SHADOW_QUALITY >= 1 && defined OVERWORLD || defined END || END_CRYSTAL_VORTEX_INTERNAL > 0 || DRAGON_DEATH_EFFECT_INTERNAL > 0 || defined END_PORTAL_BEAM_INTERNAL || defined COLORED_LIGHT_FOG
vec4 texture5 = vec4(0.0);
#if LENSFLARE_MODE > 0 || defined ENTITY_TAA_NOISY_CLOUD_FIX || END_CRYSTAL_VORTEX_INTERNAL > 0 || DRAGON_DEATH_EFFECT_INTERNAL > 0 || defined END_PORTAL_BEAM_INTERNAL || defined COLORED_LIGHT_FOG
texture5 = texelFetch(colortex5, texelCoord, 0);
if (viewWidth + viewHeight - gl_FragCoord.x - gl_FragCoord.y > 1.5)
vlFactorM = texture5.a;
#endif
texture5.r = sqrt(pow2(texture5.r) + lightFogLength);
/* DRAWBUFFERS:05 */
gl_FragData[1] = vec4(texture5.r, 0.0, 0.0, vlFactorM);
#endif
}
#endif
//////////Vertex Shader//////////Vertex Shader//////////Vertex Shader//////////
#ifdef VERTEX_SHADER
noperspective out vec2 texCoord;
flat out vec3 upVec, sunVec;
#ifdef LIGHTSHAFTS_ACTIVE
flat out float vlFactor;
#endif
//Attributes//
//Common Variables//
//Common Functions//
//Includes//
//Program//
void main() {
gl_Position = ftransform();
texCoord = (gl_TextureMatrix[0] * gl_MultiTexCoord0).xy;
upVec = normalize(gbufferModelView[1].xyz);
sunVec = GetSunVector();
#ifdef LIGHTSHAFTS_ACTIVE
#if LIGHTSHAFT_BEHAVIOUR == 1 && SHADOW_QUALITY >= 1 || defined END
vlFactor = texelFetch(colortex5, ivec2(viewWidth-1, viewHeight-1), 0).a;
#else
#if LIGHTSHAFT_BEHAVIOUR == 2
vlFactor = 0.0;
#elif LIGHTSHAFT_BEHAVIOUR == 3
vlFactor = 1.0;
#endif
#endif
#endif
}
#endif