253 lines
10 KiB
Plaintext
253 lines
10 KiB
Plaintext
|
|
//////////////////////////////////////////
|
||
|
|
// 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
|