aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry Kostenko <codeforsmile@gmail.com>2022-02-20 00:18:39 +0100
committerx2048 <codeforsmile@gmail.com>2022-03-07 23:45:26 +0100
commitb651bbf44639b9bdd1d5ef581acb57fd47cc6b7a (patch)
tree22249f6945bf6dde7d898ceef293403e600683a0
parent4801bdf45aaaa9238bc52a157e1d25c9d477d81a (diff)
downloadminetest-b651bbf44639b9bdd1d5ef581acb57fd47cc6b7a.tar.gz
minetest-b651bbf44639b9bdd1d5ef581acb57fd47cc6b7a.tar.bz2
minetest-b651bbf44639b9bdd1d5ef581acb57fd47cc6b7a.zip
Reuse normal offset calculation for nodes
-rw-r--r--client/shaders/nodes_shader/opengl_fragment.glsl3
-rw-r--r--client/shaders/nodes_shader/opengl_vertex.glsl18
2 files changed, 16 insertions, 5 deletions
diff --git a/client/shaders/nodes_shader/opengl_fragment.glsl b/client/shaders/nodes_shader/opengl_fragment.glsl
index c24619539..e5f5c703a 100644
--- a/client/shaders/nodes_shader/opengl_fragment.glsl
+++ b/client/shaders/nodes_shader/opengl_fragment.glsl
@@ -74,8 +74,7 @@ vec3 getLightSpacePosition()
#if DRAW_TYPE == NDT_PLANTLIKE
pLightSpace = m_ShadowViewProj * vec4(worldPosition, 1.0);
#else
- float offsetScale = (0.0057 * getLinearDepth() + normalOffsetScale);
- pLightSpace = m_ShadowViewProj * vec4(worldPosition + offsetScale * normalize(vNormal), 1.0);
+ pLightSpace = m_ShadowViewProj * vec4(worldPosition + normalOffsetScale * normalize(vNormal), 1.0);
#endif
pLightSpace = getPerspectiveFactor(pLightSpace);
return pLightSpace.xyz * 0.5 + 0.5;
diff --git a/client/shaders/nodes_shader/opengl_vertex.glsl b/client/shaders/nodes_shader/opengl_vertex.glsl
index d316930b2..95cd138a8 100644
--- a/client/shaders/nodes_shader/opengl_vertex.glsl
+++ b/client/shaders/nodes_shader/opengl_vertex.glsl
@@ -45,6 +45,8 @@ varying float nightRatio;
const vec3 artificialLight = vec3(1.04, 1.04, 1.04);
const float e = 2.718281828459;
const float BS = 10.0;
+const float bias0 = 0.9;
+const float bias1 = 1.0 - bias0;
#ifdef ENABLE_DYNAMIC_SHADOWS
// custom smoothstep implementation because it's not defined in glsl1.2
@@ -195,10 +197,20 @@ void main(void)
#ifdef ENABLE_DYNAMIC_SHADOWS
vec3 nNormal = normalize(vNormal);
cosLight = dot(nNormal, -v_LightDirection);
- float texelSize = 767.0 / f_textureresolution;
- float slopeScale = clamp(1.0 - abs(cosLight), 0.0, 1.0);
- normalOffsetScale = texelSize * slopeScale;
+ // 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));