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

522 lines
18 KiB
GLSL

//////////////////////////////////////////
// Complementary Shaders by EminGT //
// With Euphoria Patches by SpacEagle17 //
//////////////////////////////////////////
//Common//
#include "/lib/common.glsl"
#include "/lib/shaderSettings/enderStars.glsl"
#include "/lib/shaderSettings/deferred1.glsl"
//////////Fragment Shader//////////Fragment Shader//////////Fragment Shader//////////
#ifdef FRAGMENT_SHADER
noperspective in vec2 texCoord;
flat in vec3 upVec, sunVec, eastVec;
#if defined LIGHTSHAFTS_ACTIVE && (LIGHTSHAFT_BEHAVIOUR == 1 && SHADOW_QUALITY >= 1 || defined END)
flat in float vlFactor;
#endif
//Pipeline Constants//
const bool colortex0MipmapEnabled = true;
//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;
float shadowTimeVar1 = abs(sunVisibility - 0.5) * 2.0;
float shadowTimeVar2 = shadowTimeVar1 * shadowTimeVar1;
float shadowTime = shadowTimeVar2 * shadowTimeVar2;
float farMinusNear = far - near;
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
#if defined LIGHTSHAFTS_ACTIVE && (LIGHTSHAFT_BEHAVIOUR == 1 && SHADOW_QUALITY >= 1 || defined END)
#else
float vlFactor = 0.0;
#endif
#ifdef IRIS_FEATURE_FADE_VARIABLE
float chunkFade = 1.0;
#endif
//Common Functions//
float GetLinearDepth(float depth) {
return (2.0 * near) / (far + near - depth * farMinusNear);
}
// Improved linear depth calculation with safety checks
float CalculateLinearDepth(float depth_sample, float near_plane, float far_plane) {
if (far_plane == near_plane)
return depth_sample > 0.5 ? 1.0 : 0.0; // Avoid division by zero or undefined behavior
float far_minus_near = far_plane - near_plane;
if (far_plane + near_plane - depth_sample * far_minus_near == 0.0)
return 1.0; // Return max linear depth
return (2.0 * near_plane) / (far_plane + near_plane - depth_sample * far_minus_near);
}
#if SSAO_QUALI > 0
// Original offset distribution function
vec2 OffsetDist(float x, int s) {
float n = fract(x * 1.414) * 3.1415;
return pow2(vec2(cos(n), sin(n)) * x / s);
}
// Improved offset distribution function for DH SSAO
vec2 OffsetDistImproved(float x_norm, int s) {
float n = fract(x_norm * 1.41421356237f) * 6.28318530718f;
float radius_mult = x_norm;
return vec2(cos(n), sin(n)) * radius_mult;
}
// Original SSAO function for regular geometry
float DoAmbientOcclusion(float z0, float linearZ0, float dither, vec3 playerPos) {
if (z0 < 0.56) return 1.0;
float ao = 0.0;
#if SSAO_QUALI == 2
int samples = 4;
float scm = 0.4;
#elif SSAO_QUALI == 3
int samples = 12;
float scm = 0.6;
#endif
#define SSAO_I_FACTOR 0.004
float sampleDepth = 0.0, angle = 0.0, dist = 0.0;
float fovScale = gbufferProjection[1][1];
float distScale = max(farMinusNear * linearZ0 + near, 3.0);
vec2 scale = vec2(scm / aspectRatio, scm) * fovScale / distScale;
for (int i = 1; i <= samples; i++) {
vec2 offset = OffsetDist(i + dither, samples) * scale;
if (i % 2 == 0) offset.y = -offset.y;
vec2 coord1 = texCoord + offset;
vec2 coord2 = texCoord - offset;
sampleDepth = GetLinearDepth(texture2D(depthtex0, coord1).r);
float aosample = farMinusNear * (linearZ0 - sampleDepth) * 2.0;
angle = clamp(0.5 - aosample, 0.0, 1.0);
dist = clamp(0.5 * aosample - 1.0, 0.0, 1.0);
sampleDepth = GetLinearDepth(texture2D(depthtex0, coord2).r);
aosample = farMinusNear * (linearZ0 - sampleDepth) * 2.0;
angle += clamp(0.5 - aosample, 0.0, 1.0);
dist += clamp(0.5 * aosample - 1.0, 0.0, 1.0);
ao += clamp(angle + dist, 0.0, 1.0);
}
ao /= samples;
#define SSAO_IM SSAO_I * SSAO_I_FACTOR
#ifdef RAIN_ATMOSPHERE
vec3 lightningPos = getLightningPos(playerPos, lightningBoltPosition.xyz, false);
vec2 lightningAdd = lightningFlashEffect(lightningPos, vec3(0), 550.0, 0, 0) * isLightningActive() * 0.5;
ao += lightningAdd.y;
#endif
return pow(ao, SSAO_IM);
}
#ifdef DISTANT_HORIZONS
#include "/lib/misc/dhSSAO.glsl"
#endif
#endif
//Includes//
#include "/lib/util/spaceConversion.glsl"
#include "/lib/util/dither.glsl"
#include "/lib/atmospherics/fog/mainFog.glsl"
#include "/lib/colors/skyColors.glsl"
#include "/lib/colors/lightAndAmbientColors.glsl"
#include "/lib/atmospherics/fog/endCenterFog.glsl"
#if AURORA_STYLE > 0
#include "/lib/atmospherics/auroraBorealis.glsl"
#endif
#if NETHER_NOISE == 1 && defined NETHER
#include "/lib/atmospherics/netherNoise.glsl"
#endif
#ifdef BEDROCK_NOISE
#include "/lib/atmospherics/stars.glsl"
#endif
#if NIGHT_NEBULAE == 1
#include "/lib/atmospherics/nightNebula.glsl"
#endif
#ifdef VL_CLOUDS_ACTIVE
#include "/lib/atmospherics/clouds/mainClouds.glsl"
#endif
#if defined END && defined END_STARS
#include "/lib/atmospherics/enderStars.glsl"
#endif
#if defined WORLD_OUTLINE || RETRO_LOOK == 1 || RETRO_LOOK == 2
#include "/lib/misc/worldOutline.glsl"
#endif
#ifdef DARK_OUTLINE
#include "/lib/misc/darkOutline.glsl"
#endif
#ifdef ATM_COLOR_MULTS
#include "/lib/colors/colorMultipliers.glsl"
#endif
#ifdef MOON_PHASE_INF_ATMOSPHERE
#include "/lib/colors/moonPhaseInfluence.glsl"
#endif
#ifdef DISTANT_LIGHT_BOKEH
#include "/lib/misc/distantLightBokeh.glsl"
#endif
#ifdef BEDROCK_NOISE
#include "/lib/atmospherics/bedrockNoise.glsl"
#endif
#if defined END && EP_END_FLASH > 0 && MC_VERSION >= 12109 && defined IS_IRIS
#include "/lib/atmospherics/endFlash.glsl"
#endif
//Program//
void main() {
vec4 albedoTextureSample = texelFetch(colortex0, texelCoord, 0);
vec4 color = vec4(albedoTextureSample.rgb, 1.0);
float pixelVisibilityFactor = albedoTextureSample.a;
float z0 = texelFetch(depthtex0, 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);
vec3 nViewPos = normalize(viewPos.xyz);
vec3 playerPos = ViewToPlayer(viewPos.xyz);
float dither = texture2DLod(noisetex, texCoord * vec2(viewWidth, viewHeight) / 128.0, 0.0).b;
#ifdef TAA
dither = fract(dither + goldenRatio * mod(float(frameCounter), 3600.0));
#endif
#ifdef ATM_COLOR_MULTS
atmColorMult = GetAtmColorMult();
sqrtAtmColorMult = sqrt(atmColorMult);
#endif
float VdotU = dot(nViewPos, upVec);
float VdotS = dot(nViewPos, sunVec);
float skyFade = 0.0;
vec3 waterRefColor = vec3(0.0);
vec3 auroraBorealis = vec3(0.0);
vec3 nightNebula = vec3(0.0);
vec3 netherNoise = vec3(0.0);
vec3 bedrockNoise = vec3(0.0);
vec3 normalM = vec3(0);
float fresnelM = 0.0;
float linearZ0_DH;
vec4 texture6 = texelFetch(colortex6, texelCoord, 0).rgba;
if (z0 < 1.0) {
#ifdef DISTANT_LIGHT_BOKEH
int dlbo = 1;
vec3 dlbColor = color.rgb;
dlbColor += texelFetch(colortex0, texelCoord + ivec2( 0, dlbo), 0).rgb;
dlbColor += texelFetch(colortex0, texelCoord + ivec2( 0,-dlbo), 0).rgb;
dlbColor += texelFetch(colortex0, texelCoord + ivec2( dlbo, 0), 0).rgb;
dlbColor += texelFetch(colortex0, texelCoord + ivec2(-dlbo, 0), 0).rgb;
dlbColor = max(color.rgb, dlbColor * 0.2);
float dlbMix = GetDistantLightBokehMix(lViewPos);
color.rgb = mix(color.rgb, dlbColor, dlbMix);
#endif
#if SSAO_QUALI > 0 || defined WORLD_OUTLINE || RETRO_LOOK == 1 || RETRO_LOOK == 2
float linearZ0 = GetLinearDepth(z0);
#endif
#if SSAO_QUALI > 0
float ssao = DoAmbientOcclusion(z0, linearZ0, dither, playerPos);
#else
float ssao = 1.0;
#endif
bool entityOrParticle = z0 < 0.56;
int materialMaskInt = int(texture6.g * 255.1);
float intenseFresnel = 0.0;
float smoothnessD = texture6.r;
vec3 reflectColor = vec3(1.0);
#include "/lib/materials/materialHandling/deferredMaterials.glsl"
#ifdef WORLD_OUTLINE
#ifndef WORLD_OUTLINE_ON_ENTITIES
if (!entityOrParticle)
#endif
DoWorldOutline(color.rgb, linearZ0, pixelVisibilityFactor, playerPos, far);
#endif
#ifdef DARK_OUTLINE
DoDarkOutline(color.rgb, z0, pixelVisibilityFactor, playerPos, far);
#endif
color.rgb *= ssao;
#ifdef PBR_REFLECTIONS
vec3 texture4 = texelFetch(colortex4, texelCoord, 0).rgb;
normalM = mat3(gbufferModelView) * texture4;
float fresnel = clamp(1.0 + dot(normalM, nViewPos), 0.0, 1.0);
#if WORLD_SPACE_REFLECTIONS_INTERNAL == -1
// Way steeper fresnel falloff on SSR-only mode to hide SSR limitation and gain performance
float fresnelFactor = (1.0 - smoothnessD) * 0.7;
fresnelM = max(fresnel - fresnelFactor, 0.0) / (1.0 - fresnelFactor);
#else
fresnelM = fresnel * 0.7 + 0.3;
#endif
fresnelM = mix(pow2(fresnelM), fresnelM * 0.75 + 0.25, intenseFresnel);
fresnelM = fresnelM * sqrt1(smoothnessD) - dither * 0.01;
#endif
#ifdef IRIS_FEATURE_FADE_VARIABLE
chunkFade = texture6.b > 0.50001 ? (1.0 - texture6.b) * 2.0 : 1.0;
#endif
waterRefColor = color.rgb;
DoFog(color, skyFade, lViewPos, playerPos, VdotU, VdotS, dither, false, 0.0);
} else { // Sky
#ifdef DISTANT_HORIZONS
float z0DH = texelFetch(dhDepthTex, texelCoord, 0).r;
if (z0DH < 1.0) { // Distant Horizons Chunks
vec4 screenPosDH = vec4(texCoord, z0DH, 1.0);
vec4 viewPosDH = dhProjectionInverse * (screenPosDH * 2.0 - 1.0);
viewPosDH /= viewPosDH.w;
lViewPos = length(viewPosDH.xyz);
playerPos = ViewToPlayer(viewPosDH.xyz);
#if SSAO_QUALI > 0 || defined WORLD_OUTLINE || defined TEMPORAL_FILTER || RETRO_LOOK == 1 || RETRO_LOOK == 2
linearZ0_DH = CalculateLinearDepth(z0DH, dhNearPlane, dhFarPlane);
#endif
#if SSAO_QUALI > 0
float ssao_dh = DoAmbientOcclusionDH(z0DH, linearZ0_DH, dhDepthTex, dither, texture6.a);
color.rgb *= ssao_dh;
#endif
waterRefColor = color.rgb;
DoFog(color, skyFade, lViewPos, playerPos, VdotU, VdotS, dither, false, 0.0);
} else { // Start of Actual Sky
#endif
skyFade = 1.0;
#ifdef OVERWORLD
#if AURORA_STYLE > 0
auroraBorealis = GetAuroraBorealis(viewPos.xyz, VdotU, dither);
color.rgb += auroraBorealis;
#endif
#if NIGHT_NEBULAE == 1
nightNebula += GetNightNebula(viewPos.xyz, VdotU, VdotS);
color.rgb += nightNebula;
#endif
#endif
#ifdef NETHER
color.rgb = netherColor * (1.0 - maxBlindnessDarkness);
#ifdef ATM_COLOR_MULTS
color.rgb *= atmColorMult;
#endif
#endif
#ifdef END
color.rgb = endSkyColor;
#ifdef END_STARS
vec3 starColor = GetEnderStars(viewPos.xyz, VdotU, 1.0, 0.0);
#define ADD_STAR_LAYER_END1 (STAR_LAYER_END == 1 || STAR_LAYER_END == 3)
#define ADD_STAR_LAYER_END2 (STAR_LAYER_END == 2 || STAR_LAYER_END == 3)
#if ADD_STAR_LAYER_END1
starColor = max(starColor, GetEnderStars(viewPos.xyz, VdotU, 0.66, 0.0));
#endif
#if ADD_STAR_LAYER_END2
starColor = max(starColor, GetEnderStars(viewPos.xyz, VdotU, 2.2, 0.33));
#endif
color.rgb += starColor;
color.rgb *= 1.0 - maxBlindnessDarkness;
#endif
#if MC_VERSION >= 12109 && defined IS_IRIS && EP_END_FLASH > 0
if (endFlashIntensity > 0.0) {
color.rgb += DrawEndFlash(nViewPos, VdotU, dither);
}
#endif
#ifdef ATM_COLOR_MULTS
color.rgb *= atmColorMult;
#endif
#endif
#ifdef DISTANT_HORIZONS
} // End of Actual Sky
#endif
}
#if defined NETHER && NETHER_NOISE == 1
netherNoise = GetNetherNoise(viewPos.xyz, VdotU, dither);
color.rgb += pow4(skyFade) * netherNoise;
#endif
#ifdef END
#ifdef END_SMOKE
vec3 wpos = normalize((gbufferModelViewInverse * vec4(viewPos.xyz * 1000.0, 1.0)).xyz);
vec3 endSmoke = texture2DLod(noisetex, (wpos.xz / wpos.y) * 0.5 + frameTimeCounter * 0.004, 0.0).g * abs(VdotU) * endSkyColor * 1.5;
color.rgb += pow4(skyFade) * endSmoke * (1.0 - maxBlindnessDarkness);
#endif
#endif
float cloudLinearDepth = 1.0;
vec4 clouds = vec4(0.0);
#ifdef VL_CLOUDS_ACTIVE
float cloudZCheck = 0.56;
if (z0 > cloudZCheck) {
clouds = GetClouds(cloudLinearDepth, skyFade, vec3(0.0), playerPos, viewPos.xyz,
lViewPos, VdotS, VdotU, dither, auroraBorealis, nightNebula, sunVec);
color = mix(color, vec4(clouds.rgb, 0.0), clouds.a);
}
#endif
#ifdef SKY_EFFECT_REFLECTION
waterRefColor = mix(waterRefColor, clouds.rgb, clouds.a);
#endif
waterRefColor = sqrt(waterRefColor) * 0.5;
#if defined LIGHTSHAFTS_ACTIVE && (LIGHTSHAFT_BEHAVIOUR == 1 && SHADOW_QUALITY >= 1 || defined END)
if (viewWidth + viewHeight - gl_FragCoord.x - gl_FragCoord.y < 1.5)
cloudLinearDepth = vlFactor;
#endif
#if defined OVERWORLD && defined ATMOSPHERIC_FOG && (defined SPECIAL_BIOME_WEATHER || RAIN_STYLE == 2)
if (isEyeInWater == 0) {
float altitudeFactorRaw = GetAtmFogAltitudeFactor(playerPos.y + cameraPosition.y);
vec3 atmFogColor = GetAtmFogColor(altitudeFactorRaw, VdotS);
#if RAIN_STYLE == 2
float factor = 1.0;
#else
float factor = max(inSnowy, inDry);
#endif
color = mix(color, vec4(atmFogColor, 0.0), 0.5 * rainFactor * factor * sqrt1(skyFade));
}
#endif
#if defined OVERWORLD || defined NETHER
#ifdef BEDROCK_NOISE
bedrockNoise = GetBedrockNoise(viewPos.xyz, VdotU, dither);
color.rgb += pow4(skyFade) * bedrockNoise;
#endif
#endif
#if defined END && END_CENTER_LIGHTING > 0 && MC_VERSION >= 10900
float attentuation = doEndCenterFog(cameraPositionBest, normalize(playerPos), min(renderDistance, lViewPos), 0.5);
vec3 pointLightFog = vec3(END_CENTER_LIGHTING_R, END_CENTER_LIGHTING_G + 0.05, END_CENTER_LIGHTING_B) * 0.25 * END_CENTER_LIGHTING * 0.1 * attentuation * (1.0 - vlFactor);
color.rgb = sqrt(pow2(color.rgb) + vec3(pointLightFog));
#endif
/*DRAWBUFFERS:05*/
gl_FragData[0] = vec4(color.rgb, 1.0);
gl_FragData[1] = vec4(waterRefColor, cloudLinearDepth);
// same check as #ifdef PBR_REFLECTIONS but for Optifine to understand:
#if BLOCK_REFLECT_QUALITY >= 2 && RP_MODE >= 1
/*DRAWBUFFERS:054*/
gl_FragData[2] = vec4(mat3(gbufferModelViewInverse) * normalM, sqrt(fresnelM * color.a));
#endif
}
#endif
//////////Vertex Shader//////////Vertex Shader//////////Vertex Shader//////////
#ifdef VERTEX_SHADER
noperspective out vec2 texCoord;
#if END_CRYSTAL_VORTEX_INTERNAL / 2 == 1 || DRAGON_DEATH_EFFECT_INTERNAL > 0
uniform isampler2D endcrystal_sampler;
#endif
flat out vec3 upVec, sunVec, eastVec;
#if defined LIGHTSHAFTS_ACTIVE && (LIGHTSHAFT_BEHAVIOUR == 1 && SHADOW_QUALITY >= 1 || defined END)
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();
eastVec = normalize(gbufferModelView[0].xyz);
#if defined LIGHTSHAFTS_ACTIVE && (LIGHTSHAFT_BEHAVIOUR == 1 && SHADOW_QUALITY >= 1 || defined END)
vlFactor = texelFetch(colortex5, ivec2(viewWidth-1, viewHeight-1), 0).a;
#ifdef END
if (frameCounter % int(0.06666 / frameTimeSmooth + 0.5) == 0) { // Change speed is not too different above 10 fps
#if MC_VERSION >= 12106
bool isEnderDragonDead = !heavyFog;
#else
vec2 absCamPosXZ = abs(cameraPosition.xz);
float maxCamPosXZ = max(absCamPosXZ.x, absCamPosXZ.y);
bool isEnderDragonDead = gl_Fog.start / far > 0.5 || maxCamPosXZ > 350.0;
#if END_CRYSTAL_VORTEX_INTERNAL / 2 == 1 || DRAGON_DEATH_EFFECT_INTERNAL > 0
isEnderDragonDead = texelFetch(endcrystal_sampler, ivec2(35, 5), 0).r == 0;
#endif
#endif
if (isEnderDragonDead) vlFactor = max(vlFactor - OSIEBCA*2, 0.0);
else vlFactor = min(vlFactor + OSIEBCA*2, 1.0);
}
#endif
#endif
}
#endif