summaryrefslogtreecommitdiff
path: root/client/shaders/object_shader/opengl_fragment.glsl
diff options
context:
space:
mode:
authorx2048 <codeforsmile@gmail.com>2022-04-14 22:49:30 +0200
committerGitHub <noreply@github.com>2022-04-14 22:49:30 +0200
commita5d29fa1d4bc6849d7a6529edc522accac8219d2 (patch)
tree16643a9fcfeef12802fb867803a7de35e93d649f /client/shaders/object_shader/opengl_fragment.glsl
parent9aabd911eb57a5ddef72dd9b7c96f5cca1bd258e (diff)
downloadminetest-a5d29fa1d4bc6849d7a6529edc522accac8219d2.tar.gz
minetest-a5d29fa1d4bc6849d7a6529edc522accac8219d2.tar.bz2
minetest-a5d29fa1d4bc6849d7a6529edc522accac8219d2.zip
Implement shadow offsets for the new SM distortion function (#12191)
* Move shadow position calculation to vertex shaders * Animate entire scene before rendering shadows to prevent lagging of shadows * Remove unnecessary use of PolygonOffsetFactor * Apply normal offset to both nodes and objects * Rename getPerspectiveFactor -> applyPerspectiveDistortion * Remove perspective distortion from fragment shaders
Diffstat (limited to 'client/shaders/object_shader/opengl_fragment.glsl')
-rw-r--r--client/shaders/object_shader/opengl_fragment.glsl35
1 files changed, 7 insertions, 28 deletions
diff --git a/client/shaders/object_shader/opengl_fragment.glsl b/client/shaders/object_shader/opengl_fragment.glsl
index 2611bf8ef..7baf5826f 100644
--- a/client/shaders/object_shader/opengl_fragment.glsl
+++ b/client/shaders/object_shader/opengl_fragment.glsl
@@ -19,10 +19,13 @@ uniform float animationTimer;
uniform float f_shadowfar;
uniform float f_shadow_strength;
uniform vec4 CameraPos;
- varying float normalOffsetScale;
+ uniform float xyPerspectiveBias0;
+ uniform float xyPerspectiveBias1;
+
varying float adj_shadow_strength;
varying float cosLight;
varying float f_normal_length;
+ varying vec3 shadow_position;
#endif
@@ -48,24 +51,7 @@ varying float vIDiff;
const float fogStart = FOG_START;
const float fogShadingParameter = 1.0 / (1.0 - fogStart);
-
-
#ifdef ENABLE_DYNAMIC_SHADOWS
-uniform float xyPerspectiveBias0;
-uniform float xyPerspectiveBias1;
-uniform float zPerspectiveBias;
-
-vec4 getPerspectiveFactor(in vec4 shadowPosition)
-{
- vec2 s = vec2(shadowPosition.x > CameraPos.x ? 1.0 : -1.0, shadowPosition.y > CameraPos.y ? 1.0 : -1.0);
- vec2 l = s * (shadowPosition.xy - CameraPos.xy) / (1.0 - s * CameraPos.xy);
- float pDistance = length(l);
- float pFactor = pDistance * xyPerspectiveBias0 + xyPerspectiveBias1;
- l /= pFactor;
- shadowPosition.xy = CameraPos.xy * (1.0 - l) + s * l;
- shadowPosition.z *= zPerspectiveBias;
- return shadowPosition;
-}
// assuming near is always 1.0
float getLinearDepth()
@@ -75,15 +61,7 @@ float getLinearDepth()
vec3 getLightSpacePosition()
{
- vec4 pLightSpace;
- // some drawtypes have zero normals, so we need to handle it :(
- #if DRAW_TYPE == NDT_PLANTLIKE
- pLightSpace = m_ShadowViewProj * vec4(worldPosition, 1.0);
- #else
- pLightSpace = m_ShadowViewProj * vec4(worldPosition + normalOffsetScale * normalize(vNormal), 1.0);
- #endif
- pLightSpace = getPerspectiveFactor(pLightSpace);
- return pLightSpace.xyz * 0.5 + 0.5;
+ return shadow_position * 0.5 + 0.5;
}
// custom smoothstep implementation because it's not defined in glsl1.2
// https://docs.gl/sl4/smoothstep
@@ -503,13 +481,14 @@ void main(void)
#ifdef COLORED_SHADOWS
vec4 visibility;
- if (cosLight > 0.0)
+ if (cosLight > 0.0 || f_normal_length < 1e-3)
visibility = getShadowColor(ShadowMapSampler, posLightSpace.xy, posLightSpace.z);
else
visibility = vec4(1.0, 0.0, 0.0, 0.0);
shadow_int = visibility.r;
shadow_color = visibility.gba;
#else
+ if (cosLight > 0.0 || f_normal_length < 1e-3)
if (cosLight > 0.0)
shadow_int = getShadow(ShadowMapSampler, posLightSpace.xy, posLightSpace.z);
else