" \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
"{ \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
"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
" 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
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
}\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