269 lines
6.8 KiB
GLSL
269 lines
6.8 KiB
GLSL
/*
|
|
Complementary Shaders by EminGT, based on BSL Shaders by Capt Tatsu
|
|
*/
|
|
|
|
//Common//
|
|
#include "/lib/common.glsl"
|
|
|
|
//Varyings//
|
|
varying float mat;
|
|
|
|
varying vec2 texCoord;
|
|
|
|
varying vec4 color;
|
|
varying vec4 position;
|
|
|
|
//////////Fragment Shader//////////Fragment Shader//////////Fragment Shader//////////
|
|
#ifdef FSH
|
|
|
|
//Uniforms//
|
|
uniform int isEyeInWater;
|
|
uniform int blockEntityId;
|
|
|
|
uniform vec3 cameraPosition;
|
|
|
|
uniform sampler2D tex;
|
|
uniform sampler2D noisetex;
|
|
|
|
//Common Variables//
|
|
#if WORLD_TIME_ANIMATION >= 2
|
|
#else
|
|
uniform float frameTimeCounter;
|
|
#endif
|
|
|
|
#if WORLD_TIME_ANIMATION >= 2
|
|
float frametime = float(worldTime) * 0.05 * ANIMATION_SPEED;
|
|
#else
|
|
float frametime = frameTimeCounter * ANIMATION_SPEED;
|
|
#endif
|
|
|
|
//Includes//
|
|
#include "/lib/util/dither.glsl"
|
|
|
|
//Common Functions//
|
|
void doWaterShadowCaustics(float dither) {
|
|
#if defined WATER_CAUSTICS && defined OVERWORLD
|
|
vec3 worldPos = position.xyz + cameraPosition.xyz;
|
|
worldPos *= 0.5;
|
|
float noise = 0.0;
|
|
float mult = 0.5;
|
|
|
|
vec2 wind = vec2(frametime) * 0.3; //speed
|
|
float verticalOffset = worldPos.y * 0.2;
|
|
|
|
if (mult > 0.01) {
|
|
float lacunarity = 1.0 / 750.0, persistance = 1.0, weight = 0.0;
|
|
|
|
for(int i = 0; i < 8; i++) {
|
|
float windSign = mod(i,2) * 2.0 - 1.0;
|
|
vec2 noiseCoord = worldPos.xz + wind * windSign - verticalOffset;
|
|
if (i < 7) noise += texture2D(noisetex, noiseCoord * lacunarity).r * persistance;
|
|
else {
|
|
noise += texture2D(noisetex, noiseCoord * lacunarity * 0.125).r * persistance * 10.0;
|
|
noise = -noise;
|
|
float noisePlus = 1.0 + 0.125 * -noise;
|
|
noisePlus *= noisePlus;
|
|
noisePlus *= noisePlus;
|
|
noise *= noisePlus;
|
|
}
|
|
|
|
if (i == 0) noise = -noise;
|
|
|
|
weight += persistance;
|
|
lacunarity *= 1.50;
|
|
persistance *= 0.60;
|
|
}
|
|
noise *= mult / weight;
|
|
}
|
|
float noiseFactor = 1.1 + noise;
|
|
noiseFactor = pow(noiseFactor, 10.0);
|
|
if (noiseFactor > 1.0 - dither * 0.5) discard;
|
|
#else
|
|
discard;
|
|
#endif
|
|
}
|
|
|
|
//Program//
|
|
void main() {
|
|
#if MC_VERSION >= 11300
|
|
if (blockEntityId == 138) discard;
|
|
#endif
|
|
|
|
vec4 albedo = vec4(0.0);
|
|
|
|
#ifdef WRONG_MIPMAP_FIX
|
|
#if !defined COLORED_SHADOWS || !defined OVERWORLD
|
|
albedo.a = texture2DLod(tex, texCoord.xy, 0).a;
|
|
#else
|
|
albedo = texture2DLod(tex, texCoord.xy, 0);
|
|
#endif
|
|
#else
|
|
#if !defined COLORED_SHADOWS || !defined OVERWORLD
|
|
albedo.a = texture2D(tex, texCoord.xy).a;
|
|
#else
|
|
albedo = texture2D(tex, texCoord.xy);
|
|
#endif
|
|
#endif
|
|
|
|
if (blockEntityId == 200) { // End Gateway Beam Fix
|
|
if (color.r > 0.1) discard;
|
|
}
|
|
|
|
if (albedo.a < 0.0001) discard;
|
|
|
|
float premult = float(mat > 0.95 && mat < 1.05);
|
|
float water = float(mat > 1.95 && mat < 2.05);
|
|
float ice = float(mat > 2.95 && mat < 3.05);
|
|
|
|
#ifdef NO_FOLIAGE_SHADOWS
|
|
if (mat > 3.95 && mat < 4.05) discard;
|
|
#endif
|
|
|
|
vec4 albedo0 = albedo;
|
|
if (water > 0.5) {
|
|
if (isEyeInWater < 0.5) {
|
|
albedo0 = vec4(1.0, 1.0, 1.0, 1.0);
|
|
albedo = vec4(0.0, 0.0, 0.0, 1.0);
|
|
} else {
|
|
float dither = Bayer64(gl_FragCoord.xy);
|
|
doWaterShadowCaustics(dither);
|
|
}
|
|
} else albedo0.rgb = vec3(0.0);
|
|
|
|
#if !defined COLORED_SHADOWS || !defined OVERWORLD
|
|
if (premult > 0.5) {
|
|
if (albedo.a < 0.51) discard;
|
|
}
|
|
#endif
|
|
|
|
gl_FragData[0] = clamp(albedo0, vec4(0.0), vec4(1.0));
|
|
|
|
#if defined COLORED_SHADOWS && defined OVERWORLD
|
|
vec4 albedoCS = albedo;
|
|
albedoCS.rgb *= 1.0 - albedo.a * albedo.a;
|
|
|
|
#if defined PROJECTED_CAUSTICS && defined OVERWORLD
|
|
if (ice > 0.5) albedoCS = (albedo * albedo) * (albedo * albedo);
|
|
#else
|
|
if (ice > 0.5) albedoCS = vec4(0.0, 0.0, 0.0, 1.0);
|
|
#endif
|
|
|
|
gl_FragData[1] = clamp(albedoCS, vec4(0.0), vec4(1.0));
|
|
#endif
|
|
}
|
|
|
|
#endif
|
|
|
|
//////////Vertex Shader//////////Vertex Shader//////////Vertex Shader//////////
|
|
#ifdef VSH
|
|
|
|
//Uniforms//
|
|
uniform float rainStrengthS;
|
|
|
|
uniform vec3 cameraPosition;
|
|
|
|
uniform mat4 shadowProjection, shadowProjectionInverse;
|
|
uniform mat4 shadowModelView, shadowModelViewInverse;
|
|
uniform mat4 gbufferModelView;
|
|
|
|
#if WORLD_TIME_ANIMATION < 2
|
|
uniform float frameTimeCounter;
|
|
#endif
|
|
|
|
//Attributes//
|
|
attribute vec4 mc_Entity;
|
|
attribute vec4 mc_midTexCoord;
|
|
|
|
//Common Variables//
|
|
#if WORLD_TIME_ANIMATION >= 2
|
|
float frametime = float(worldTime) * 0.05 * ANIMATION_SPEED;
|
|
#else
|
|
float frametime = frameTimeCounter * ANIMATION_SPEED;
|
|
#endif
|
|
|
|
vec2 lmCoord = vec2(0.0);
|
|
|
|
//Includes//
|
|
#include "/lib/vertex/waving.glsl"
|
|
|
|
#ifdef WORLD_CURVATURE
|
|
#include "/lib/vertex/worldCurvature.glsl"
|
|
#endif
|
|
|
|
//Program//
|
|
void main() {
|
|
texCoord = gl_MultiTexCoord0.xy;
|
|
color = gl_Color;
|
|
|
|
lmCoord = (gl_TextureMatrix[1] * gl_MultiTexCoord1).xy;
|
|
lmCoord = clamp((lmCoord - 0.03125) * 1.06667, 0.0, 1.0);
|
|
|
|
position = shadowModelViewInverse * shadowProjectionInverse * ftransform();
|
|
|
|
mat = 0;
|
|
if (mc_Entity.x == 79) mat = 1; //premult
|
|
if (mc_Entity.x == 7979) mat = 3; //ice
|
|
if (mc_Entity.x == 8) { //water
|
|
#ifdef WATER_DISPLACEMENT
|
|
position.y += WavingWater(position.xyz, lmCoord.y);
|
|
#endif
|
|
mat = 2;
|
|
}
|
|
|
|
float istopv = gl_MultiTexCoord0.t < mc_midTexCoord.t ? 1.0 : 0.0;
|
|
position.xyz += WavingBlocks(position.xyz, istopv, lmCoord.y);
|
|
|
|
#ifdef WORLD_CURVATURE
|
|
position.y -= WorldCurvature(position.xz);
|
|
#endif
|
|
|
|
gl_Position = shadowProjection * shadowModelView * position;
|
|
|
|
float dist = sqrt(gl_Position.x * gl_Position.x + gl_Position.y * gl_Position.y);
|
|
float distortFactor = dist * shadowMapBias + (1.0 - shadowMapBias);
|
|
|
|
if (mc_Entity.x == 31 || mc_Entity.x == 6 || mc_Entity.x == 59 ||
|
|
mc_Entity.x == 175 || mc_Entity.x == 176 || mc_Entity.x == 83 ||
|
|
mc_Entity.x == 104 || mc_Entity.x == 105 || mc_Entity.x == 11019) { // Foliage
|
|
#if !defined NO_FOLIAGE_SHADOWS && SHADOW_SUBSURFACE > 0
|
|
// Counter Shadow Bias
|
|
#ifdef OVERWORLD
|
|
float timeAngleM = timeAngle;
|
|
#else
|
|
#if !defined SEVEN && !defined SEVEN_2
|
|
float timeAngleM = 0.25;
|
|
#else
|
|
float timeAngleM = 0.5;
|
|
#endif
|
|
#endif
|
|
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 sunVec = normalize((gbufferModelView * vec4(vec3(-sin(ang), cos(ang) * sunRotationData) * 2000.0, 1.0)).xyz);
|
|
#ifdef OVERWORLD
|
|
vec3 lightVec = sunVec * ((timeAngle < 0.5325 || timeAngle > 0.9675) ? 1.0 : -1.0);
|
|
#else
|
|
vec3 lightVec = sunVec;
|
|
#endif
|
|
vec3 upVec = normalize(gbufferModelView[1].xyz);
|
|
float NdotLm = clamp(dot(upVec, lightVec) * 1.01 - 0.01, 0.0, 1.0) * 0.99 + 0.01;
|
|
|
|
float distortBias = distortFactor * shadowDistance / 256.0;
|
|
distortBias *= 8.0 * distortBias;
|
|
float biasFactor = sqrt(1.0 - NdotLm * NdotLm) / NdotLm;
|
|
float bias = (distortBias * biasFactor + 0.05) / shadowMapResolution;
|
|
|
|
#if PIXEL_SHADOWS > 0
|
|
bias += 0.0025 / PIXEL_SHADOWS;
|
|
#endif
|
|
gl_Position.z -= bias * 11.0;
|
|
#else
|
|
mat = 4;
|
|
#endif
|
|
}
|
|
|
|
gl_Position.xy *= 1.0 / distortFactor;
|
|
gl_Position.z = gl_Position.z * 0.2;
|
|
}
|
|
|
|
#endif |