custommods
This commit is contained in:
@@ -0,0 +1,353 @@
|
||||
/*
|
||||
Complementary Shaders by EminGT, based on BSL Shaders by Capt Tatsu
|
||||
*/
|
||||
|
||||
//Common//
|
||||
#include "/lib/common.glsl"
|
||||
|
||||
//Varyings//
|
||||
varying float vanillaStars;
|
||||
|
||||
varying vec3 upVec, sunVec;
|
||||
|
||||
//////////Fragment Shader//////////Fragment Shader//////////Fragment Shader//////////
|
||||
#ifdef FSH
|
||||
|
||||
//Uniforms//
|
||||
uniform int isEyeInWater;
|
||||
uniform int worldDay;
|
||||
uniform int moonPhase;
|
||||
#define UNIFORM_moonPhase
|
||||
|
||||
uniform float isEyeInCave;
|
||||
uniform float blindFactor;
|
||||
uniform float frameCounter;
|
||||
uniform float frameTimeCounter;
|
||||
uniform float nightVision;
|
||||
uniform float rainStrength;
|
||||
uniform float rainStrengthS;
|
||||
uniform float screenBrightness;
|
||||
uniform float viewWidth, viewHeight;
|
||||
uniform float eyeAltitude;
|
||||
|
||||
uniform ivec2 eyeBrightnessSmooth;
|
||||
|
||||
uniform vec3 cameraPosition;
|
||||
uniform vec3 skyColor;
|
||||
uniform vec3 fogColor;
|
||||
uniform vec3 moonPosition;
|
||||
|
||||
uniform mat4 gbufferModelView;
|
||||
uniform mat4 gbufferModelViewInverse;
|
||||
uniform mat4 gbufferProjectionInverse;
|
||||
|
||||
uniform sampler2D noisetex;
|
||||
|
||||
#ifdef GALAXIES
|
||||
uniform sampler2D gaux4;
|
||||
#endif
|
||||
|
||||
#ifdef AURORA
|
||||
uniform float isDry, isRainy, isSnowy;
|
||||
#endif
|
||||
|
||||
#if MC_VERSION >= 11900
|
||||
uniform float darknessFactor;
|
||||
#endif
|
||||
|
||||
//Common Variables//
|
||||
#if WORLD_TIME_ANIMATION >= 1
|
||||
int modifiedWorldDay = int(mod(worldDay, 100.0) + 5.0);
|
||||
float frametime = (worldTime + modifiedWorldDay * 24000) * 0.05 * ANIMATION_SPEED;
|
||||
#else
|
||||
float frametime = frameTimeCounter * ANIMATION_SPEED;
|
||||
#endif
|
||||
|
||||
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);
|
||||
|
||||
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));
|
||||
}
|
||||
|
||||
vec3 RoundSunMoon(vec3 nViewPos, vec3 sunColor, vec3 moonColor, float NdotU, float cosS) {
|
||||
float isMoon = float(cosS < 0.0);
|
||||
float sun = pow(abs(cosS), 2600.0 * isMoon + 1800.0 * (1 - isMoon));
|
||||
|
||||
if (isMoon > 0.0) {
|
||||
if (moonPhase >= 1) {
|
||||
float moonPhaseOffset = float(!(moonPhase == 4));
|
||||
if (moonPhase > 4) moonPhaseOffset *= -1.0;
|
||||
|
||||
float ang = fract(timeAngle - (0.25 + 0.0035 * moonPhaseOffset));
|
||||
ang = (ang + (cos(ang * 3.14159265358979) * -0.5 + 0.5 - ang) / 3.0) * 6.28318530717959;
|
||||
vec2 sunRotationData2 = vec2(cos(sunPathRotation * 0.01745329251994), -sin(sunPathRotation * 0.01745329251994));
|
||||
vec3 rawSunVec2 = (gbufferModelView * vec4(vec3(-sin(ang), cos(ang) * sunRotationData2) * 2000.0, 1.0)).xyz;
|
||||
|
||||
float moonPhaseCosS = dot(nViewPos, normalize(rawSunVec2.xyz));
|
||||
moonPhaseCosS = pow(abs(moonPhaseCosS), 750.0);
|
||||
sun = mix(sun, 0.0, min(moonPhaseCosS * 2.0, 1.0));
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef SUN_MOON_HORIZON
|
||||
float horizonFactor = clamp((NdotU+0.0025)*20, 0.0, 1.0);
|
||||
sun *= horizonFactor;
|
||||
moonColor *= 1.0 - sunVisibility;
|
||||
sunColor *= sunVisibility;
|
||||
#endif
|
||||
|
||||
vec3 sunMoonCol = mix(moonColor, sunColor, float(cosS > 0.0));
|
||||
|
||||
vec3 finalSunMoon = sun * sunMoonCol * 32.0;
|
||||
finalSunMoon = pow(finalSunMoon, vec3(2.0 - min(finalSunMoon.r + finalSunMoon.g + finalSunMoon.b, 1.0)));
|
||||
|
||||
return finalSunMoon;
|
||||
}
|
||||
|
||||
float GetStarNoise(vec2 pos) {
|
||||
return fract(sin(dot(pos, vec2(12.9898, 4.1414))) * 43758.54953);
|
||||
}
|
||||
|
||||
vec3 GetGalaxy(vec3 viewPos, float NdotU, float cosS, vec3 lightNight) {
|
||||
vec3 wpos = vec3(gbufferModelViewInverse * vec4(viewPos * 70.0, 1.0));
|
||||
vec3 planeCoord = wpos / (wpos.y + length(wpos.xz) * 0.5);
|
||||
|
||||
vec3 moonPos = vec3(gbufferModelViewInverse * vec4(- sunVec * 70.0, 1.0));
|
||||
vec3 moonCoord = moonPos / (moonPos.y + length(moonPos.xz));
|
||||
vec2 wind = vec2(frametime, 0.0);
|
||||
vec2 skyCoord = planeCoord.xz - moonCoord.xz;
|
||||
skyCoord *= 0.35;
|
||||
|
||||
#ifdef SHADER_STARS
|
||||
#if STAR_AMOUNT == 1
|
||||
float floorStar = 768.0;
|
||||
vec2 starCoord = floor(skyCoord * floorStar) / floorStar;
|
||||
|
||||
float star = 1.0;
|
||||
if (NdotU > 0.0) {
|
||||
star -= GetStarNoise(starCoord.xy+0.2);
|
||||
star -= GetStarNoise(starCoord.xy+0.3);
|
||||
star = pow(max(star, 0.0), 200.0) * 0.5;
|
||||
}
|
||||
#else
|
||||
float floorStar = 768.0;
|
||||
vec2 starCoord = floor(skyCoord * floorStar) / floorStar;
|
||||
float floorStar1 = 1024.0;
|
||||
vec2 starCoord1 = floor(skyCoord * floorStar1) / floorStar1;
|
||||
|
||||
float star = 1.0;
|
||||
float star1 = 1.0;
|
||||
if (NdotU > 0.0) {
|
||||
star -= GetStarNoise(starCoord.xy+0.2);
|
||||
star -= GetStarNoise(starCoord.xy+0.3);
|
||||
star1 -= GetStarNoise(starCoord1.xy);
|
||||
star1 -= GetStarNoise(starCoord1.xy+0.1);
|
||||
|
||||
float star1m = pow2(max(star1 - 0.925, 0.0));
|
||||
star = pow(max(star, 0.0), 200.0);
|
||||
star = star1m + star * 0.5;
|
||||
}
|
||||
#endif
|
||||
#else
|
||||
float star = vanillaStars * 0.05;
|
||||
#endif
|
||||
|
||||
float starDeletionTime = 1.0 - min(timeBrightness * 16.0, 1.0) * 0.15 - sunVisibility * 0.85;
|
||||
float starNdotU = pow2(pow2(clamp(NdotU * 3.0, 0.0, 1.0)));
|
||||
float starFactor = starNdotU * starDeletionTime;
|
||||
star *= starFactor * 32.0 * (1.0 - isEyeInCave) * STAR_BRIGHTNESS;
|
||||
|
||||
vec3 starColor = lightNight * lightNight * 30.0;
|
||||
vec3 starImage = starColor * star;
|
||||
|
||||
vec3 result = starImage;
|
||||
#ifndef SUNSET_STARS
|
||||
result *= 1.0 - sunVisibility;
|
||||
#endif
|
||||
|
||||
#ifdef GALAXIES
|
||||
if (sunVisibility < 1.0) {
|
||||
vec3 galaxy = texture2D(gaux4, skyCoord * 0.9 + 0.4).rgb;
|
||||
float lGalaxy = pow2(length(galaxy) + 0.3);
|
||||
galaxy *= lGalaxy;
|
||||
#ifdef SHADER_STARS
|
||||
#if STAR_AMOUNT == 1
|
||||
float floorStar1 = 1024.0;
|
||||
vec2 starCoord1 = floor(skyCoord * floorStar1) / floorStar1;
|
||||
float star1 = 1.0;
|
||||
if (NdotU > 0.0) {
|
||||
star1 -= GetStarNoise(starCoord1.xy);
|
||||
star1 -= GetStarNoise(starCoord1.xy+0.1);
|
||||
}
|
||||
#endif
|
||||
galaxy += max(star1 - 0.65, 0.0) * starColor * lGalaxy;
|
||||
#endif
|
||||
result += galaxy * galaxy * 0.015 * starNdotU * (1.0 - sunVisibility) * GALAXY_BRIGHTNESS;
|
||||
}
|
||||
#endif
|
||||
|
||||
result *= clamp(1.0 - pow(abs(cosS) * 1.002, 100.0), 0.0, 1.0);
|
||||
|
||||
result *= pow2(pow2(1.0 - max(rainStrength, rainStrengthS)));
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
//Includes//
|
||||
#include "/lib/color/lightColor.glsl"
|
||||
#include "/lib/color/skyColor.glsl"
|
||||
#include "/lib/color/waterColor.glsl"
|
||||
#include "/lib/color/endColor.glsl"
|
||||
#include "/lib/util/dither.glsl"
|
||||
|
||||
#ifdef AURORA
|
||||
#include "/lib/color/auroraColor.glsl"
|
||||
#endif
|
||||
|
||||
#if (defined CLOUDS || defined AURORA) && defined OVERWORLD
|
||||
#include "/lib/atmospherics/skyboxEffects.glsl"
|
||||
#endif
|
||||
#include "/lib/atmospherics/sky.glsl"
|
||||
#include "/lib/atmospherics/sunGlare.glsl"
|
||||
|
||||
//Program//
|
||||
void main() {
|
||||
vec3 albedo = vec3(0.0);
|
||||
|
||||
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 NdotU = dot(nViewPos, upVec);
|
||||
|
||||
#ifdef OVERWORLD
|
||||
#if defined CLOUDS || defined AURORA
|
||||
float dither = Bayer64(gl_FragCoord.xy);
|
||||
#endif
|
||||
#ifdef CLOUDS
|
||||
vec4 cloud = DrawCloud(viewPos.xyz * 1000000.0, dither, lightCol, ambientCol, NdotU, 6);
|
||||
float cloudMaskR = cloud.a / CLOUD_OPACITY;
|
||||
if (NdotU > 0.025) cloudMaskR /= pow2(pow2(1.0 - exp(- (10.0 - 8.2 * rainStrengthS) * NdotU))); //duplicate 78634
|
||||
#endif
|
||||
|
||||
albedo = GetSkyColor(lightCol, NdotU, nViewPos, false);
|
||||
|
||||
float cosS = dot(nViewPos, sunVec);
|
||||
|
||||
vec3 galaxy = GetGalaxy(viewPos.xyz, NdotU, cosS, lightNight);
|
||||
#ifdef CLOUDS
|
||||
galaxy *= smoothstep(0.0, 1.0, 1.0 - cloudMaskR);
|
||||
#endif
|
||||
albedo.rgb += galaxy;
|
||||
|
||||
#ifdef ROUND_SUN_MOON
|
||||
vec3 sunColor = vec3(0.9, 0.35, 0.05);
|
||||
if (isEyeInWater == 1) sunColor = 2.0 * normalize(underwaterColor.rgb);
|
||||
vec3 moonColor = vec3(12.0, 13.8, 15.9) / 35.7;
|
||||
|
||||
vec3 roundSunMoon = RoundSunMoon(nViewPos, sunColor, moonColor, NdotU, cosS);
|
||||
|
||||
#ifdef CLOUDS
|
||||
roundSunMoon *= pow2(pow2(pow2(pow2(pow2(1.0 - cloudMaskR * cloudMaskR * rainStrengthS)))));
|
||||
//This should still be faster than pow()
|
||||
|
||||
roundSunMoon *= pow2(1.0 - rainStrengthS);
|
||||
#else
|
||||
roundSunMoon *= 1.0 - max(rainStrength, rainStrengthS);
|
||||
#endif
|
||||
albedo.rgb += roundSunMoon;
|
||||
#endif
|
||||
|
||||
albedo = SunGlare(albedo, nViewPos, lightCol);
|
||||
|
||||
#ifdef AURORA
|
||||
vec3 aurora = DrawAurora(viewPos.xyz * 1000000.0, dither, 20, NdotU);
|
||||
#ifdef CLOUDS
|
||||
aurora *= 1.0 - cloudMaskR;
|
||||
#endif
|
||||
albedo.rgb += aurora;
|
||||
#endif
|
||||
|
||||
#if defined CLOUDS && THE_FORBIDDEN_OPTION == 0
|
||||
albedo.rgb = mix(albedo.rgb, cloud.rgb, cloud.a);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef GBUFFER_CODING
|
||||
albedo.rgb = vec3(0.0, 0.0, 0.0);
|
||||
#endif
|
||||
|
||||
#ifdef SHADER_STARS
|
||||
float alpha = 1.0 - vanillaStars;
|
||||
#else
|
||||
#ifdef SUNSET_STARS
|
||||
float alpha = max(1.0 - vanillaStars * timeBrightness * 10.0, 0.0);
|
||||
#else
|
||||
float alpha = 1.0 - vanillaStars * sunVisibility;
|
||||
#endif
|
||||
float vanillaStarsM = vanillaStars * (1.0 - clamp(NdotU * 3.0, 0.0, 1.0));
|
||||
alpha = max(alpha - vanillaStarsM, 0.0);
|
||||
#endif
|
||||
|
||||
#if MC_VERSION >= 11700
|
||||
if (isEyeInWater == 3 && blindFactor == 0) albedo.rgb = vec3(0.1, 0.15, 0.2);
|
||||
#endif
|
||||
|
||||
#if defined CAVE_SKY_FIX && defined OVERWORLD
|
||||
albedo.rgb *= 1.0 - isEyeInCave;
|
||||
#endif
|
||||
|
||||
#if MC_VERSION >= 11900
|
||||
if (darknessFactor > 0.001) albedo.rgb = mix(albedo.rgb, darknessColor, darknessFactor);
|
||||
#endif
|
||||
|
||||
/* DRAWBUFFERS:0 */
|
||||
gl_FragData[0] = vec4(albedo, alpha);
|
||||
}
|
||||
|
||||
#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() {
|
||||
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;
|
||||
vec3 rawSunVec = (gbufferModelView * vec4(vec3(-sin(ang), cos(ang) * sunRotationData) * 2000.0, 1.0)).xyz;
|
||||
sunVec = normalize(rawSunVec);
|
||||
|
||||
upVec = normalize(gbufferModelView[1].xyz);
|
||||
|
||||
gl_Position = ftransform();
|
||||
|
||||
vec3 color = gl_Color.rgb;
|
||||
|
||||
//Vanilla Star Dedection by Builderb0y
|
||||
vanillaStars = float(color.r == color.g && color.g == color.b && color.r > 0.0 && color.r < 0.51);
|
||||
}
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user