std::string get_fragment(bool blend_modes) { return "#version 130 \n" "uniform sampler2D background; \n" "uniform sampler2D plane[4]; \n" "uniform vec2 plane_size[4]; \n" "uniform sampler2D local_key; \n" "uniform sampler2D layer_key; \n" " \n" "uniform bool is_hd; \n" "uniform bool has_local_key; \n" "uniform bool has_layer_key; \n" "uniform int blend_mode; \n" "uniform int keyer; \n" "uniform int pixel_format; \n" "uniform int deinterlace; \n" " \n" "uniform float opacity; \n" "uniform bool levels; \n" "uniform float min_input; \n" "uniform float max_input; \n" "uniform float gamma; \n" "uniform float min_output; \n" "uniform float max_output; \n" " \n" "uniform bool csb; \n" "uniform float brt; \n" "uniform float sat; \n" "uniform float con; \n" " \n" + (blend_modes ? get_blend_color_func() : get_simple_blend_color_func()) + " \n" "vec4 ycbcra_to_rgba_sd(float Y, float Cb, float Cr, float A) \n" "{ \n" " vec4 rgba; \n" " rgba.b = (1.164*(Y*255 - 16) + 1.596*(Cr*255 - 128))/255; \n" " rgba.g = (1.164*(Y*255 - 16) - 0.813*(Cr*255 - 128) - 0.391*(Cb*255 - 128))/255;\n" " rgba.r = (1.164*(Y*255 - 16) + 2.018*(Cb*255 - 128))/255; \n" " rgba.a = A; \n" " return rgba; \n" "} \n" " \n" "vec4 ycbcra_to_rgba_hd(float Y, float Cb, float Cr, float A) \n" "{ \n" " vec4 rgba; \n" " rgba.b = (1.164*(Y*255 - 16) + 1.793*(Cr*255 - 128))/255; \n" " rgba.g = (1.164*(Y*255 - 16) - 0.534*(Cr*255 - 128) - 0.213*(Cb*255 - 128))/255;\n" " rgba.r = (1.164*(Y*255 - 16) + 2.115*(Cb*255 - 128))/255; \n" " rgba.a = A; \n" " return rgba; \n" "} \n" " \n" "vec4 ycbcra_to_rgba(float y, float cb, float cr, float a) \n" "{ \n" " if(is_hd) \n" " return ycbcra_to_rgba_hd(y, cb, cr, a); \n" " else \n" " return ycbcra_to_rgba_sd(y, cb, cr, a); \n" "} \n" " \n" "vec4 get_sample(sampler2D sampler, vec2 coords, vec2 size) \n" "{ \n" " switch(deinterlace) \n" " { \n" " case 1: // upper \n" " return texture2D(sampler, coords); \n" " case 2: // lower \n" " return texture2D(sampler, coords); \n" " default: \n" " return texture2D(sampler, coords); \n" " } \n" "} \n" " \n" "vec4 get_rgba_color() \n" "{ \n" " switch(pixel_format) \n" " { \n" " case 0: //gray \n" " return vec4(get_sample(plane[0], gl_TexCoord[0].st, plane_size[0]).rrr, 1.0);\n" " case 1: //bgra, \n" " return get_sample(plane[0], gl_TexCoord[0].st, plane_size[0]).bgra; \n" " case 2: //rgba, \n" " return get_sample(plane[0], gl_TexCoord[0].st, plane_size[0]).rgba; \n" " case 3: //argb, \n" " return get_sample(plane[0], gl_TexCoord[0].st, plane_size[0]).argb; \n" " case 4: //abgr, \n" " return get_sample(plane[0], gl_TexCoord[0].st, plane_size[0]).gbar; \n" " case 5: //ycbcr, \n" " { \n" " float y = get_sample(plane[0], gl_TexCoord[0].st, plane_size[0]).r; \n" " float cb = get_sample(plane[1], gl_TexCoord[0].st, plane_size[0]).r; \n" " float cr = get_sample(plane[2], gl_TexCoord[0].st, plane_size[0]).r; \n" " return ycbcra_to_rgba(y, cb, cr, 1.0); \n" " } \n" " case 6: //ycbcra \n" " { \n" " float y = get_sample(plane[0], gl_TexCoord[0].st, plane_size[0]).r; \n" " float cb = get_sample(plane[1], gl_TexCoord[0].st, plane_size[0]).r; \n" " float cr = get_sample(plane[2], gl_TexCoord[0].st, plane_size[0]).r; \n" " float a = get_sample(plane[3], gl_TexCoord[0].st, plane_size[0]).r; \n" " return ycbcra_to_rgba(y, cb, cr, a); \n" " } \n" " case 7: //luma \n" " { \n" " vec3 y3 = get_sample(plane[0], gl_TexCoord[0].st, plane_size[0]).rrr; \n" " return vec4((y3-0.065)/0.859, 1.0); \n" " } \n" " case 8: //bgr, \n" " return vec4(get_sample(plane[0], gl_TexCoord[0].st, plane_size[0]).bgr, 1.0);\n" " case 9: //rgb, \n" " return vec4(get_sample(plane[0], gl_TexCoord[0].st, plane_size[0]).rgb, 1.0);\n" " } \n" " return vec4(0.0, 0.0, 0.0, 0.0); \n" "} \n" " \n" "void main() \n" "{ \n" " vec4 color = get_rgba_color(); \n" " if(levels) \n" " color.rgb = LevelsControl(color.rgb, min_input, max_input, gamma, min_output, max_output); \n" " if(csb) \n" " color.rgb = ContrastSaturationBrightness(color.rgb, brt, sat, con); \n" " if(has_local_key) \n" " color *= texture2D(local_key, gl_TexCoord[1].st).r; \n" " if(has_layer_key) \n" " color *= texture2D(layer_key, gl_TexCoord[1].st).r; \n" " color *= opacity; \n" " color = blend(color); \n" " gl_FragColor = color.bgra; \n" "} \n"; }
std::string get_fragment(bool blend_modes) { return "#version 130 \n" "uniform sampler2D background; \n" "uniform sampler2D plane[4]; \n" "uniform sampler2D local_key; \n" "uniform sampler2D layer_key; \n" " \n" "uniform bool is_hd; \n" "uniform bool has_local_key; \n" "uniform bool has_layer_key; \n" "uniform int blend_mode; \n" "uniform int keyer; \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" "uniform float gamma; \n" "uniform float min_output; \n" "uniform float max_output; \n" " \n" "uniform bool csb; \n" "uniform float brt; \n" "uniform float sat; \n" "uniform float con; \n" " \n" "uniform bool post_processing; \n" "uniform bool straighten_alpha; \n" " \n" "uniform int chroma_mode; \n" "uniform vec2 chroma_blend; \n" "uniform float chroma_spill; \n" + (blend_modes ? get_blend_color_func() : get_simple_blend_color_func()) + get_chroma_func() + " \n" "vec4 ycbcra_to_rgba_sd(float Y, float Cb, float Cr, float A) \n" "{ \n" " vec4 rgba; \n" " rgba.b = (1.164*(Y*255 - 16) + 1.596*(Cr*255 - 128))/255; \n" " rgba.g = (1.164*(Y*255 - 16) - 0.813*(Cr*255 - 128) - 0.391*(Cb*255 - 128))/255;\n" " rgba.r = (1.164*(Y*255 - 16) + 2.018*(Cb*255 - 128))/255; \n" " rgba.a = A; \n" " return rgba; \n" "} \n" " \n" "vec4 ycbcra_to_rgba_hd(float Y, float Cb, float Cr, float A) \n" "{ \n" " vec4 rgba; \n" " rgba.b = (1.164*(Y*255 - 16) + 1.793*(Cr*255 - 128))/255; \n" " rgba.g = (1.164*(Y*255 - 16) - 0.534*(Cr*255 - 128) - 0.213*(Cb*255 - 128))/255;\n" " rgba.r = (1.164*(Y*255 - 16) + 2.115*(Cb*255 - 128))/255; \n" " rgba.a = A; \n" " return rgba; \n" "} \n" " \n" "vec4 ycbcra_to_rgba(float y, float cb, float cr, float a) \n" "{ \n" " if(is_hd) \n" " return ycbcra_to_rgba_hd(y, cb, cr, a); \n" " else \n" " return ycbcra_to_rgba_sd(y, cb, cr, a); \n" "} \n" " \n" "vec4 get_rgba_color() \n" "{ \n" " switch(pixel_format) \n" " { \n" " case 0: //gray \n" " return vec4(texture2D(plane[0], gl_TexCoord[0].st).rrr, 1.0); \n" " case 1: //bgra, \n" " return texture2D(plane[0], gl_TexCoord[0].st).bgra; \n" " case 2: //rgba, \n" " return texture2D(plane[0], gl_TexCoord[0].st).rgba; \n" " case 3: //argb, \n" " return texture2D(plane[0], gl_TexCoord[0].st).argb; \n" " case 4: //abgr, \n" " return texture2D(plane[0], gl_TexCoord[0].st).gbar; \n" " case 5: //ycbcr, \n" " { \n" " float y = texture2D(plane[0], gl_TexCoord[0].st).r; \n" " float cb = texture2D(plane[1], gl_TexCoord[0].st).r; \n" " float cr = texture2D(plane[2], gl_TexCoord[0].st).r; \n" " return ycbcra_to_rgba(y, cb, cr, 1.0); \n" " } \n" " case 6: //ycbcra \n" " { \n" " float y = texture2D(plane[0], gl_TexCoord[0].st).r; \n" " float cb = texture2D(plane[1], gl_TexCoord[0].st).r; \n" " float cr = texture2D(plane[2], gl_TexCoord[0].st).r; \n" " float a = texture2D(plane[3], gl_TexCoord[0].st).r; \n" " return ycbcra_to_rgba(y, cb, cr, a); \n" " } \n" " case 7: //luma \n" " { \n" " vec3 y3 = texture2D(plane[0], gl_TexCoord[0].st).rrr; \n" " return vec4((y3-0.065)/0.859, 1.0); \n" " } \n" " } \n" " return vec4(0.0, 0.0, 0.0, 0.0); \n" "} \n" " \n" "vec4 post_process() \n" "{ \n" " vec4 color = texture2D(background, gl_TexCoord[0].st).bgra; \n" " \n" " if (straighten_alpha && color.a > 0.0 && color.a != 1.0) \n" " color.rgb /= color.a; \n" " \n" " return color; \n" "} \n" " \n" "void main() \n" "{ \n" " if (post_processing) \n" " { \n" " gl_FragColor = post_process().bgra; \n" " return; \n" " } \n" " \n" " vec4 color = get_rgba_color(); \n" " color = chroma_key(color); \n" " if(levels) \n" " color.rgb = LevelsControl(color.rgb, min_input, max_input, gamma, min_output, max_output); \n" " if(csb) \n" " color.rgb = ContrastSaturationBrightness(color, brt, sat, con); \n" " if(has_local_key) \n" " color *= texture2D(local_key, gl_TexCoord[1].st).r; \n" " if(has_layer_key) \n" " color *= texture2D(layer_key, gl_TexCoord[1].st).r; \n" " color *= opacity; \n" " color = blend(color); \n" " gl_FragColor = color.bgra; \n" "} \n"; }