X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Feffects%2Fshadowmap.cpp;h=0af9327132cf88c8222b31e11d2846329219f605;hb=7db40551e9197142b0b6cb7fd883b325684bb8c2;hp=eaf6e1373cb126a387d535e9e2b1352199eed2e7;hpb=7aaec9a70b8d7733429bec043f8e33e02956f266;p=libs%2Fgl.git diff --git a/source/effects/shadowmap.cpp b/source/effects/shadowmap.cpp index eaf6e137..0af93271 100644 --- a/source/effects/shadowmap.cpp +++ b/source/effects/shadowmap.cpp @@ -3,6 +3,7 @@ #include "camera.h" #include "light.h" #include "renderer.h" +#include "resources.h" #include "scene.h" #include "shadowmap.h" #include "tests.h" @@ -12,25 +13,15 @@ using namespace std; namespace Msp { namespace GL { -WeakPtr ShadowMap::shadow_sampler; - -ShadowMap::ShadowMap(unsigned s, Renderable &r, const Light &l): +ShadowMap::ShadowMap(Resources &resources, unsigned s, Renderable &r, const Light &l): Effect(r), size(s), light(l), + sampler(resources.get("_linear_clamp_shadow.samp")), radius(1), depth_bias(4), rendered(false) { - sampler = shadow_sampler; - if(!sampler) - { - sampler = new Sampler; - sampler->set_filter(LINEAR); - sampler->set_compare(LEQUAL); - sampler->set_wrap(CLAMP_TO_EDGE); - shadow_sampler = sampler; - } depth_buf.storage(DEPTH_COMPONENT32F, size, size, 1); fbo.attach(DEPTH_ATTACHMENT, depth_buf, 0); fbo.require_complete(); @@ -68,15 +59,14 @@ void ShadowMap::setup_frame(Renderer &renderer) rendered = true; renderable.setup_frame(renderer); - Camera camera; - camera.set_object_matrix(*light.get_matrix()); - camera.set_position(target); + shadow_camera.set_object_matrix(*light.get_matrix()); + shadow_camera.set_position(target); // TODO support point and spot lights with a frustum projection. // Omnidirectional lights also need a cube shadow map. - camera.set_orthographic(radius*2, radius*2); - camera.set_depth_clip(-radius, radius); + shadow_camera.set_orthographic(radius*2, radius*2); + shadow_camera.set_depth_clip(-radius, radius); - shadow_matrix = camera.get_object_matrix(); + shadow_matrix = shadow_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(); @@ -86,7 +76,7 @@ void ShadowMap::setup_frame(Renderer &renderer) fbo.clear(DEPTH_BUFFER_BIT); Renderer::Push push(renderer); - renderer.set_camera(camera); + renderer.set_camera(shadow_camera); renderer.render(renderable, "shadow"); } @@ -97,20 +87,11 @@ void ShadowMap::finish_frame() rendered = false; } -void ShadowMap::render(Renderer &renderer, const Tag &tag) const +void ShadowMap::render(Renderer &renderer, Tag tag) const { if(!enabled_passes.count(tag)) return renderer.render(renderable, tag); - Renderer::Push _push_rend(renderer); - - unsigned unit = renderer.allocate_effect_texunit(); - int iunit = unit; - shdata.uniform("shadow_map", iunit); - - Bind _bind_sampler(*sampler, unit); - Bind _bind_depth(depth_buf, unit); - if(const Camera *camera = renderer.get_camera()) /* Multiply by camera's object matrix to form a matrix that transforms from eye space to shadow space. */ @@ -118,6 +99,9 @@ void ShadowMap::render(Renderer &renderer, const Tag &tag) const else shdata.uniform("shd_eye_matrix", shadow_matrix); + Renderer::Push _push_rend(renderer); + + renderer.set_texture("shadow_map", &depth_buf, &sampler); renderer.add_shader_data(shdata); renderer.render(renderable, tag); }