Files
wireless-docs/assets/minecraft/shaders/core/lightmap.fsh
2026-07-03 22:04:34 -04:00

67 lines
2.1 KiB
GLSL

#version 330
layout(std140) uniform LightmapInfo {
float SkyFactor;
float BlockFactor;
float NightVisionFactor;
float DarknessScale;
float BossOverlayWorldDarkeningFactor;
float BrightnessFactor;
vec3 BlockLightTint;
vec3 SkyLightColor;
vec3 AmbientColor;
vec3 NightVisionColor;
} lightmapInfo;
in vec2 texCoord;
out vec4 fragColor;
float get_brightness(float level) {
return level / (4.0 - 3.0 * level);
}
vec3 notGamma(vec3 color) {
float maxComponent = max(max(color.x, color.y), color.z);
float maxInverted = 1.0f - maxComponent;
float maxScaled = 1.0f - maxInverted * maxInverted * maxInverted * maxInverted;
return color * (maxScaled / maxComponent);
}
float parabolicMixFactor(float level) {
return (2.0 * level - 1.0) * (2.0 * level - 1.0);
}
void main() {
// Calculate block and sky brightness levels based on texture coordinates
float block_level = floor(texCoord.x * 16) / 15;
float sky_level = floor(texCoord.y * 16) / 15;
float block_brightness = get_brightness(block_level) * lightmapInfo.BlockFactor;
float sky_brightness = get_brightness(sky_level) * lightmapInfo.SkyFactor;
// Calculate ambient color with or without night vision
vec3 nightVisionColor = lightmapInfo.NightVisionColor * lightmapInfo.NightVisionFactor;
vec3 color = max(lightmapInfo.AmbientColor, nightVisionColor);
// Add sky light
color += lightmapInfo.SkyLightColor * sky_brightness;
// Add block light
vec3 BlockLightColor = mix(lightmapInfo.BlockLightTint, vec3(1.0), 0.9 * parabolicMixFactor(block_level));
color += BlockLightColor * block_brightness;
// Apply boss overlay darkening effect
color = mix(color, color * vec3(0.7, 0.6, 0.6), lightmapInfo.BossOverlayWorldDarkeningFactor);
// Apply darkness effect scale
color = color - vec3(lightmapInfo.DarknessScale);
// Apply brightness
color = clamp(color, 0.0, 1.0);
vec3 notGamma = notGamma(color);
color = mix(color, notGamma, lightmapInfo.BrightnessFactor);
fragColor = vec4(color, 1.0);
}