From 580d5b82595893c83f7bf715c94de20b70745ae4 Mon Sep 17 00:00:00 2001 From: ronag Date: Thu, 25 Aug 2011 14:20:46 +0000 Subject: [PATCH] 2.0. image_mixer: Added "keyer" concept. git-svn-id: https://casparcg.svn.sourceforge.net/svnroot/casparcg/server/branches/2.0.0.2@1285 362d55ac-95cf-4e76-9f9a-cbaa9c17b72d --- core/mixer/image/image_kernel.cpp | 6 ++++-- core/mixer/image/image_kernel.h | 11 +++++++++++ core/mixer/image/image_mixer.cpp | 3 +-- core/mixer/image/image_shader.cpp | 15 +++++++++------ 4 files changed, 25 insertions(+), 10 deletions(-) diff --git a/core/mixer/image/image_kernel.cpp b/core/mixer/image/image_kernel.cpp index 1fd83d91d..9e5e4de0c 100644 --- a/core/mixer/image/image_kernel.cpp +++ b/core/mixer/image/image_kernel.cpp @@ -120,14 +120,16 @@ struct image_kernel::implementation : boost::noncopyable shader_->set("background", texture_id::background); shader_->set("blend_mode", params.blend_mode); + shader_->set("keyer", params.keyer); } else { - switch(params.blend_mode) + switch(params.keyer) { - case blend_mode::mix: + case keyer::additive: ogl.blend_func(GL_ONE, GL_ONE); break; + case keyer::linear: default: ogl.blend_func(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); } diff --git a/core/mixer/image/image_kernel.h b/core/mixer/image/image_kernel.h index 31e9098e4..9db54b321 100644 --- a/core/mixer/image/image_kernel.h +++ b/core/mixer/image/image_kernel.h @@ -33,18 +33,29 @@ namespace caspar { namespace core { class device_buffer; class ogl_device; +struct keyer +{ + enum type + { + linear = 0, + additive + }; +}; + struct draw_params { pixel_format_desc pix_desc; std::vector> textures; frame_transform transform; blend_mode::type blend_mode; + keyer::type keyer; std::shared_ptr background; std::shared_ptr local_key; std::shared_ptr layer_key; draw_params() : blend_mode(blend_mode::normal) + , keyer(keyer::linear) { } }; diff --git a/core/mixer/image/image_mixer.cpp b/core/mixer/image/image_mixer.cpp index 393c8a714..35e95f0a3 100644 --- a/core/mixer/image/image_mixer.cpp +++ b/core/mixer/image/image_mixer.cpp @@ -178,7 +178,6 @@ private: draw_params.pix_desc = std::move(item.pix_desc); draw_params.textures = std::move(item.textures); draw_params.transform = std::move(item.transform); - draw_params.blend_mode = blend_mode::normal; if(item.transform.is_key) { @@ -198,7 +197,7 @@ private: draw_params.local_key = std::move(local_key_buffer); draw_params.layer_key = layer_key_buffer; - draw_params.blend_mode = blend_mode::mix; + draw_params.keyer = keyer::additive; kernel_.draw(channel_.ogl(), std::move(draw_params)); } diff --git a/core/mixer/image/image_shader.cpp b/core/mixer/image/image_shader.cpp index 85ceb4cca..6d89630c2 100644 --- a/core/mixer/image/image_shader.cpp +++ b/core/mixer/image/image_shader.cpp @@ -69,12 +69,15 @@ std::string get_blend_color_func() " \n" "vec4 blend(vec4 fore) \n" "{ \n" - " vec4 back = texture2D(background, gl_TexCoord[1].st).bgra; \n" - " \n" - " if(blend_mode == 29) // mix \n" - " return fore + back; \n" - " \n" + " vec4 back = texture2D(background, gl_TexCoord[1].st).bgra; \n" " fore.rgb = get_blend_color(back.rgb, fore.rgb); \n" + " \n" + " switch(keyer) \n" + " { \n" + " case 0: return fore + (1.0-fore.a)*back; // linear \n" + " case 1: return fore + back; // additive \n" + " } \n" + " \n" " return fore + (1.0-fore.a)*back; \n" "} \n"; } @@ -119,7 +122,7 @@ std::string get_fragment(bool blend_modes) "uniform bool has_local_key; \n" "uniform bool has_layer_key; \n" "uniform int blend_mode; \n" - "uniform int alpha_mode; \n" + "uniform int keyer; \n" "uniform int pixel_format; \n" " \n" "uniform float opacity; \n" -- 2.39.2