11 ShadowMap::ShadowMap(unsigned s, Renderable &r, const Light &l, Renderable &c):
16 sampler(Resources::get_global().get<Sampler>("_linear_clamp_shadow.samp")),
21 depth_buf.storage(DEPTH_COMPONENT32F, size, size, 1);
22 fbo.set_format((DEPTH_ATTACHMENT,DEPTH_COMPONENT32F));
23 fbo.attach(DEPTH_ATTACHMENT, depth_buf, 0);
26 shdata.uniform("shd_world_matrix", Matrix());
29 void ShadowMap::set_target(const Vector3 &t, float r)
35 void ShadowMap::set_darkness(float d)
38 throw invalid_argument("ShadowMap::set_darkness");
40 shdata.uniform("shadow_darkness", d);
43 void ShadowMap::set_depth_bias(float b)
46 throw invalid_argument("ShadowMap::set_depth_bias");
51 void ShadowMap::setup_frame(Renderer &renderer)
57 renderable.setup_frame(renderer);
58 shadow_caster.setup_frame(renderer);
60 shadow_camera.set_object_matrix(*light.get_matrix());
61 shadow_camera.set_position(target);
62 // TODO support point and spot lights with a frustum projection.
63 // Omnidirectional lights also need a cube shadow map.
64 shadow_camera.set_orthographic(radius*2, radius*2);
65 shadow_camera.set_depth_clip(-radius, radius);
67 shadow_matrix = shadow_camera.get_object_matrix();
68 shadow_matrix.scale(radius*2, radius*2, -radius*2);
69 shadow_matrix.translate(-0.5, -0.5, depth_bias/size-0.5);
70 shadow_matrix.invert();
72 shdata.uniform("shd_world_matrix", shadow_matrix);
74 Renderer::Push push(renderer);
75 renderer.set_framebuffer(&fbo);
76 renderer.set_camera(shadow_camera);
78 renderer.render(shadow_caster);
81 void ShadowMap::finish_frame()
86 renderable.finish_frame();
90 void ShadowMap::render(Renderer &renderer, Tag tag) const
92 if(!enabled_passes.count(tag))
93 return renderer.render(renderable, tag);
95 Renderer::Push _push_rend(renderer);
97 renderer.set_texture("shadow_map", &depth_buf, &sampler);
98 renderer.add_shader_data(shdata);
99 renderer.render(renderable, tag);
102 void ShadowMap::set_debug_name(const string &name)
105 fbo.set_debug_name(name+" [FBO]");
106 shadow_camera.set_debug_name(name+".camera");
107 depth_buf.set_debug_name(name+"/depth.tex2d");
108 shdata.set_debug_name(name+" [UBO]");