]> git.tdb.fi Git - libs/gl.git/blob - source/shadowmap.h
Improvements for shadow mapping
[libs/gl.git] / source / shadowmap.h
1 #ifndef SHADOWMAP_H_
2 #define SHADOWMAP_H_
3
4 #include "effect.h"
5 #include "framebuffer.h"
6 #include "programdata.h"
7 #include "texture2d.h"
8 #include "vector.h"
9
10 namespace Msp {
11 namespace GL {
12
13 class Light;
14 class Scene;
15
16 /**
17 Creates shadows on a Scene through a shadow map texture.  In the preparation
18 phase, the scene is rendered to a depth texture from the point of view of the
19 lightsource.  This texture is then used in the rendering phase together with
20 texture coordinate generation to determine whether each fragment is lit.
21 */
22 class ShadowMap: public Effect
23 {
24 private:
25         unsigned size;
26         const Light &light;
27         mutable Framebuffer fbo;
28         unsigned unit;
29         Texture2D depth_buf;
30         Vector3 target;
31         float radius;
32         float depth_bias;
33         ProgramData shdata;
34
35 public:
36         ShadowMap(unsigned, const Renderable &, const Light &);
37
38         /** Sets the ShadowMap target point and radius.  The transformation matrix is
39         computed so that a sphere with the specified parameters will be completely
40         covered by the ShadowMap. */
41         void set_target(const Vector3 &, float);
42
43         /** Sets the darkness of shadows.  Must be in the range between 0.0 and 1.0,
44         inclusive.  Only usable with shaders, and provided through the
45         shadow_darkness uniform. */
46         void set_darkness(float);
47
48         /** Sets a distance beyond objects from which the shadow starts.  Expressed
49         in pixel-sized units.  Must be positive; values less than 1.0 are not
50         recommended.  Larger values produce less depth artifacts, but may prevent
51         thin objects from casting shadows on nearby sufraces. */
52         void set_depth_bias(float);
53
54         /** Sets the texture unit to bind the shadow map to during the rendering
55         phase.  Provided to shaders through the shadow and shadow_unit uniforms.
56         The default is texture unit 3. */
57         void set_texture_unit(unsigned);
58
59         virtual void render(Renderer &, const Tag &) const;
60 };
61
62 } // namespace GL
63 } // namespace Msp
64
65 #endif