]> git.tdb.fi Git - libs/gl.git/commitdiff
Use an orthographic camera for rendering the shadow map
authorMikko Rasa <tdb@tdb.fi>
Sat, 5 Nov 2016 22:20:40 +0000 (00:20 +0200)
committerMikko Rasa <tdb@tdb.fi>
Sat, 5 Nov 2016 23:34:20 +0000 (01:34 +0200)
source/shadowmap.cpp
source/shadowmap.h

index bc46f2c1b298827738a9db5c6d5140c1362edb50..4ad192cad1d737cb90dc464f4e9ca7b639ca8d70 100644 (file)
@@ -64,41 +64,18 @@ void ShadowMap::setup_frame() const
        rendered = true;
        renderable.setup_frame();
 
+       Camera camera;
        const Vector4 &lpos = light.get_position();
-       Vector3 back;
-       if(lpos.w)
-       {
-               /* XXX Not really proper way to support positional lights, but good
-               enough when the light source is far away */
-               back = lpos.slice<3>(0)-target;
-       }
-       else
-               back = lpos.slice<3>(0);
-       back.normalize();
-
-       Vector3 up;
-       if(abs(back.z)<0.99)
-               up = Vector3(0, 0, 1);
-       else
-               up = Vector3(0, 1, 0);
-
-       Vector3 right = normalize(cross(up, back));
+       /* XXX Not really proper way to support positional lights, but good
+       enough when the light source is far away */
+       camera.set_look_direction(lpos.w*target-lpos.slice<3>(0));
 
-       Vector4 columns[4];
-       columns[0] = compose(right, 0.0f);
-       columns[1] = compose(normalize(cross(back, right)), 0.0f);
-       columns[2] = compose(back, 0.0f);
-       columns[3] = compose(target, 1.0f);
-       light_matrix = Matrix::from_columns(columns);
-       view_matrix = invert(light_matrix);
+       camera.set_up_direction((abs(camera.get_look_direction().z)<0.99) ? Vector3(0, 0, 1) : Vector3(0, 1, 0));
+       camera.set_position(target);
+       camera.set_orthographic(radius*2, radius*2);
+       camera.set_depth_clip(-radius, radius);
 
-       MatrixStack::Push push_mv(MatrixStack::modelview());
-       MatrixStack::Push push_proj(MatrixStack::projection());
-
-       MatrixStack::projection() = Matrix::ortho(-radius, radius, -radius, radius, -radius, radius);
-       MatrixStack::modelview() = view_matrix;
-
-       shadow_matrix = light_matrix;
+       shadow_matrix = camera.get_object_matrix();
        shadow_matrix.scale(radius*2, radius*2, -radius*2);
        shadow_matrix.translate(-0.5, -0.5, depth_bias/size-0.5);
        shadow_matrix.invert();
@@ -106,7 +83,9 @@ void ShadowMap::setup_frame() const
        BindRestore bind_fbo(fbo);
        Bind bind_depth(DepthTest::lequal());
        fbo.clear(DEPTH_BUFFER_BIT);
-       renderable.render("shadow");
+
+       Renderer renderer(&camera);
+       renderable.render(renderer, "shadow");
 }
 
 void ShadowMap::finish_frame() const
index 3757b1f190f0ef167f685ef4bc113182dc10b9d6..119d369c1eb6db052048d941008c18f7b3d58560 100644 (file)
@@ -25,8 +25,6 @@ private:
        unsigned size;
        const Light &light;
        mutable Framebuffer fbo;
-       mutable Matrix light_matrix;
-       mutable Matrix view_matrix;
        mutable Matrix shadow_matrix;
        Texture2D depth_buf;
        Vector3 target;