]> git.tdb.fi Git - libs/gl.git/commitdiff
Apply shadow depth bias in a different way
authorMikko Rasa <tdb@tdb.fi>
Mon, 11 Oct 2021 13:05:16 +0000 (16:05 +0300)
committerMikko Rasa <tdb@tdb.fi>
Mon, 11 Oct 2021 13:14:31 +0000 (16:14 +0300)
It cannot be properly applied through the matrix for perspective
projection.

shaderlib/shadow.glsl
source/effects/shadowmap.cpp

index 2fa1fd81686c832f3ce78463467500966c092a8e..438af68d45181a86b6ec16f3cef065ba91ab88c4 100644 (file)
@@ -6,6 +6,7 @@ struct ShadowParameters
        float darkness;
        int matrix_index;
        vec4 region;
+       float bias;
 };
 
 uniform ShadowMap
@@ -26,7 +27,10 @@ virtual float get_shadow_factor(int index, vec4 world_pos)
                int type = shadows[index].type;
                vec3 shadow_coord;
                if(type==1)
+               {
                        shadow_coord = (shd_world_matrix[shadows[index].matrix_index]*world_pos).xyz;
+                       shadow_coord.z -= shadows[index].bias;
+               }
                else
                        return 1.0;
 
@@ -34,7 +38,7 @@ virtual float get_shadow_factor(int index, vec4 world_pos)
                        return 1.0;
 
                vec4 region = shadows[index].region;
-               float shadow_sample = texture(shadow_map, shadow_coord*vec3(region.zw, 1.0)+vec3(region.xy, 0.0));
+               float shadow_sample = texture(shadow_map, vec3(shadow_coord.xy*region.zw+region.xy, shadow_coord.z));
                return mix(1.0, shadow_sample, shadows[index].darkness);
        }
        else
index 4cc0475d3e6ad79fae9d207755161ffba3826503..465243973f3c87a702b23727c5bdea3a5a3266d5 100644 (file)
@@ -30,6 +30,7 @@ ShadowMap::ShadowMap(unsigned w, unsigned h, Renderable &r, const Lighting *l):
                shdata.uniform(base+".darkness", 1.0f);
                shdata.uniform(base+".matrix_index", 0);
                shdata.uniform(base+".region", Vector4(0.0f, 0.0f, 1.0f, 1.0f));
+               shdata.uniform(base+".bias", 0.0f);
        }
 
        Matrix dummy_matrix;
@@ -160,6 +161,13 @@ void ShadowMap::setup_frame(Renderer &renderer)
        for(const ShadowedLight &l: lights)
                l.shadow_caster->setup_frame(renderer);
 
+       for(const ShadowedLight &l: lights)
+       {
+               string base = format("shadows[%d]", l.index);
+               if(l.type==DIRECTIONAL)
+                       shdata.uniform(base+".bias", depth_bias/l.region.width);
+       }
+
        vector<Matrix> shadow_matrices;
        shadow_matrices.reserve(views.size());
        for(ShadowView &v: views)
@@ -174,7 +182,7 @@ void ShadowMap::setup_frame(Renderer &renderer)
                        v.camera.set_depth_clip(-radius, radius);
                }
 
-               Matrix to_texcoord = Matrix().translate(Vector3(0.5f, 0.5f, 0.5f-depth_bias/light.region.width)).scale(0.5f);
+               Matrix to_texcoord = Matrix().translate(Vector3(0.5f, 0.5f, 0.5f)).scale(0.5f);
                shadow_matrices.push_back(to_texcoord*v.camera.get_projection_matrix()*v.camera.get_view_matrix());
        }