214 lines
6.8 KiB
GLSL
214 lines
6.8 KiB
GLSL
//////////////////////////////////////////
|
|
// Complementary Shaders by EminGT //
|
|
// With Euphoria Patches by SpacEagle17 //
|
|
//////////////////////////////////////////
|
|
|
|
//Common//
|
|
#include "/lib/common.glsl"
|
|
#include "/lib/shaderSettings/tonemaps.glsl"
|
|
#define STELLAR_VIEW_SUPPORT
|
|
|
|
//////////Fragment Shader//////////Fragment Shader//////////Fragment Shader//////////
|
|
#ifdef FRAGMENT_SHADER
|
|
|
|
in vec2 texCoord;
|
|
|
|
flat in vec4 glColor;
|
|
|
|
#ifdef OVERWORLD
|
|
flat in vec3 upVec, sunVec;
|
|
#endif
|
|
|
|
//Pipeline Constants//
|
|
|
|
//Common Variables//
|
|
#ifdef OVERWORLD
|
|
float SdotU = dot(sunVec, upVec);
|
|
float sunVisibility = clamp(SdotU + 0.0625, 0.0, 0.125) / 0.125;
|
|
float sunVisibility2 = sunVisibility * sunVisibility;
|
|
#endif
|
|
|
|
const int DoCompTonemap = 0;
|
|
const int DoBSLTonemap = 1;
|
|
const int ACESTonemap = 2;
|
|
const int ACESRedModified = 3;
|
|
const int BurgessTonemap = 4;
|
|
const int LottesTonemap = 5;
|
|
const int Uncharted2 = 6;
|
|
const int uncharted2_tonemap_partial = 7;
|
|
const int uncharted2_filmic = 8;
|
|
const int reinhard2 = 9;
|
|
const int filmic = 10;
|
|
const int GTTonemap = 11;
|
|
const int uchimura = 12;
|
|
const int agxTonemap = 13;
|
|
const int unreal = 14;
|
|
|
|
//Common Functions//
|
|
|
|
//Includes//
|
|
#include "/lib/colors/lightAndAmbientColors.glsl"
|
|
#ifdef END
|
|
#include "/lib/colors/skyColors.glsl"
|
|
#endif
|
|
|
|
#ifdef CAVE_FOG
|
|
#include "/lib/atmospherics/fog/caveFactor.glsl"
|
|
#endif
|
|
|
|
#ifdef COLOR_CODED_PROGRAMS
|
|
#include "/lib/misc/colorCodedPrograms.glsl"
|
|
#endif
|
|
|
|
//Program//
|
|
void main() {
|
|
#ifdef OVERWORLD
|
|
vec2 tSize = textureSize(tex, 0);
|
|
vec4 color = texture2D(tex, texCoord);
|
|
color.rgb *= glColor.rgb;
|
|
|
|
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 VdotS = dot(nViewPos, sunVec);
|
|
float VdotU = dot(nViewPos, upVec);
|
|
|
|
#ifdef IS_IRIS
|
|
bool sunSideCheck = VdotS > 0.95;
|
|
bool isSun = renderStage == MC_RENDER_STAGE_SUN;
|
|
bool isMoon = renderStage == MC_RENDER_STAGE_MOON;
|
|
#if IRIS_VERSION < 10902
|
|
if (sunSideCheck) isSun = true; // Workaround for sun rendering as MC_RENDER_STAGE_MOON in some Iris versions
|
|
#endif
|
|
#else
|
|
bool sunSideCheck = VdotS > 0.0;
|
|
bool tSizeCheck = abs(tSize.y - 264.0) < 248.5; //tSize.y must range from 16 to 512
|
|
bool isSun = tSizeCheck && sunSideCheck;
|
|
bool isMoon = tSizeCheck && !sunSideCheck;
|
|
#endif
|
|
|
|
if (isSun || isMoon) {
|
|
#if SUN_MOON_STYLE >= 2
|
|
discard;
|
|
#endif
|
|
|
|
if (isSun) {
|
|
float sunBrightness = 4.5;
|
|
color.rgb = vec3(pow(dot(color.rgb, color.rgb) * 0.45, 6.0 - 5.0 * rainFactor));
|
|
if (tonemap == ACESTonemap) color.rgb *= mix(vec3(1.0, 0.6275, 0.4549) * 1.2, vec3(0.35), rainFactor * 0.75) * sunBrightness * 0.5;
|
|
else color.rgb *= mix(vec3(1.1, 0.55, 0.0), vec3(0.35), rainFactor * 0.75) * sunBrightness; // all other tonemaps
|
|
color.rgb *= 0.25 + 0.75 * sunVisibility2 + 0.5 * noonFactor;
|
|
}
|
|
|
|
if (isMoon) {
|
|
// vec3 pixelGlareColor = color.rgb;
|
|
// pixelGlareColor = mix(pixelGlareColor, pixelGlareColor * vec3(0.9, 0.95, 1.1), 0.5) * 1.3;
|
|
color.rgb *= smoothstep1(min1(length(color.rgb))) * 1.3;
|
|
|
|
#if BLOOD_MOON > 0
|
|
float luminance = GetLuminance(color.rgb);
|
|
color.rgb = mix(color.rgb, pow2(luminance) * vec3(0.702, 0.0, 0.0) * 1.7, getBloodMoon(sunVisibility));
|
|
#endif
|
|
|
|
// float pixelGlareFactor = 1 - step(0.09,luminance);
|
|
// color.rgb = mix(color.rgb, pixelGlareColor, pixelGlareFactor);
|
|
}
|
|
|
|
color.rgb *= GetHorizonFactor(VdotU);
|
|
|
|
#ifdef CAVE_FOG
|
|
color.rgb *= 1.0 - 0.75 * GetCaveFactor();
|
|
#endif
|
|
} else { // Custom Sky
|
|
#if MC_VERSION >= 11300
|
|
#ifdef STELLAR_VIEW_SUPPORT
|
|
color.rgb *= mix(vec3(1.0), color.rgb * smoothstep1(sqrt1(max0(VdotU))), float(abs(VdotS) > 0.95)); // we only want it near the sun and moon
|
|
#else
|
|
color.rgb *= color.rgb * smoothstep1(sqrt1(max0(VdotU)));
|
|
#endif
|
|
#else
|
|
discard;
|
|
// Old mc custom skyboxes are weirdly broken, so we discard.
|
|
#endif
|
|
}
|
|
|
|
if (isEyeInWater == 1) color.rgb *= 0.25;
|
|
|
|
// Reduced visibility in rain
|
|
float rainFactorM = rainFactor;
|
|
#ifdef SUN_MOON_DURING_RAIN
|
|
rainFactorM *= 0.8;
|
|
#endif
|
|
color.a *= 1.0 - rainFactorM;
|
|
|
|
#ifdef STELLAR_VIEW_SUPPORT
|
|
// Complementary by default shows the sun/moon while raining. But in vanilla they have an alpha of 0 while raining.
|
|
float vanillaSunMoonMask = float(isSun || isMoon);
|
|
color.rgb *= max0(glColor.a + vanillaSunMoonMask * rainStrength); // Support fop skybox altering mods
|
|
color.a *= max(step(0.0001, glColor.a), vanillaSunMoonMask); // Based on vanilla mask we only set alpha to 0 when glColor.a is 0 and not sun/moon
|
|
#endif
|
|
#endif
|
|
|
|
#ifdef NETHER
|
|
vec4 color = vec4(0.0);
|
|
#endif
|
|
|
|
#ifdef END
|
|
vec4 color = vec4(endSkyColor, 1.0);
|
|
#endif
|
|
|
|
#if RETRO_LOOK == 1
|
|
color.rgb = GetLuminance(color.rgb) * vec3(RETRO_LOOK_R, RETRO_LOOK_G, RETRO_LOOK_B) * 0.3 * RETRO_LOOK_I;
|
|
#elif RETRO_LOOK == 2
|
|
color.rgb = mix(color.rgb, GetLuminance(color.rgb) * vec3(RETRO_LOOK_R, RETRO_LOOK_G, RETRO_LOOK_B) * 0.3 * RETRO_LOOK_I, nightVision);
|
|
#endif
|
|
|
|
#ifdef COLOR_CODED_PROGRAMS
|
|
ColorCodeProgram(color, -1);
|
|
#endif
|
|
|
|
/* DRAWBUFFERS:0 */
|
|
gl_FragData[0] = color;
|
|
}
|
|
|
|
#endif
|
|
|
|
//////////Vertex Shader//////////Vertex Shader//////////Vertex Shader//////////
|
|
#ifdef VERTEX_SHADER
|
|
|
|
out vec2 texCoord;
|
|
|
|
flat out vec4 glColor;
|
|
|
|
#ifdef OVERWORLD
|
|
flat out vec3 upVec, sunVec;
|
|
#endif
|
|
|
|
//Attributes//
|
|
|
|
//Common Variables//
|
|
|
|
//Common Functions//
|
|
|
|
//Includes//
|
|
|
|
//Program//
|
|
void main() {
|
|
gl_Position = ftransform();
|
|
texCoord = (gl_TextureMatrix[0] * gl_MultiTexCoord0).xy;
|
|
#ifdef ATLAS_ROTATION
|
|
texCoord += texCoord * float(hash33(mod(cameraPosition * 0.5, vec3(100.0))));
|
|
#endif
|
|
|
|
glColor = gl_Color;
|
|
|
|
#ifdef OVERWORLD
|
|
upVec = normalize(gbufferModelView[1].xyz);
|
|
sunVec = GetSunVector();
|
|
#endif
|
|
}
|
|
|
|
#endif
|