/* Complementary Shaders by EminGT, based on BSL Shaders by Capt Tatsu */ //Common// #include "/lib/common.glsl" //Varyings// varying vec2 texCoord; varying vec3 sunVec, upVec; //////////Fragment Shader//////////Fragment Shader//////////Fragment Shader////////// #ifdef FSH //Uniforms// uniform int frameCounter; uniform int isEyeInWater; uniform int worldDay; uniform float isEyeInCave; uniform float blindFactor; uniform float far, near; uniform float frameTimeCounter; uniform float rainStrengthS; uniform float screenBrightness; uniform float viewWidth, viewHeight, aspectRatio; uniform float eyeAltitude; uniform ivec2 eyeBrightnessSmooth; uniform vec3 cameraPosition; uniform vec3 fogColor; uniform vec3 skyColor; uniform mat4 gbufferProjection, gbufferProjectionInverse; uniform mat4 gbufferModelViewInverse; uniform mat4 shadowModelView; uniform mat4 shadowProjection; uniform sampler2D colortex0; uniform sampler2D colortex1; uniform sampler2D depthtex0; uniform sampler2D depthtex1; #ifdef LIGHT_SHAFTS uniform sampler2DShadow shadowtex0; uniform sampler2DShadow shadowtex1; uniform sampler2D shadowcolor0; #endif #ifdef RAINBOW uniform float rainStrength; uniform float wetness; uniform float isDry, isRainy, isSnowy; #endif #if ((defined BLACK_OUTLINE || defined PROMO_OUTLINE) && defined OUTLINE_ON_EVERYTHING && defined END && defined ENDER_NEBULA) || defined WATER_REFRACT && !defined NETHER || NETHER_REFRACT > 0 && defined NETHER || defined LIGHT_SHAFTS || defined RAINBOW uniform sampler2D noisetex; #endif #if NIGHT_VISION > 1 || ((defined BLACK_OUTLINE || defined PROMO_OUTLINE) && defined OUTLINE_ON_EVERYTHING) uniform float nightVision; #endif //Optifine Constants// const bool colortex0Clear = true;// const bool colortex1Clear = true;// const bool colortex2Clear = false;// const bool colortex3Clear = true;// const bool gaux1Clear = false; const bool gaux2Clear = false; const bool gaux3Clear = false; const bool gaux4Clear = true;// #ifdef COLORED_LIGHT const bool colortex8Clear = true;// const bool colortex9Clear = false;// #endif //Common Variables// float eBS = eyeBrightnessSmooth.y / 240.0; float sunVisibility = clamp(dot( sunVec,upVec) + 0.0625, 0.0, 0.125) * 8.0; float vsBrightness = clamp(screenBrightness, 0.0, 1.0); #if WORLD_TIME_ANIMATION == 2 int modifiedWorldDay = int(mod(worldDay, 100.0) + 5.0); float frametime = (worldTime + modifiedWorldDay * 24000) * 0.05 * ANIMATION_SPEED; float cloudtime = frametime; #endif #if WORLD_TIME_ANIMATION == 1 int modifiedWorldDay = int(mod(worldDay, 100.0) + 5.0); float frametime = frameTimeCounter * ANIMATION_SPEED; float cloudtime = (worldTime + modifiedWorldDay * 24000) * 0.05 * ANIMATION_SPEED; #endif #if WORLD_TIME_ANIMATION == 0 float frametime = frameTimeCounter * ANIMATION_SPEED; float cloudtime = frametime; #endif vec3 lightVec = sunVec * (1.0 - 2.0 * float(timeAngle > 0.5325 && timeAngle < 0.9675)); //Common Functions// float GetLuminance(vec3 color) { return dot(color,vec3(0.299, 0.587, 0.114)); } float GetLinearDepth(float depth) { return (2.0 * near) / (far + near - depth * (far - near)); } #if defined LIGHT_SHAFTS || defined VL_CLOUDS float GetDepth(float depth) { return 2.0 * near * far / (far + near - (2.0 * depth - 1.0) * (far - near)); } float GetDistX(float dist) { return (far * (dist - near)) / (dist * (far - near)); } #endif //Includes// #include "/lib/color/waterColor.glsl" #include "/lib/color/skyColor.glsl" #include "/lib/util/dither.glsl" #include "/lib/atmospherics/waterFog.glsl" #include "/lib/color/dimensionColor.glsl" #include "/lib/util/spaceConversion.glsl" #ifdef LIGHT_SHAFTS #ifdef SMOKEY_WATER_LIGHTSHAFTS #include "/lib/lighting/caustics.glsl" #endif #include "/lib/atmospherics/volumetricLight.glsl" #endif #ifdef VL_CLOUDS #include "/lib/atmospherics/volumetricClouds.glsl" #endif #if (defined BLACK_OUTLINE || defined PROMO_OUTLINE) && defined OUTLINE_ON_EVERYTHING #ifdef OVERWORLD #include "/lib/atmospherics/sky.glsl" #endif #if defined END && defined ENDER_NEBULA #include "/lib/atmospherics/skyboxEffects.glsl" #endif #include "/lib/atmospherics/fog.glsl" #endif #if defined PROMO_OUTLINE && defined OUTLINE_ON_EVERYTHING #include "/lib/outline/promoOutline.glsl" #endif #if defined BLACK_OUTLINE && defined OUTLINE_ON_EVERYTHING #include "/lib/color/blocklightColor.glsl" #include "/lib/outline/blackOutline.glsl" #endif //Program// void main() { vec4 color = texture2D(colortex0, texCoord.xy); vec3 translucent = texture2D(colortex1,texCoord.xy).rgb; float z0 = texture2D(depthtex0, texCoord.xy).r; float z1 = texture2D(depthtex1, texCoord.xy).r; bool water = false; if (translucent.b > 0.999 && z1 > z0) { water = true; translucent = vec3(1.0); } #if defined LIGHT_SHAFTS || defined WATER_REFRACT && !defined NETHER || NETHER_REFRACT > 0 && defined NETHER || defined RAINBOW vec4 viewPos = gbufferProjectionInverse * (vec4(texCoord, z0, 1.0) * 2.0 - 1.0); viewPos /= viewPos.w; #endif #if defined WATER_REFRACT && !defined NETHER || NETHER_REFRACT > 0 && defined NETHER #ifndef NETHER if (water) #endif { vec3 worldPos = ViewToWorld(viewPos.xyz); #ifndef NETHER vec3 worldPosM = worldPos.xyz + cameraPosition.xyz; vec2 refractPos = worldPosM.xz * 0.005 + worldPosM.y * 0.0025 + 0.0035 * WATER_SPEED * frametime; #else vec3 worldPosM = normalize(worldPos) * 0.035; vec2 refractPos = worldPosM.xz + worldPosM.y * 0.5 - 0.001 * WATER_SPEED * frametime; #endif vec2 refractNoise = texture2D(noisetex, refractPos).rg - vec2(0.5); float hand = 1.0 - float(z0 < 0.56); float d0 = GetLinearDepth(z0); float fovScale = gbufferProjection[1][1] / 1.37; float refractScale = fovScale; #ifndef NETHER float distScale0 = max((far - near) * d0 + near, 6.0); refractScale *= REFRACT_STRENGTH / distScale0; #else #if NETHER_REFRACT == 1 refractScale *= 2.0; #elif NETHER_REFRACT == 2 refractScale *= 4.0; #else refractScale *= 8.0; #endif refractScale *= clamp(pow2(length(viewPos)) * 0.0001, 0.0, 0.1); //9452873723569 #endif refractNoise *= vec2(0.07 * hand * refractScale); vec2 refractCoord = texCoord.xy + refractNoise; #ifndef NETHER float waterCheck = float(texture2D(colortex1, refractCoord).b > 0.999); float z0check = texture2D(depthtex0, refractCoord).r; float z1check = texture2D(depthtex1, refractCoord).r; float depthDif = GetLinearDepth(z1check) - GetLinearDepth(z0check); refractNoise *= clamp(depthDif * 150.0, 0.0, 1.0); if (z0check >= 0.56 && waterCheck > 0.95) #else float z0check = texture2D(depthtex0, refractCoord).r; vec4 viewPosCheck = gbufferProjectionInverse * (vec4(texCoord, z0check, 1.0) * 2.0 - 1.0); viewPosCheck /= viewPosCheck.w; refractNoise *= clamp(pow2(length(viewPosCheck)) * 0.0001, 0.0, 0.1); //9452873723569 #endif { refractCoord = texCoord.xy + refractNoise; #if MC_VERSION > 10710 color.rgb = texture2D(colortex0, refractCoord).rgb; #else //To fix blocky water in Mc 1.7.10 (reason unknown) color.rgb = texture2DLod(colortex0, refractCoord, 0).rgb; #endif #ifndef NETHER if (isEyeInWater == 1) { translucent = texture2D(colortex1, refractCoord).rgb; if (translucent.b > 0.999) translucent = vec3(1.0); z0 = texture2D(depthtex0, refractCoord).r; z1 = texture2D(depthtex1, refractCoord).r; } #endif } } #endif #if defined LIGHT_SHAFTS || defined RAINBOW float dither = Bayer64(gl_FragCoord.xy); #endif #if defined BLACK_OUTLINE && defined OUTLINE_ON_EVERYTHING float outlineMask = BlackOutlineMask(depthtex0, depthtex1); float wFogMult = 1.0 + eBS; if (outlineMask > 0.5 || isEyeInWater > 0.5) BlackOutline(color.rgb, depthtex0, wFogMult); #endif #if defined PROMO_OUTLINE && defined OUTLINE_ON_EVERYTHING if (z1 - z0 > 0.0) PromoOutline(color.rgb, depthtex0); #endif if (isEyeInWater == 1 && z0 == 1.0) { color.rgb = 0.8 * pow(underwaterColor.rgb * (1.0 - blindFactor), vec3(2.0)); } if (isEyeInWater == 2) color.rgb *= vec3(2.0, 0.4, 0.02); #if defined LIGHT_SHAFTS || defined VL_CLOUDS || defined RAINBOW #ifdef OVERWORLD vec3 nViewPos = normalize(viewPos.xyz); float cosS = dot(nViewPos, lightVec); #else float cosS = 0.0; #endif #endif vec3 vl = vec3(0.0); vec4 clouds = vec4(0.0); #if defined LIGHT_SHAFTS || defined VL_CLOUDS vec3 vlAlbedo = translucent; if (isEyeInWater == 0 && water) vlAlbedo = vec3(0.0); float depth0 = GetDepth(z0); float depth1 = GetDepth(z1); #ifdef LIGHT_SHAFTS vl = GetVolumetricRays(depth0, depth1, vlAlbedo, dither, cosS); #endif #ifdef VL_CLOUDS clouds = GetVolumetricClouds(depth0, depth1, vlAlbedo, dither, viewPos); #endif #endif #ifdef RAINBOW #include "/lib/atmospherics/rainbow.glsl" #endif #if NIGHT_VISION > 1 if (nightVision > 0.0) { float nightVisionGreen = length(color.rgb); nightVisionGreen = smoothstep(0.0, 1.0, nightVisionGreen) * 3.0 + 0.25 * sqrt(nightVisionGreen); float whiteFactor = 0.01; vec3 nightVisionFinal = vec3(nightVisionGreen * whiteFactor, nightVisionGreen, nightVisionGreen * whiteFactor); color.rgb = mix(color.rgb, nightVisionFinal, nightVision); } #endif /*DRAWBUFFERS:01*/ gl_FragData[0] = color; gl_FragData[1] = vec4(vl, 1.0); #ifdef VL_CLOUDS /*DRAWBUFFERS:015*/ gl_FragData[2] = clouds; #endif } #endif //////////Vertex Shader//////////Vertex Shader//////////Vertex Shader////////// #ifdef VSH //Uniforms// uniform mat4 gbufferModelView; //Common Variables// #ifdef OVERWORLD float timeAngleM = timeAngle; #else #if !defined SEVEN && !defined SEVEN_2 float timeAngleM = 0.25; #else float timeAngleM = 0.5; #endif #endif //Program// void main() { texCoord = gl_MultiTexCoord0.xy; gl_Position = ftransform(); const vec2 sunRotationData = vec2(cos(sunPathRotation * 0.01745329251994), -sin(sunPathRotation * 0.01745329251994)); float ang = fract(timeAngleM - 0.25); ang = (ang + (cos(ang * 3.14159265358979) * -0.5 + 0.5 - ang) / 3.0) * 6.28318530717959; sunVec = normalize((gbufferModelView * vec4(vec3(-sin(ang), cos(ang) * sunRotationData) * 2000.0, 1.0)).xyz); upVec = normalize(gbufferModelView[1].xyz); } #endif