From: Mikko Rasa Date: Sat, 3 Dec 2016 16:31:48 +0000 (+0200) Subject: Use RenderTarget objects to manage FBOs in postprocessors X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=commitdiff_plain;h=8ec12629c4808588b0eaef88147e22fa658ac990 Use RenderTarget objects to manage FBOs in postprocessors --- diff --git a/source/ambientocclusion.cpp b/source/ambientocclusion.cpp index 53b51e12..cb4bc9d2 100644 --- a/source/ambientocclusion.cpp +++ b/source/ambientocclusion.cpp @@ -10,18 +10,12 @@ namespace Msp { namespace GL { AmbientOcclusion::AmbientOcclusion(unsigned w, unsigned h, float depth_ratio): + occlude_target(w, h, (RENDER_COLOR,RGB)), occlude_shader("ambientocclusion_occlude.glsl"), combine_shader("ambientocclusion_combine.glsl"), quad(get_fullscreen_quad()) { - occlusion.storage(RGB, w, h); - occlusion.set_min_filter(NEAREST); - occlusion.set_mag_filter(NEAREST); - occlusion.set_wrap(CLAMP_TO_EDGE); - fbo.attach(COLOR_ATTACHMENT0, occlusion, 0); - fbo.require_complete(); - - combine_texturing.attach(2, occlusion); + combine_texturing.attach(2, occlude_target.get_target_texture(RENDER_COLOR)); rotate_lookup.storage(RGBA, 4, 4); rotate_lookup.set_min_filter(NEAREST); @@ -73,10 +67,9 @@ void AmbientOcclusion::render(Renderer &renderer, const Texture2D &color, const combine_texturing.attach(0, depth); combine_texturing.attach(1, color); - { Renderer::Push push(renderer); - BindRestore bind_fbo(fbo); + BindRestore bind_fbo(occlude_target.get_framebuffer()); renderer.set_texturing(&occlude_texturing); renderer.set_shader_program(&occlude_shader, &occlude_shdata); quad.draw(renderer); diff --git a/source/ambientocclusion.h b/source/ambientocclusion.h index aae5fb29..fc930bad 100644 --- a/source/ambientocclusion.h +++ b/source/ambientocclusion.h @@ -6,6 +6,7 @@ #include "postprocessor.h" #include "program.h" #include "programdata.h" +#include "rendertarget.h" #include "texture2d.h" #include "texturing.h" @@ -20,9 +21,8 @@ http://en.wikipedia.org/wiki/Screen_Space_Ambient_Occlusion class AmbientOcclusion: public PostProcessor { private: - Texture2D occlusion; Texture2D rotate_lookup; - Framebuffer fbo; + RenderTarget occlude_target; Texturing occlude_texturing; Program occlude_shader; ProgramData occlude_shdata; diff --git a/source/bloom.cpp b/source/bloom.cpp index 733b14a2..039f414b 100644 --- a/source/bloom.cpp +++ b/source/bloom.cpp @@ -23,23 +23,23 @@ Bloom::Bloom(unsigned w, unsigned h): blur_shdata_common.uniform("source", 0); for(unsigned i=0; i<2; ++i) - { - tex[i].set_min_filter(NEAREST); - tex[i].set_wrap(CLAMP_TO_EDGE); - tex[i].storage(RGB16F, w, h); - fbo[i].attach(COLOR_ATTACHMENT0, tex[i], 0); - fbo[i].require_complete(); - } + target[i] = new RenderTarget(w, h, (RENDER_COLOR,RGB16F)); combine_shdata.uniform("source", 1); combine_shdata.uniform("blurred", 0); - combine_texturing.attach(0, tex[1]); + combine_texturing.attach(0, target[1]->get_target_texture(RENDER_COLOR)); set_radius(2.0f); set_strength(0.2f); } +Bloom::~Bloom() +{ + for(unsigned i=0; i<2; ++i) + delete target[i]; +} + void Bloom::set_radius(float r) { if(r<=0.0f) @@ -73,9 +73,9 @@ void Bloom::render(Renderer &renderer, const Texture2D &src, const Texture2D &) renderer.set_shader_program(&blur_shader, &blur_shdata_common); for(unsigned i=0; i<2; ++i) { - BindRestore bind_fbo(fbo[i]); + BindRestore bind_fbo(target[i]->get_framebuffer()); Renderer::Push push2(renderer); - renderer.set_texture(i ? &tex[0] : &src); + renderer.set_texture(i ? &target[0]->get_target_texture(RENDER_COLOR) : &src); renderer.add_shader_data(blur_shdata[i]); quad.draw(renderer); } diff --git a/source/bloom.h b/source/bloom.h index 957febb2..73232d16 100644 --- a/source/bloom.h +++ b/source/bloom.h @@ -8,6 +8,7 @@ #include "texturing.h" #include "program.h" #include "programdata.h" +#include "rendertarget.h" namespace Msp { namespace GL { @@ -23,8 +24,7 @@ a blur filter. class Bloom: public PostProcessor { private: - Framebuffer fbo[2]; - Texture2D tex[2]; + RenderTarget *target[2]; Program blur_shader; ProgramData blur_shdata_common; ProgramData blur_shdata[2]; @@ -35,6 +35,7 @@ private: public: Bloom(unsigned, unsigned); + ~Bloom(); /** Sets the σ value of the gaussian blur. Values much larger than 4.0 are likely to cause artifacts. */