1 #ifndef MSP_GL_SHADOWMAP_H_
2 #define MSP_GL_SHADOWMAP_H_
6 #include "framebuffer.h"
7 #include "programdata.h"
15 class DirectionalLight;
19 Creates shadows on a renderable through a shadow map texture. In the setup
20 phase, the scene is rendered to a depth texture from the point of view of the
21 lightsource. This texture is then used in the rendering phase together with
22 texture coordinate generation to determine whether each fragment is lit.
24 class ShadowMap: public Effect
37 const Lighting *lighting;
38 std::vector<ShadowedLight> lights;
39 Renderable &shadow_caster;
42 const Sampler &sampler;
49 std::string debug_name;
51 ShadowMap(unsigned, unsigned, Renderable &, const Lighting *, Renderable &);
53 ShadowMap(unsigned, Renderable &, const DirectionalLight &, Renderable &);
54 ShadowMap(unsigned, unsigned, Renderable &, const Lighting &, Renderable &);
56 void add_light(const DirectionalLight &, unsigned);
58 /** Sets the ShadowMap target point and radius. The transformation matrix is
59 computed so that a sphere with the specified parameters will be completely
60 covered by the ShadowMap. */
61 void set_target(const Vector3 &, float);
63 /** Sets the darkness of shadows. Must be in the range between 0.0 and 1.0,
64 inclusive. Only usable with shaders, and provided through the
65 shadow_darkness uniform. */
66 void set_darkness(float);
68 /** Sets a distance beyond objects from which the shadow starts. Expressed
69 in pixel-sized units. Must be positive; values less than 1.0 are not
70 recommended. Larger values produce less depth artifacts, but may prevent
71 thin objects from casting shadows on nearby sufraces. */
72 void set_depth_bias(float);
74 const Texture2D &get_depth_texture() const { return depth_buf; }
76 virtual void setup_frame(Renderer &);
77 virtual void finish_frame();
79 virtual void render(Renderer &, Tag = Tag()) const;
81 virtual void set_debug_name(const std::string &);