X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fshadowmap.cpp;h=6250f899005b23684f0397b324609a174a858631;hb=9087cc0a372b9c739f15398c7a22c0a6eb5041bb;hp=0390bdcbc5baa0c56540ae485dbcedad572d2390;hpb=7684f8cc99f80db093e7ba0a199ff37c4c315bdb;p=libs%2Fgl.git diff --git a/source/shadowmap.cpp b/source/shadowmap.cpp index 0390bdcb..6250f899 100644 --- a/source/shadowmap.cpp +++ b/source/shadowmap.cpp @@ -20,11 +20,11 @@ ShadowMap::ShadowMap(unsigned s, Renderable &r, const Light &l): depth_bias(4), rendered(false) { - depth_buf.set_min_filter(LINEAR); - depth_buf.set_compare_enabled(true); - depth_buf.set_compare_func(LEQUAL); - depth_buf.set_wrap(CLAMP_TO_EDGE); - depth_buf.storage(DEPTH_COMPONENT, size, size); + Sampler &depth_samp = depth_buf.get_default_sampler(); + depth_samp.set_min_filter(LINEAR); + depth_samp.set_compare(LEQUAL); + depth_samp.set_wrap(CLAMP_TO_EDGE); + depth_buf.storage(DEPTH_COMPONENT32F, size, size, 1); fbo.attach(DEPTH_ATTACHMENT, depth_buf, 0); fbo.require_complete(); @@ -62,13 +62,10 @@ void ShadowMap::setup_frame(Renderer &renderer) renderable.setup_frame(renderer); Camera camera; - const Vector4 &lpos = light.get_position(); - /* 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)); - - camera.set_up_direction((abs(camera.get_look_direction().z)<0.99) ? Vector3(0, 0, 1) : Vector3(0, 1, 0)); + camera.set_object_matrix(*light.get_matrix()); 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); @@ -102,7 +99,7 @@ void ShadowMap::render(Renderer &renderer, const Tag &tag) const unsigned unit = renderer.allocate_effect_texunit(); int iunit = unit; - shdata.uniform("shadow", iunit); + shdata.uniform("shadow_map", iunit); Bind _bind_depth(depth_buf, unit);