X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Frender%2Frendertarget.cpp;h=00176710c4a796047e02c462e899fde26d0c8ffd;hp=b144580ca50a5aa04c35b35e266c958e63d69ae1;hb=HEAD;hpb=e9a898f315b5d1396f196d785913a283c30940f2 diff --git a/source/render/rendertarget.cpp b/source/render/rendertarget.cpp index b144580c..7eba2b2b 100644 --- a/source/render/rendertarget.cpp +++ b/source/render/rendertarget.cpp @@ -15,25 +15,27 @@ RenderTarget::RenderTarget(unsigned w, unsigned h, const FrameFormat &f): height(h), fbo(f) { - textures.reserve(f.size()); + bool multisample = (f.get_samples()>1); + textures.reserve(f.size()*(1+multisample)); unsigned samples = f.get_samples(); - for(const UInt16 *i=f.begin(); i!=f.end(); ++i) + for(FrameAttachment a: f) { - FrameAttachment fa = static_cast(*i); - PixelFormat pf = get_attachment_pixelformat(*i); + PixelFormat pf = get_attachment_pixelformat(a); - if(samples>1) + Texture2D *tex2d = new Texture2D; + tex2d->storage(pf, width, height, 1); + + if(multisample) { Texture2DMultisample *tex2d_ms = new Texture2DMultisample; tex2d_ms->storage(pf, width, height, samples); - fbo.attach(fa, *tex2d_ms); + fbo.attach(a, *tex2d_ms, tex2d); textures.push_back(tex2d_ms); + textures.push_back(tex2d); } else { - Texture2D *tex2d = new Texture2D; - tex2d->storage(pf, width, height, 1); - fbo.attach(fa, *tex2d); + fbo.attach(a, *tex2d); textures.push_back(tex2d); } } @@ -50,7 +52,7 @@ const Texture2D &RenderTarget::get_target_texture(unsigned i) const if(i>=textures.size()) throw out_of_range("RenderTarget::get_target_texture"); if(fbo.get_format().get_samples()>1) - throw invalid_operation("RenderTarget::get_target_texture"); + i = i*2+1; return *static_cast(textures[i]); } @@ -68,11 +70,11 @@ void RenderTarget::set_debug_name(const string &name) { #ifdef DEBUG fbo.set_debug_name(name+" [FBO]"); - const FrameFormat &fmt = fbo.get_format(); + bool multisample = (fbo.get_format().get_samples()>1); unsigned i = 0; - for(const UInt16 *j=fmt.begin(); j!=fmt.end(); ++i, ++j) + for(FrameAttachment a: fbo.get_format()) { - unsigned attach_pt = get_attach_point(static_cast(*j)); + unsigned attach_pt = get_attach_point(a); string tex_name; if(attach_pt==get_attach_point(DEPTH_ATTACHMENT)) @@ -82,7 +84,9 @@ void RenderTarget::set_debug_name(const string &name) else tex_name = Msp::format("%s/color%d", name, attach_pt); - textures[i]->set_debug_name(tex_name+".tex2d"); + textures[i++]->set_debug_name(tex_name+".tex"); + if(multisample) + textures[i++]->set_debug_name(tex_name+"_resolve.tex"); } #else (void)name;