mirror of
https://github.com/luanti-org/luanti.git
synced 2025-08-01 17:38:41 +00:00
Add API to control shadow intensity from the game/mod (#11944)
* Also Disable shadows when sun/moon is hidden. Fixes #11972.
This commit is contained in:
parent
8d55702d13
commit
0f25fa7af6
24 changed files with 375 additions and 169 deletions
|
@ -105,33 +105,35 @@ void main(void)
|
|||
|
||||
|
||||
#ifdef ENABLE_DYNAMIC_SHADOWS
|
||||
vec3 nNormal = normalize(vNormal);
|
||||
cosLight = dot(nNormal, -v_LightDirection);
|
||||
if (f_shadow_strength > 0.0) {
|
||||
vec3 nNormal = normalize(vNormal);
|
||||
cosLight = dot(nNormal, -v_LightDirection);
|
||||
|
||||
// Calculate normal offset scale based on the texel size adjusted for
|
||||
// curvature of the SM texture. This code must be change together with
|
||||
// getPerspectiveFactor or any light-space transformation.
|
||||
vec3 eyeToVertex = worldPosition - eyePosition + cameraOffset;
|
||||
// Distance from the vertex to the player
|
||||
float distanceToPlayer = length(eyeToVertex - v_LightDirection * dot(eyeToVertex, v_LightDirection)) / f_shadowfar;
|
||||
// perspective factor estimation according to the
|
||||
float perspectiveFactor = distanceToPlayer * bias0 + bias1;
|
||||
float texelSize = f_shadowfar * perspectiveFactor * perspectiveFactor /
|
||||
(f_textureresolution * bias1 - perspectiveFactor * bias0);
|
||||
float slopeScale = clamp(pow(1.0 - cosLight*cosLight, 0.5), 0.0, 1.0);
|
||||
normalOffsetScale = texelSize * slopeScale;
|
||||
|
||||
if (f_timeofday < 0.2) {
|
||||
adj_shadow_strength = f_shadow_strength * 0.5 *
|
||||
(1.0 - mtsmoothstep(0.18, 0.2, f_timeofday));
|
||||
} else if (f_timeofday >= 0.8) {
|
||||
adj_shadow_strength = f_shadow_strength * 0.5 *
|
||||
mtsmoothstep(0.8, 0.83, f_timeofday);
|
||||
} else {
|
||||
adj_shadow_strength = f_shadow_strength *
|
||||
mtsmoothstep(0.20, 0.25, f_timeofday) *
|
||||
(1.0 - mtsmoothstep(0.7, 0.8, f_timeofday));
|
||||
// Calculate normal offset scale based on the texel size adjusted for
|
||||
// curvature of the SM texture. This code must be change together with
|
||||
// getPerspectiveFactor or any light-space transformation.
|
||||
vec3 eyeToVertex = worldPosition - eyePosition + cameraOffset;
|
||||
// Distance from the vertex to the player
|
||||
float distanceToPlayer = length(eyeToVertex - v_LightDirection * dot(eyeToVertex, v_LightDirection)) / f_shadowfar;
|
||||
// perspective factor estimation according to the
|
||||
float perspectiveFactor = distanceToPlayer * bias0 + bias1;
|
||||
float texelSize = f_shadowfar * perspectiveFactor * perspectiveFactor /
|
||||
(f_textureresolution * bias1 - perspectiveFactor * bias0);
|
||||
float slopeScale = clamp(pow(1.0 - cosLight*cosLight, 0.5), 0.0, 1.0);
|
||||
normalOffsetScale = texelSize * slopeScale;
|
||||
|
||||
if (f_timeofday < 0.2) {
|
||||
adj_shadow_strength = f_shadow_strength * 0.5 *
|
||||
(1.0 - mtsmoothstep(0.18, 0.2, f_timeofday));
|
||||
} else if (f_timeofday >= 0.8) {
|
||||
adj_shadow_strength = f_shadow_strength * 0.5 *
|
||||
mtsmoothstep(0.8, 0.83, f_timeofday);
|
||||
} else {
|
||||
adj_shadow_strength = f_shadow_strength *
|
||||
mtsmoothstep(0.20, 0.25, f_timeofday) *
|
||||
(1.0 - mtsmoothstep(0.7, 0.8, f_timeofday));
|
||||
}
|
||||
f_normal_length = length(vNormal);
|
||||
}
|
||||
f_normal_length = length(vNormal);
|
||||
#endif
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue