From a525c632144d3dcefe373916bdde789727d2230d Mon Sep 17 00:00:00 2001 From: Mikko Rasa Date: Sat, 3 Dec 2016 18:37:53 +0200 Subject: [PATCH] Refactor postprocessor uniform usage A lot of the values are shared between processing passes, so it doesn't make sense to keep multiple copies. ProgramData will take care of only setting the required uniforms. --- shaderlib/bloom.glsl | 2 +- source/ambientocclusion.cpp | 38 ++++++++++++++++--------------------- source/ambientocclusion.h | 6 ++---- source/bloom.cpp | 36 ++++++++++++++++------------------- source/bloom.h | 3 +-- 5 files changed, 36 insertions(+), 49 deletions(-) diff --git a/shaderlib/bloom.glsl b/shaderlib/bloom.glsl index 9b63d2ef..262cb29b 100644 --- a/shaderlib/bloom.glsl +++ b/shaderlib/bloom.glsl @@ -1,7 +1,7 @@ uniform sampler2D blurred; +uniform vec2 delta; uniform BloomParams { - vec2 delta; float factors[19]; int size; float strength; diff --git a/source/ambientocclusion.cpp b/source/ambientocclusion.cpp index cb4bc9d2..1b078cdc 100644 --- a/source/ambientocclusion.cpp +++ b/source/ambientocclusion.cpp @@ -15,7 +15,7 @@ AmbientOcclusion::AmbientOcclusion(unsigned w, unsigned h, float depth_ratio): combine_shader("ambientocclusion_combine.glsl"), quad(get_fullscreen_quad()) { - combine_texturing.attach(2, occlude_target.get_target_texture(RENDER_COLOR)); + texturing.attach(2, occlude_target.get_target_texture(RENDER_COLOR)); rotate_lookup.storage(RGBA, 4, 4); rotate_lookup.set_min_filter(NEAREST); @@ -33,16 +33,13 @@ AmbientOcclusion::AmbientOcclusion(unsigned w, unsigned h, float depth_ratio): } rotate_lookup.image(0, RGBA, UNSIGNED_BYTE, data); - occlude_texturing.attach(1, rotate_lookup); + texturing.attach(3, rotate_lookup); - occlude_shdata.uniform("depth", 0); - occlude_shdata.uniform("rotate", 1); - occlude_shdata.uniform("screen_size", static_cast(w), static_cast(h)); - - combine_shdata.uniform("source", 1); - combine_shdata.uniform("depth", 0); - combine_shdata.uniform("occlusion", 2); - combine_shdata.uniform("screen_size", static_cast(w), static_cast(h)); + shdata.uniform("source", 0); + shdata.uniform("depth", 1); + shdata.uniform("occlusion", 2); + shdata.uniform("rotate", 3); + shdata.uniform("screen_size", static_cast(w), static_cast(h)); set_depth_ratio(depth_ratio); set_darkness(1.5); @@ -52,32 +49,29 @@ void AmbientOcclusion::set_depth_ratio(float depth_ratio) { depth_ratio = 1/depth_ratio; - occlude_shdata.uniform("depth_ratio", depth_ratio, 1+depth_ratio); - combine_shdata.uniform("depth_ratio", depth_ratio, 1+depth_ratio); + shdata.uniform("depth_ratio", depth_ratio, 1+depth_ratio); } void AmbientOcclusion::set_darkness(float darkness) { - occlude_shdata.uniform("darkness", darkness); + shdata.uniform("darkness", darkness); } void AmbientOcclusion::render(Renderer &renderer, const Texture2D &color, const Texture2D &depth) { - occlude_texturing.attach(0, depth); - combine_texturing.attach(0, depth); - combine_texturing.attach(1, color); + texturing.attach(0, color); + texturing.attach(1, depth); + + Renderer::Push push(renderer); + renderer.set_texturing(&texturing); + renderer.set_shader_program(&occlude_shader, &shdata); { - Renderer::Push push(renderer); BindRestore bind_fbo(occlude_target.get_framebuffer()); - renderer.set_texturing(&occlude_texturing); - renderer.set_shader_program(&occlude_shader, &occlude_shdata); quad.draw(renderer); } - Renderer::Push push(renderer); - renderer.set_texturing(&combine_texturing); - renderer.set_shader_program(&combine_shader, &combine_shdata); + renderer.set_shader_program(&combine_shader); quad.draw(renderer); } diff --git a/source/ambientocclusion.h b/source/ambientocclusion.h index fc930bad..8b0b0fcd 100644 --- a/source/ambientocclusion.h +++ b/source/ambientocclusion.h @@ -23,12 +23,10 @@ class AmbientOcclusion: public PostProcessor private: Texture2D rotate_lookup; RenderTarget occlude_target; - Texturing occlude_texturing; + Texturing texturing; Program occlude_shader; - ProgramData occlude_shdata; - Texturing combine_texturing; Program combine_shader; - ProgramData combine_shdata; + ProgramData shdata; const Mesh &quad; public: diff --git a/source/bloom.cpp b/source/bloom.cpp index 039f414b..7537b0a6 100644 --- a/source/bloom.cpp +++ b/source/bloom.cpp @@ -21,14 +21,13 @@ Bloom::Bloom(unsigned w, unsigned h): blur_shdata[0].uniform("delta", 1.0f/w, 0.0f); blur_shdata[1].uniform("delta", 0.0f, 1.0f/h); - blur_shdata_common.uniform("source", 0); for(unsigned i=0; i<2; ++i) target[i] = new RenderTarget(w, h, (RENDER_COLOR,RGB16F)); - combine_shdata.uniform("source", 1); - combine_shdata.uniform("blurred", 0); + common_shdata.uniform("source", 0); + common_shdata.uniform("blurred", 1); - combine_texturing.attach(0, target[1]->get_target_texture(RENDER_COLOR)); + combine_texturing.attach(1, target[1]->get_target_texture(RENDER_COLOR)); set_radius(2.0f); set_strength(0.2f); @@ -46,7 +45,7 @@ void Bloom::set_radius(float r) throw invalid_argument("Bloom::set_radius"); int size = min(static_cast(r*3.0f), 9); - blur_shdata_common.uniform("size", size); + common_shdata.uniform("size", size); vector factors(size*2+1); float sum = 0.0f; @@ -56,35 +55,32 @@ void Bloom::set_radius(float r) for(int i=0; i<=size*2; ++i) factors[i] /= sum; - blur_shdata_common.uniform1_array("factors", size*2+1, &factors.front()); + common_shdata.uniform1_array("factors", size*2+1, &factors.front()); } void Bloom::set_strength(float s) { if(s<0.0f || s>1.0f) throw invalid_argument("Bloom::set_strength"); - combine_shdata.uniform("strength", s); + common_shdata.uniform("strength", s); } void Bloom::render(Renderer &renderer, const Texture2D &src, const Texture2D &) { + Renderer::Push push(renderer); + renderer.set_shader_program(&blur_shader, &common_shdata); + for(unsigned i=0; i<2; ++i) { - Renderer::Push push(renderer); - renderer.set_shader_program(&blur_shader, &blur_shdata_common); - for(unsigned i=0; i<2; ++i) - { - BindRestore bind_fbo(target[i]->get_framebuffer()); - Renderer::Push push2(renderer); - renderer.set_texture(i ? &target[0]->get_target_texture(RENDER_COLOR) : &src); - renderer.add_shader_data(blur_shdata[i]); - quad.draw(renderer); - } + BindRestore bind_fbo(target[i]->get_framebuffer()); + Renderer::Push push2(renderer); + renderer.set_texture(i ? &target[0]->get_target_texture(RENDER_COLOR) : &src); + renderer.add_shader_data(blur_shdata[i]); + quad.draw(renderer); } - Renderer::Push push(renderer); - combine_texturing.attach(1, src); + combine_texturing.attach(0, src); renderer.set_texturing(&combine_texturing); - renderer.set_shader_program(&combine_shader, &combine_shdata); + renderer.set_shader_program(&combine_shader); quad.draw(renderer); } diff --git a/source/bloom.h b/source/bloom.h index 73232d16..b3841c73 100644 --- a/source/bloom.h +++ b/source/bloom.h @@ -25,11 +25,10 @@ class Bloom: public PostProcessor { private: RenderTarget *target[2]; + ProgramData common_shdata; Program blur_shader; - ProgramData blur_shdata_common; ProgramData blur_shdata[2]; Program combine_shader; - ProgramData combine_shdata; Texturing combine_texturing; const Mesh &quad; -- 2.45.2