diff options
author | Dmitry Kostenko <codeforsmile@gmail.com> | 2022-02-20 00:18:39 +0100 |
---|---|---|
committer | x2048 <codeforsmile@gmail.com> | 2022-03-07 23:45:26 +0100 |
commit | b651bbf44639b9bdd1d5ef581acb57fd47cc6b7a (patch) | |
tree | 22249f6945bf6dde7d898ceef293403e600683a0 /client/shaders/nodes_shader/opengl_vertex.glsl | |
parent | 4801bdf45aaaa9238bc52a157e1d25c9d477d81a (diff) | |
download | minetest-b651bbf44639b9bdd1d5ef581acb57fd47cc6b7a.tar.gz minetest-b651bbf44639b9bdd1d5ef581acb57fd47cc6b7a.tar.bz2 minetest-b651bbf44639b9bdd1d5ef581acb57fd47cc6b7a.zip |
Reuse normal offset calculation for nodes
Diffstat (limited to 'client/shaders/nodes_shader/opengl_vertex.glsl')
-rw-r--r-- | client/shaders/nodes_shader/opengl_vertex.glsl | 18 |
1 files changed, 15 insertions, 3 deletions
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)); |