diff --git a/CMakeLists.txt b/CMakeLists.txt index 725017d..fdf44b0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -599,6 +599,7 @@ set(VMIX_RSC_FILES ./rsc/mesh/h_line.ply ./rsc/mesh/h_mark.ply ./rsc/shaders/filters/default.glsl + ./rsc/shaders/filters/blend.glsl ./rsc/shaders/filters/bloom.glsl ./rsc/shaders/filters/bokeh.glsl ./rsc/shaders/filters/talk.glsl diff --git a/rsc/shaders/filters/blend.glsl b/rsc/shaders/filters/blend.glsl new file mode 100644 index 0000000..fd2e099 --- /dev/null +++ b/rsc/shaders/filters/blend.glsl @@ -0,0 +1,12 @@ +// Blending of source texture (channel 0) with output window loopback (channel 1) +// by Bruno Herbelin for vimix +uniform float Blend; + +void mainImage( out vec4 fragColor, in vec2 fragCoord ) +{ + vec2 uv = fragCoord.xy / iResolution.xy; + fragColor = mix( texture(iChannel0, uv), texture(iChannel1, uv), Blend); +} + + + diff --git a/src/ImageFilter.cpp b/src/ImageFilter.cpp index f99e1aa..f1e7198 100644 --- a/src/ImageFilter.cpp +++ b/src/ImageFilter.cpp @@ -29,6 +29,8 @@ #include "Primitives.h" #include "BaseToolkit.h" +#include "Mixer.h" + #include "ImageFilter.h" std::string fragmentHeader = "#version 330 core\n" @@ -61,6 +63,7 @@ std::string fragmentFooter = "void main() {\n" std::list< FilteringProgram > FilteringProgram::presets = { FilteringProgram(), + FilteringProgram("Blend", "shaders/filters/blend.glsl", "", { }), FilteringProgram("Bilateral","shaders/filters/focus.glsl", "", { }), FilteringProgram("Pixelate", "shaders/filters/pixelate.glsl", "", { }), FilteringProgram("Earlybird","shaders/filters/earlybird.glsl", "", { }), @@ -80,8 +83,8 @@ std::string FilteringProgram::getFilterCodeInputs() "float iTimeDelta; // render time (in seconds)\n" "int iFrame; // shader playback frame\n" "vec3 iChannelResolution[2]; // input channels resolution (in pixels)\n" - "sampler2D iChannel0; // input channel 0 (texture).\n" - "sampler2D iChannel1; // input channel 1 (texture).\n" + "sampler2D iChannel0; // input channel 0 (source).\n" + "sampler2D iChannel1; // input channel 1 (display loopback).\n" "vec4 iDate; // (year, month, day, time in seconds)\n" "vec4 iMouse; // simulate mouse input with sliders:"; return filterHeaderHelp; @@ -378,7 +381,6 @@ void ImageFilter::draw (FrameBuffer *input) input_ = input; // create first-pass surface and shader, taking as texture the input framebuffer surfaces_.first->setTextureIndex( input_->texture() ); - shaders_.first->mask_texture = input_->texture(); // (re)create framebuffer for result of first-pass if (buffers_.first != nullptr) delete buffers_.first; @@ -388,7 +390,6 @@ void ImageFilter::draw (FrameBuffer *input) input_->blit( buffers_.first ); // create second-pass surface and shader, taking as texture the first-pass framebuffer surfaces_.second->setTextureIndex( buffers_.first->texture() ); - shaders_.second->mask_texture = input_->texture(); // (re)create framebuffer for result of second-pass if (buffers_.second != nullptr) delete buffers_.second; @@ -401,6 +402,7 @@ void ImageFilter::draw (FrameBuffer *input) { // FIRST PASS // render input surface into frame buffer + shaders_.first->mask_texture = Mixer::manager().session()->frame()->texture(); buffers_.first->begin(); surfaces_.first->draw(glm::identity(), buffers_.first->projection()); buffers_.first->end(); @@ -408,6 +410,7 @@ void ImageFilter::draw (FrameBuffer *input) // SECOND PASS if ( program_.isTwoPass() ) { // render filtered surface from first pass into frame buffer + shaders_.second->mask_texture = Mixer::manager().session()->frame()->texture(); buffers_.second->begin(); surfaces_.second->draw(glm::identity(), buffers_.second->projection()); buffers_.second->end();