67 lines
2.1 KiB
GLSL
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);
|
|
}
|