From a5d62563b4fce4e471dd56a6178430f6471fad94 Mon Sep 17 00:00:00 2001 From: Ronag Date: Fri, 19 Aug 2011 18:47:23 +0000 Subject: [PATCH] 2.0. image_mixer: - Renderer is now properly and fully pre-multiplied. - Removed mixing until its fixed. git-svn-id: https://casparcg.svn.sourceforge.net/svnroot/casparcg/server/branches/2.0.0.2@1236 362d55ac-95cf-4e76-9f9a-cbaa9c17b72d --- core/mixer/image/image_kernel.cpp | 10 ++-- core/mixer/image/image_mixer.cpp | 48 ++++++++++--------- core/mixer/image/image_shader.cpp | 12 ++--- .../transition/transition_producer.cpp | 18 +++---- modules/decklink/interop/DeckLinkAPI_h.h | 2 +- modules/decklink/interop/DeckLinkAPI_i.c | 2 +- shell/casparcg.config | 10 +--- 7 files changed, 50 insertions(+), 52 deletions(-) diff --git a/core/mixer/image/image_kernel.cpp b/core/mixer/image/image_kernel.cpp index bd75820e0..4db822a48 100644 --- a/core/mixer/image/image_kernel.cpp +++ b/core/mixer/image/image_kernel.cpp @@ -111,6 +111,7 @@ struct image_kernel::implementation : boost::noncopyable shader_->set("has_local_key", local_key); shader_->set("has_layer_key", layer_key); shader_->set("pixel_format", item.pix_desc.pix_fmt); + shader_->set("opacity", item.transform.get_opacity()); // Setup blend_func @@ -126,15 +127,16 @@ struct image_kernel::implementation : boost::noncopyable switch(item.transform.get_blend_mode()) { case image_transform::blend_mode::add: - ogl.blend_func_separate(GL_ONE, GL_ONE, GL_ONE, GL_ONE); + ogl.blend_func_separate(GL_ONE, GL_ONE, GL_ONE, GL_ONE_MINUS_SRC_ALPHA); break; case image_transform::blend_mode::replace: ogl.blend_func_separate(GL_ONE, GL_ZERO, GL_ONE, GL_ONE); break; case image_transform::blend_mode::screen: - ogl.blend_func_separate(GL_ONE, GL_ONE_MINUS_SRC_COLOR, GL_ONE, GL_ONE); + ogl.blend_func_separate(GL_ONE, GL_ONE_MINUS_SRC_COLOR, GL_ONE, GL_ONE_MINUS_SRC_ALPHA); + case image_transform::blend_mode::normal: default: - ogl.blend_func_separate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE); + ogl.blend_func_separate(GL_ONE, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA); break; } } @@ -190,7 +192,7 @@ struct image_kernel::implementation : boost::noncopyable ogl.viewport(0, 0, background->width(), background->height()); - GL(glColor4d(item.transform.get_gain(), item.transform.get_gain(), item.transform.get_gain(), item.transform.get_is_key() ? 1.0 : item.transform.get_opacity())); + GL(glColor4d(item.transform.get_gain(), item.transform.get_gain(), item.transform.get_gain(), item.transform.get_opacity())); auto m_p = item.transform.get_clip_translation(); auto m_s = item.transform.get_clip_scale(); diff --git a/core/mixer/image/image_mixer.cpp b/core/mixer/image/image_mixer.cpp index c01e801b9..ee84d8806 100644 --- a/core/mixer/image/image_mixer.cpp +++ b/core/mixer/image/image_mixer.cpp @@ -152,31 +152,33 @@ public: std::pair> local_key_buffer; - if(has_overlapping_items(layer, layer.front().transform.get_blend_mode())) - { - auto local_draw_buffer = create_device_buffer(4); - - int mode = 0; - BOOST_FOREACH(auto& item, layer) - { - if(mode & item.mode) - item.transform.set_blend_mode(image_transform::blend_mode::normal); // Disable blending, it will be used when merging back into render stack. - else - { - item.transform.set_blend_mode(image_transform::blend_mode::replace); // Target field is empty, no blending - mode |= item.mode; - } - - draw_item(std::move(item), local_draw_buffer, local_key_buffer, layer_key_buffer); - } - - kernel_.draw(channel_.ogl(), create_render_item(local_draw_buffer, layer.front().transform.get_blend_mode()), draw_buffer, nullptr, nullptr); - } - else // fast path - { + //if(has_overlapping_items(layer, layer.front().transform.get_blend_mode())) + //{ + // auto local_draw_buffer = create_device_buffer(4); + + // auto local_blend_mode = layer.front().transform.get_blend_mode(); + + // int fields = 0; + // BOOST_FOREACH(auto& item, layer) + // { + // if(fields & item.mode) + // item.transform.set_blend_mode(image_transform::blend_mode::normal); // Disable blending, it will be used when merging back into render stack. + // else + // { + // item.transform.set_blend_mode(image_transform::blend_mode::replace); // Target field is empty, no blending, just copy + // fields |= item.mode; + // } + + // draw_item(std::move(item), local_draw_buffer, local_key_buffer, layer_key_buffer); + // } + + // kernel_.draw(channel_.ogl(), create_render_item(local_draw_buffer, local_blend_mode), draw_buffer, nullptr, nullptr); + //} + //else // fast path + //{ BOOST_FOREACH(auto& item, layer) draw_item(std::move(item), draw_buffer, local_key_buffer, layer_key_buffer); - } + //} CASPAR_ASSERT(local_key_buffer.first == 0 || local_key_buffer.first == core::video_mode::progressive); diff --git a/core/mixer/image/image_shader.cpp b/core/mixer/image/image_shader.cpp index 23f7666d2..77a370458 100644 --- a/core/mixer/image/image_shader.cpp +++ b/core/mixer/image/image_shader.cpp @@ -73,8 +73,8 @@ std::string get_blend_color_func() " return fore; \n" " vec4 back = texture2D(background, gl_TexCoord[1].st).bgra; \n" " fore.rgb = get_blend_color(back.rgb, fore.rgb); \n" - " return vec4(mix(back.rgb, fore.rgb, fore.a), back.a + fore.a); \n" - "} \n"; + " return fore + (1.0-fore.a)*back; \n" + "} \n"; } std::string get_simple_blend_color_func() @@ -99,7 +99,6 @@ std::string get_vertex() "{ \n" " gl_TexCoord[0] = gl_MultiTexCoord0; \n" " gl_TexCoord[1] = gl_MultiTexCoord1; \n" - " gl_FrontColor = gl_Color; \n" " gl_Position = ftransform(); \n" "} \n"; } @@ -120,6 +119,7 @@ std::string get_fragment(bool blend_modes) "uniform int blend_mode; \n" "uniform int pixel_format; \n" " \n" + "uniform float opacity; \n" "uniform bool levels; \n" "uniform float min_input; \n" "uniform float max_input; \n" @@ -239,10 +239,10 @@ std::string get_fragment(bool blend_modes) " if(csb) \n" " color.rgb = ContrastSaturationBrightness(color.rgb, brt, sat, con); \n" " if(has_local_key) \n" - " color.a *= texture2D(local_key, gl_TexCoord[1].st).r; \n" + " color *= texture2D(local_key, gl_TexCoord[1].st).r; \n" " if(has_layer_key) \n" - " color.a *= texture2D(layer_key, gl_TexCoord[1].st).r; \n" - " color *= gl_Color; \n" + " color *= texture2D(layer_key, gl_TexCoord[1].st).r; \n" + " color *= opacity; \n" " color = blend(color); \n" " gl_FragColor = color.bgra; \n" "} \n"; diff --git a/core/producer/transition/transition_producer.cpp b/core/producer/transition/transition_producer.cpp index ca8092644..6fe58ec62 100644 --- a/core/producer/transition/transition_producer.cpp +++ b/core/producer/transition/transition_producer.cpp @@ -65,7 +65,7 @@ struct transition_producer : public frame_producer virtual safe_ptr receive(int hints) { - if(current_frame_++ >= info_.duration) + if(++current_frame_ >= info_.duration) return basic_frame::eof(); auto dest = basic_frame::empty(); @@ -129,15 +129,15 @@ struct transition_producer : public frame_producer d_frame1->get_audio_transform().set_has_audio(false); d_frame2->get_audio_transform().set_gain(delta2); - if(info_.type == transition::mix) - { - d_frame1->get_image_transform().set_opacity(delta1); - d_frame2->get_image_transform().set_opacity(delta2); + //if(info_.type == transition::mix) + //{ + // d_frame1->get_image_transform().set_opacity(delta1); + // d_frame2->get_image_transform().set_opacity(delta2); - s_frame1->get_image_transform().set_opacity(1.0-delta1); - s_frame2->get_image_transform().set_opacity(1.0-delta2); - } - else if(info_.type == transition::slide) + // s_frame1->get_image_transform().set_opacity(1.0-delta1); + // s_frame2->get_image_transform().set_opacity(1.0-delta2); + //} + if(info_.type == transition::slide) { d_frame1->get_image_transform().set_fill_translation((-1.0+delta1)*dir, 0.0); d_frame2->get_image_transform().set_fill_translation((-1.0+delta2)*dir, 0.0); diff --git a/modules/decklink/interop/DeckLinkAPI_h.h b/modules/decklink/interop/DeckLinkAPI_h.h index c5c63cdae..3939157dc 100644 --- a/modules/decklink/interop/DeckLinkAPI_h.h +++ b/modules/decklink/interop/DeckLinkAPI_h.h @@ -4,7 +4,7 @@ /* File created by MIDL compiler version 7.00.0555 */ -/* at Fri Jul 29 10:16:40 2011 +/* at Thu Aug 18 20:53:57 2011 */ /* Compiler settings for interop\DeckLinkAPI.idl: Oicf, W1, Zp8, env=Win32 (32b run), target_arch=X86 7.00.0555 diff --git a/modules/decklink/interop/DeckLinkAPI_i.c b/modules/decklink/interop/DeckLinkAPI_i.c index e9a1eda90..0d54c148d 100644 --- a/modules/decklink/interop/DeckLinkAPI_i.c +++ b/modules/decklink/interop/DeckLinkAPI_i.c @@ -6,7 +6,7 @@ /* File created by MIDL compiler version 7.00.0555 */ -/* at Fri Jul 29 10:16:40 2011 +/* at Thu Aug 18 20:53:57 2011 */ /* Compiler settings for interop\DeckLinkAPI.idl: Oicf, W1, Zp8, env=Win32 (32b run), target_arch=X86 7.00.0555 diff --git a/shell/casparcg.config b/shell/casparcg.config index c39dd970e..5b6f1bd91 100644 --- a/shell/casparcg.config +++ b/shell/casparcg.config @@ -1,7 +1,7 @@ - L:\\casparcg\\_media\\ + C:\Lokala Filer\server\branches\2.0.0.2\bin\_media L:\\casparcg\\_log\\ L:\\casparcg\\_data\\ L:\\casparcg\\_templates\\ @@ -51,14 +51,8 @@ 720p5000 - - 1 - true - true - - 1 - true + false -- 2.39.2