Files
Gregtech-New-Bastards/.minecraft/shaderpacks/ComplementaryShaders_v4.6/shaders/program/shadow.glsl
2025-09-13 16:11:10 +02:00

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