]> git.sesse.net Git - casparcg/commitdiff
2.0. image_mixer: Fixed layer mixing.
authorronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Fri, 19 Aug 2011 14:12:41 +0000 (14:12 +0000)
committerronag <ronag@362d55ac-95cf-4e76-9f9a-cbaa9c17b72d>
Fri, 19 Aug 2011 14:12:41 +0000 (14:12 +0000)
git-svn-id: https://casparcg.svn.sourceforge.net/svnroot/casparcg/server/branches/2.0.0.2@1233 362d55ac-95cf-4e76-9f9a-cbaa9c17b72d

core/mixer/gpu/ogl_device.cpp
core/mixer/gpu/ogl_device.h
core/mixer/image/image_kernel.cpp
core/mixer/image/image_mixer.cpp
core/mixer/image/image_shader.cpp
core/producer/frame/image_transform.h
shell/casparcg.config

index 7196af3560b8bb27fca9d1c97623392e0391cbc8..d74d5fd9649b77cd534b9164ad1edc9311d8f026 100644 (file)
@@ -44,6 +44,7 @@ ogl_device::ogl_device()
        std::fill(binded_textures_.begin(), binded_textures_.end(), 0);\r
        std::fill(viewport_.begin(), viewport_.end(), 0);\r
        std::fill(scissor_.begin(), scissor_.end(), 0);\r
+       std::fill(blend_func_.begin(), blend_func_.end(), 0);\r
        \r
        invoke([=]\r
        {\r
@@ -335,5 +336,16 @@ void ogl_device::use(shader& shader)
        }\r
 }\r
 \r
+void ogl_device::blend_func_separate(int c1, int c2, int a1, int a2)\r
+{\r
+       std::array<int, 4> func = {c1, c2, a1, a2};\r
+\r
+       if(blend_func_ != func)\r
+       {\r
+               blend_func_ = func;\r
+               glBlendFuncSeparate(c1, c2, a1, a2);\r
+       }\r
+}\r
+\r
 }}\r
 \r
index 4b709e7ada646b3d91627b1f2c198507219173c5..ad5908c3b4dc201093216cb57ef770a8f6b22440 100644 (file)
@@ -65,6 +65,7 @@ class ogl_device : boost::noncopyable
        GLint                                                    attached_texture_;\r
        GLint                                                    active_shader_;\r
        std::array<GLint, 16>                    binded_textures_;\r
+       std::array<GLint, 4>                     blend_func_;\r
 \r
        std::unique_ptr<sf::Context> context_;\r
        \r
@@ -91,6 +92,8 @@ public:
 \r
        void begin_read(host_buffer& dest, device_buffer& source);\r
        void begin_read(device_buffer& dest, host_buffer& source);\r
+\r
+       void blend_func_separate(int c1, int c2, int a1, int a2);\r
        \r
        void use(shader& shader);\r
 \r
index 31e7440ff76101ef0904ebd2fc446821b26ecb8a..b2b03475b91a9921da250a23018d926bac20643d 100644 (file)
@@ -121,6 +121,23 @@ struct image_kernel::implementation : boost::noncopyable
                        shader_->set("background",      texture_id::background);\r
                        shader_->set("blend_mode",      item.transform.get_is_key() ? core::image_transform::blend_mode::normal : item.transform.get_blend_mode());\r
                }\r
+               else\r
+               {\r
+                       switch(item.transform.get_blend_mode())\r
+                       {\r
+                       case image_transform::blend_mode::add:                  \r
+                               ogl.blend_func_separate(GL_ONE, GL_ONE, GL_ONE, GL_ONE);\r
+                               break;\r
+                       case image_transform::blend_mode::replace:                      \r
+                               ogl.blend_func_separate(GL_ONE, GL_ZERO, GL_ONE, GL_ONE);\r
+                               break;\r
+                       case image_transform::blend_mode::screen:\r
+                               ogl.blend_func_separate(GL_ONE, GL_ONE_MINUS_SRC_COLOR, GL_ONE, GL_ONE);\r
+                       default:\r
+                               ogl.blend_func_separate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE);\r
+                               break;\r
+                       }\r
+               }\r
 \r
                // Setup image-adjustements\r
 \r
index ff470cc82b28d1a8cb4b471d7a1855a72dd58bae..f82f60cd489d3db118bc6af27708833fa24f261a 100644 (file)
@@ -156,10 +156,15 @@ public:
                {\r
                        auto local_draw_buffer = create_device_buffer(4);       \r
                        \r
-                       BOOST_FOREACH(auto& item, layer)                \r
+                       // First item should just be "copied" to empty framebuffer.\r
+                       auto item = layer.begin();\r
+                       item->transform.set_blend_mode(image_transform::blend_mode::replace);\r
+                       draw_item(std::move(*item++), local_draw_buffer, local_key_buffer, layer_key_buffer);           \r
+\r
+                       for(; item != layer.end(); ++item)\r
                        {\r
-                               item.transform.set_blend_mode(image_transform::blend_mode::normal); // Disable blending, it will be used when merging back into render stack.\r
-                               draw_item(std::move(item), local_draw_buffer, local_key_buffer, layer_key_buffer);              \r
+                               item->transform.set_blend_mode(image_transform::blend_mode::normal); // Disable blending, it will be used when merging back into render stack.\r
+                               draw_item(std::move(*item), local_draw_buffer, local_key_buffer, layer_key_buffer);             \r
                        }\r
 \r
                        kernel_.draw(channel_.ogl(), create_render_item(local_draw_buffer, layer.front().transform.get_blend_mode()), draw_buffer, nullptr, nullptr);\r
@@ -211,7 +216,7 @@ public:
        // TODO: Optimize\r
        bool has_overlapping_items(const layer& layer, image_transform::blend_mode::type blend_mode)\r
        {\r
-               if(layer.empty())\r
+               if(layer.size() < 2)\r
                        return false;   \r
                \r
                implementation::layer fill;\r
index 781ea9b830c9c30a3a1489e5069f11d8ef77bb7d..23f7666d2f0ac6b9f842d12750aa39e1c4576354 100644 (file)
@@ -69,9 +69,11 @@ std::string get_blend_color_func()
        "                                                                                                                                                                       \n"                                                                                                                                                       \r
        "vec4 blend(vec4 fore)                                                                                                                          \n"\r
        "{                                                                                                                                                                      \n"\r
-       "   vec4 back = texture2D(background, gl_TexCoord[1].st);                                                       \n"\r
+       "   if(blend_mode == 29) // replace                                                                                                     \n"\r
+       "         return fore;                                                                                                                          \n"\r
+       "   vec4 back = texture2D(background, gl_TexCoord[1].st).bgra;                                          \n"\r
        "       fore.rgb = get_blend_color(back.rgb, fore.rgb);                                                                 \n"\r
-       "       return vec4(mix(back.bgr, fore.rgb, fore.a), back.a + fore.a);                                  \n"\r
+       "       return vec4(mix(back.rgb, fore.rgb, fore.a), back.a + fore.a);                                  \n"\r
        "}                                                                                                                                                                      \n";\r
 }\r
                \r
index 1d1e33c5412623f1952974aa19f763e05d89acc5..df24a689db393c7fdba666b64c646b7ad4dab149 100644 (file)
@@ -66,6 +66,7 @@ public:
                        saturation,\r
                        color,\r
                        luminosity,\r
+                       replace,\r
                        blend_mode_count \r
                };\r
        };\r
index dc79cda0cfd2ad64e3630b078179b17a3ba95348..c39dd970ef4fc663ce0230a1c5ee54b0baef2a09 100644 (file)
@@ -12,6 +12,9 @@
   <consumers>\r
     <buffer-depth>3</buffer-depth>\r
   </consumers>\r
+  <mixers>\r
+    <blend-modes>true</blend-modes>\r
+  </mixers>\r
   <producers>\r
     <buffer-depth>1</buffer-depth>\r
     <auto-transcode>true</auto-transcode>\r
   </producers>\r
   <channels>\r
     <channel>\r
-      <video-mode>1080i5000</video-mode>\r
+      <video-mode>720p5000</video-mode>\r
       <consumers>\r
         <decklink>\r
           <device>1</device>\r
           <low-latency>true</low-latency>\r
           <embedded-audio>true</embedded-audio>\r
         </decklink>\r
-      </consumers>\r
-    </channel>\r
-    <channel>\r
-      <video-mode>1080i5000</video-mode>\r
-      <consumers>\r
-        <decklink>\r
-          <device>2</device>\r
-          <low-latency>true</low-latency>\r
-          <embedded-audio>true</embedded-audio>\r
-        </decklink>\r
+        <screen>\r
+          <device>1</device>\r
+          <key-only>true</key-only>\r
+        </screen>\r
       </consumers>\r
     </channel>\r
 </channels>\r