253 lines
10 KiB
Plaintext
Raw Normal View History

2026-05-01 13:07:13 +02:00
//////////////////////////////////////////
// Complementary Shaders by EminGT //
// With Euphoria Patches by SpacEagle17 //
//////////////////////////////////////////
//Common//
#include "/lib/common.glsl"
#define ROUGHNESS_MULTIPLIER 1.0 //[0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 2.0 2.5 3.0 3.5 4.0 4.5 5.0 5.5 6.0 6.5 7.0 7.5 8.0 8.5 9.0 9.5 10.0]
#define ROUGHNESS_INTENSITY 1.0 //[0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 2.0 2.5 3.0 3.5 4.0 4.5 5.0 5.5 6.0 6.5 7.0 7.5 8.0 8.5 9.0 9.5 10.0]
//////////Fragment Shader//////////Fragment Shader//////////Fragment Shader//////////
#ifdef FRAGMENT_SHADER
noperspective in vec2 texCoord;
in vec3 sunVec;
#ifdef END
in float vlFactor;
#endif
//Pipeline Constants//
//Common Variables//
vec3 upVec = normalize(gbufferModelView[1].xyz);
vec3 eastVec = normalize(gbufferModelView[0].xyz);
vec3 northVec = normalize(gbufferModelView[2].xyz);
#ifdef OVERWORLD
vec3 lightVec = sunVec * ((timeAngle < 0.5325 || timeAngle > 0.9675) ? 1.0 : -1.0);
#else
vec3 lightVec = sunVec;
#endif
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;
float z0;
float z1;
vec2 view = vec2(viewWidth, viewHeight);
//Common Functions//
float GetLinearDepth(float depth) {
return (2.0 * near) / (far + near - depth * (far - near));
}
//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/materials/materialMethods/reflections.glsl"
#ifdef ATM_COLOR_MULTS
#include "/lib/colors/colorMultipliers.glsl"
#endif
//Program//
void main() {
ivec2 texelCoord = ivec2(texCoord * view);
vec4 color = texelFetch(colortex0, texelCoord, 0);
vec4 texture4 = texelFetch(colortex4, texelCoord, 0);
z0 = texelFetch(depthtex0, texelCoord, 0).r;
z1 = texelFetch(depthtex1, texelCoord, 0).r;
#ifdef ATM_COLOR_MULTS
atmColorMult = GetAtmColorMult();
sqrtAtmColorMult = sqrt(atmColorMult);
#endif
vec4 reflectOutput = vec4(0.0);
if (
z0 < 1.0
#if WORLD_SPACE_REFLECTIONS_INTERNAL == -1 || WATER_REFLECT_QUALITY <= 0
&& z0 == z1
#endif
) {
vec3 texture6 = texelFetch(colortex6, texelCoord, 0).rgb;
vec3 normalM = mat3(gbufferModelView) * texture4.rgb;
vec4 screenPos = vec4(texCoord, z0, 1.0);
vec4 viewPos = gbufferProjectionInverse * (screenPos * 2.0 - 1.0);
viewPos /= viewPos.w;
float lViewPos = length(viewPos);
vec3 nViewPos = normalize(viewPos.xyz);
vec3 playerPos = ViewToPlayer(viewPos.xyz);
bool entityOrParticle = z0 < 0.56;
float dither = texture2DLod(noisetex, gl_FragCoord.xy / 128.0, 0.0).b;
#if defined TAA || defined PBR_REFLECTIONS
dither = fract(dither + goldenRatio * mod(float(frameCounter), 3600.0));
#endif
int materialMaskInt = int(texture6.g * 255.1);
float skyLightFactor = texture6.b;
float smoothnessD = texture6.r;
float fresnelM = texture4.a;
float intenseFresnel = 0.0;
float ssao = 1.0;
vec3 reflectColor = vec3(1.0);
#ifdef IRIS_FEATURE_FADE_VARIABLE
if (skyLightFactor > 0.50001) skyLightFactor = eyeBrightnessM;
else skyLightFactor *= 1.9999;
#endif
#include "/lib/materials/materialHandling/deferredMaterials.glsl"
float fresnel = clamp(1.0 + dot(normalM, nViewPos), 0.0, 1.0);
if (fresnelM > 0.0) {
#ifdef TAA
float noiseMult = 0.3;
#else
float noiseMult = 0.3;
#endif
#ifdef PBR_REFLECTIONS
bool opaqueSurface = z0 == z1;
float minBlendFactor = 0.035 + 0.09 * pow2(pow2(pow2(smoothnessD)));
if (entityOrParticle) {
noiseMult *= 0.125;
minBlendFactor = 0.125;
if (!opaqueSurface) reflectColor = vec3(0.0);
}
#endif
float smoothnessDM = smoothnessD * ROUGHNESS_MULTIPLIER;
noiseMult *= pow2(1.0 - smoothnessDM) * ROUGHNESS_INTENSITY;
vec2 roughCoord = gl_FragCoord.xy / 128.0;
vec3 roughNoise = vec3(
texture2DLod(noisetex, roughCoord, 0.0).r,
texture2DLod(noisetex, roughCoord + 0.09375, 0.0).r,
texture2DLod(noisetex, roughCoord + 0.1875, 0.0).r
);
roughNoise = fract(roughNoise + vec3(dither, dither * goldenRatio, dither * pow2(goldenRatio)));
roughNoise = noiseMult * (roughNoise - vec3(0.5));
vec3 refNormal = normalM + roughNoise;
float enderDragonDead = 1.0 - texelFetch(colortex5, ivec2(viewWidth-1, viewHeight-1), 0).a;
vec4 reflection = GetReflection(refNormal, viewPos.xyz, nViewPos, playerPos, lViewPos, z0,
depthtex1, dither, skyLightFactor, fresnel,
smoothnessDM, vec3(0.0), vec3(0.0), vec3(0.0), 0.0, enderDragonDead, vec2(0.0));
reflection.rgb *= reflectColor;
reflectOutput = reflection;
#ifdef PBR_REFLECTIONS
if (opaqueSurface) {
refDist = min(refDist, far - lViewPos);
vec4 virtualRefPos = vec4(viewPos.xyz + refDist * nViewPos, 1.0);
vec4 playerVirtualRefPos = gbufferModelViewInverse * virtualRefPos; // note: don't need to do perspective division with model view matrix
vec4 virtualPrevRefPos = playerVirtualRefPos;
virtualPrevRefPos.xyz -= previousCameraPosition - cameraPosition;
virtualPrevRefPos = gbufferPreviousProjection * (gbufferPreviousModelView * virtualPrevRefPos);
virtualPrevRefPos.xyz = 0.5 * virtualPrevRefPos.xyz / virtualPrevRefPos.w + 0.5;
virtualPrevRefPos.z = min(1, virtualPrevRefPos.z);
if (virtualPrevRefPos.xyz == clamp01(virtualPrevRefPos.xyz)) {
vec4 prevPos = gbufferProjection * (
gbufferModelView * vec4(
playerPos + (cameraPosition - previousCameraPosition) +
gbufferModelViewInverse[3].xyz - transpose(mat3(gbufferPreviousModelView)) * gbufferPreviousModelView[3].xyz
, 1.0
)
);
prevPos.xyz = 0.5 * prevPos.xyz / prevPos.w + 0.5;
virtualPrevRefPos.xy *= view;
virtualPrevRefPos.xy = (
smoothstep(0, 1, smoothstep(0, 1, fract(virtualPrevRefPos.xy - 0.5))) +
floor(virtualPrevRefPos.xy - 0.5) +
0.5
) / view;
float linearZ1 = GetLinearDepth(z1);
vec2 pixelMovement = view * (prevPos.xy - texCoord);
vec3 prevNormalM = mat3(gbufferModelView) * texture2D(colortex1, virtualPrevRefPos.xy).rgb;
vec4 prevRefCurrentPosHeuristic = playerVirtualRefPos;
prevRefCurrentPosHeuristic.xyz += normalize(previousCameraPosition - cameraPosition - playerVirtualRefPos.xyz) * refDist;
prevRefCurrentPosHeuristic = gbufferProjection * (gbufferModelView * prevRefCurrentPosHeuristic);
prevRefCurrentPosHeuristic.xyz = 0.5 * prevRefCurrentPosHeuristic.xyz / prevRefCurrentPosHeuristic.w + 0.5;
vec4 prevRef = texture2D(colortex7, virtualPrevRefPos.xy);
float prevValid = exp(
- 0.03 * length(view * (virtualPrevRefPos.xy - texCoord))
- min(0.75, 10.0 * sqrt(length(cameraPosition - previousCameraPosition)))
- 0.003 * length(pixelMovement)
- 12.0 * length(normalM - prevNormalM)
- abs(prevRef.a - linearZ1) * far / 1.0
- 10 * length(prevRefCurrentPosHeuristic.xy - clamp01(prevRefCurrentPosHeuristic.xy))
);
reflectOutput.rgb = mix(prevRef.rgb, reflectOutput.rgb, min1(minBlendFactor / prevValid));
reflectOutput.a = linearZ1;
}
}
#endif
}
}
/* DRAWBUFFERS:7 */
gl_FragData[0] = reflectOutput;
// same check as #ifdef PBR_REFLECTIONS but for Optifine to understand:
#if BLOCK_REFLECT_QUALITY >= 2 && RP_MODE >= 1
/* DRAWBUFFERS:71 */
gl_FragData[1] = vec4(texture4.rgb, 1.0);
#endif
}
#endif
//////////Vertex Shader//////////Vertex Shader//////////Vertex Shader//////////
#ifdef VERTEX_SHADER
noperspective out vec2 texCoord;
out vec3 sunVec;
#ifdef END
out float vlFactor;
#endif
//Attributes//
//Common Variables//
//Common Functions//
//Includes//
//Program//
void main() {
gl_Position = ftransform();
texCoord = (gl_TextureMatrix[0] * gl_MultiTexCoord0).xy;
sunVec = GetSunVector();
#ifdef END
vlFactor = texelFetch(colortex5, ivec2(viewWidth-1, viewHeight-1), 0).a;
#endif
}
#endif