]> git.sesse.net Git - casparcg/blobdiff - core/mixer/image/image_shader.cpp
git-svn-id: https://casparcg.svn.sourceforge.net/svnroot/casparcg/server/branches...
[casparcg] / core / mixer / image / image_shader.cpp
index 781ea9b830c9c30a3a1489e5069f11d8ef77bb7d..e8662def2ffec79973b1fc740492ed98acfa5066 100644 (file)
@@ -69,10 +69,15 @@ 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
-       "       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
-       "}                                                                                                                                                                      \n";\r
+       "   vec4 back = texture2D(background, gl_TexCoord[1].st).bgra;                                          \n"\r
+       "   if(blend_mode != 0)                                                                                                                         \n"\r
+       "               fore.rgb = get_blend_color(back.rgb/(back.a+0.0000001), fore.rgb/(fore.a+0.0000001))*fore.a;\n"\r
+       "       switch(keyer)                                                                                                                                   \n"     \r
+       "       {                                                                                                                                                               \n"     \r
+       "               case 1:  return fore + back; // additive                                                                        \n"\r
+       "               default: return fore + (1.0-fore.a)*back; // linear                                                     \n"\r
+       "       }                                                                                                                                                               \n"\r
+       "}                                                                                                                                                                      \n";                    \r
 }\r
                \r
 std::string get_simple_blend_color_func()\r
@@ -97,7 +102,6 @@ std::string get_vertex()
        "{                                                                                                                                                                      \n"\r
        "       gl_TexCoord[0] = gl_MultiTexCoord0;                                                                                             \n"\r
        "       gl_TexCoord[1] = gl_MultiTexCoord1;                                                                                             \n"\r
-       "       gl_FrontColor  = gl_Color;                                                                                                              \n"\r
        "       gl_Position    = ftransform();                                                                                                  \n"\r
        "}                                                                                                                                                                      \n";\r
 }\r
@@ -116,8 +120,10 @@ std::string get_fragment(bool blend_modes)
        "uniform bool           has_local_key;                                                                                                  \n"\r
        "uniform bool           has_layer_key;                                                                                                  \n"\r
        "uniform int            blend_mode;                                                                                                             \n"\r
+       "uniform int            keyer;                                                                                                                  \n"\r
        "uniform int            pixel_format;                                                                                                   \n"\r
        "                                                                                                                                                                       \n"\r
+       "uniform float          opacity;                                                                                                                \n"\r
        "uniform bool           levels;                                                                                                                 \n"\r
        "uniform float          min_input;                                                                                                              \n"\r
        "uniform float          max_input;                                                                                                              \n"\r
@@ -237,10 +243,10 @@ std::string get_fragment(bool blend_modes)
        "       if(csb)                                                                                                                                                 \n"\r
        "               color.rgb = ContrastSaturationBrightness(color.rgb, brt, sat, con);                     \n"\r
        "       if(has_local_key)                                                                                                                               \n"\r
-       "               color.a *= texture2D(local_key, gl_TexCoord[1].st).r;                                           \n"\r
+       "               color *= texture2D(local_key, gl_TexCoord[1].st).r;                                                     \n"\r
        "       if(has_layer_key)                                                                                                                               \n"\r
-       "               color.a *= texture2D(layer_key, gl_TexCoord[1].st).r;                                           \n"\r
-       "   color *= gl_Color;                                                                                                                          \n"\r
+       "               color *= texture2D(layer_key, gl_TexCoord[1].st).r;                                                     \n"\r
+       "       color *= opacity;                                                                                                                               \n"\r
        "       color = blend(color);                                                                                                                   \n"\r
        "       gl_FragColor = color.bgra;                                                                                                              \n"\r
        "}                                                                                                                                                                      \n";\r
@@ -253,7 +259,7 @@ safe_ptr<shader> get_image_shader(ogl_device& ogl, bool& blend_modes)
        if(g_shader)\r
        {\r
                blend_modes = g_blend_modes;\r
-               return make_safe(g_shader);\r
+               return make_safe_ptr(g_shader);\r
        }\r
                \r
        try\r
@@ -280,7 +286,7 @@ safe_ptr<shader> get_image_shader(ogl_device& ogl, bool& blend_modes)
        }\r
 \r
        blend_modes = g_blend_modes;\r
-       return make_safe(g_shader);\r
+       return make_safe_ptr(g_shader);\r
 }\r
 \r
-}}
\ No newline at end of file
+}}\r