]> git.tdb.fi Git - libs/gl.git/commitdiff
Use RenderTarget objects to manage FBOs in postprocessors
authorMikko Rasa <tdb@tdb.fi>
Sat, 3 Dec 2016 16:31:48 +0000 (18:31 +0200)
committerMikko Rasa <tdb@tdb.fi>
Sat, 3 Dec 2016 16:33:16 +0000 (18:33 +0200)
source/ambientocclusion.cpp
source/ambientocclusion.h
source/bloom.cpp
source/bloom.h

index 53b51e127d0993ce8e15093d1d1b1dc25c59c192..cb4bc9d29ff381685e37c713aa8fd9d2200942b9 100644 (file)
@@ -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);
index aae5fb29b8c45449759e590da4d4bced27f0dfd5..fc930bad80139fa6eafbb26d5bb49bd9639a6365 100644 (file)
@@ -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;
index 733b14a2e5a0fe5245c4b7a362bbc802f6b40916..039f414b998c512382b5cd1ef0f7043dc04c0e61 100644 (file)
@@ -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);
                }
index 957febb20923670ebe53bd99aeb6b31de4faa059..73232d16e4058534c5ee88c02c43a8ca5dd941c2 100644 (file)
@@ -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. */