X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fshadowmap.cpp;h=5f66d8984279ce55f9cfc98fcf2298d34fa31337;hb=98c810b6d2256aa65986bbde12c38917678121bb;hp=9c8b57bf938ebfc6c87a37a138bc35b72b7a858a;hpb=83bf78244e92ca6731edd8075f158fcec6e53027;p=libs%2Fgl.git diff --git a/source/shadowmap.cpp b/source/shadowmap.cpp index 9c8b57bf..5f66d898 100644 --- a/source/shadowmap.cpp +++ b/source/shadowmap.cpp @@ -24,6 +24,7 @@ ShadowMap::ShadowMap(unsigned s, const Scene &c, const Light &l): size(s), scene(c), light(l), + unit(3), radius(1) { depth_buf.set_min_filter(LINEAR); @@ -35,7 +36,7 @@ ShadowMap::ShadowMap(unsigned s, const Scene &c, const Light &l): depth_buf.parameter(GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); depth_buf.parameter(GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); fbo.attach(DEPTH_ATTACHMENT, depth_buf, 0); - glDrawBuffer(GL_NONE); + draw_buffer(NO_BUFFER); Framebuffer::unbind(); Texture::unbind(); } @@ -46,6 +47,11 @@ void ShadowMap::set_target(const Vector3 &t, float r) radius=r; } +void ShadowMap::set_texture_unit(unsigned u) +{ + unit=u; +} + void ShadowMap::prepare() { const Vector4 &lpos=light.get_position(); @@ -95,18 +101,22 @@ void ShadowMap::prepare() push_matrix(); load_matrix(matrix); - Bind _bind_fbo(fbo); - glViewport(0, 0, size, size); - glClear(GL_DEPTH_BUFFER_BIT); + const Framebuffer *old_fbo=Framebuffer::current(); + fbo.bind(); + clear(DEPTH_BUFFER_BIT); scene.render("shadow"); matrix_mode(PROJECTION); pop_matrix(); matrix_mode(MODELVIEW); pop_matrix(); + if(old_fbo) + old_fbo->bind(); + else + Framebuffer::unbind(); } - depth_buf.bind_to(3); + depth_buf.bind_to(unit); float diam=radius*2; float s_eq[4]={ matrix[0]/diam, matrix[4]/diam, matrix[8]/diam, matrix[12]/diam+0.5 }; float t_eq[4]={ matrix[1]/diam, matrix[5]/diam, matrix[9]/diam, matrix[13]/diam+0.5 }; @@ -126,7 +136,7 @@ void ShadowMap::prepare() void ShadowMap::cleanup() { - TexUnit::activate(3); + TexUnit::activate(unit); Texture::unbind(); disable(GL_TEXTURE_GEN_S); disable(GL_TEXTURE_GEN_T);