UNPKG

@bddh/starling-cutout

Version:

cutout

2 lines (1 loc) 5.14 kB
import{s as e}from"./seriously.js";window,console.info("seriously version: chroma_obs"),e.plugin("chroma_obs",{shader:function(e,t){return t.vertex=["precision mediump float;","attribute vec4 position;","attribute vec2 texCoord;","uniform vec2 resolution;","uniform mat4 transform;","varying vec2 vTexCoord;","const vec4 cb_v4 = vec4(-0.100644, -0.338572, 0.439216, 0.501961);","const vec4 cr_v4 = vec4(0.439216, -0.398942, -0.040274, 0.501961);","uniform vec4 screen;","uniform float similarity;","uniform float smoothness;","uniform float spill;","uniform float contrast;","uniform float gamma;","varying vec2 chroma_key;","varying vec2 pixel_size;","varying float similarity_v;","varying float smoothness_v;","varying float spill_v;","varying float contrast_v;","varying float gamma_v;","void main(void) {","\tfloat cb = dot(screen.rgb, cb_v4.xyz) + cb_v4.w;","\tfloat cr = dot(screen.rgb, cr_v4.xyz) + cr_v4.w;","\tchroma_key.x = cb;","\tchroma_key.y = cr;","\tpixel_size.x = 1.0 / resolution.x;","\tpixel_size.y = 1.0 / resolution.y;","\tsimilarity_v = similarity * 1.0 / 1000.0;","\tsmoothness_v = smoothness * 1.0 / 1000.0;","\tspill_v = spill * 1.0 / 1000.0;","\tcontrast_v = (contrast < 0.0) ? (1.0 / (-contrast + 1.0)) : (contrast + 1.0);","\tgamma_v = (gamma < 0.0) ? (-gamma + 1.0) : (1.0 / (gamma + 1.0));","\tvec4 screenPosition = vec4(position.xy * resolution / 2.0, position.z, position.w);","\tscreenPosition = transform * screenPosition;","\tgl_Position = screenPosition;","\tgl_Position.xy = screenPosition.xy * 2.0 / resolution;","\tgl_Position.z = screenPosition.z * 2.0 / (resolution.x / resolution.y);","\tvTexCoord = texCoord;","}"].join("\n"),t.fragment=[this.inputs.mask?"#define MASK":"","precision mediump float;","varying vec2 vTexCoord;","uniform bool mask;","uniform vec4 screen;","uniform sampler2D source;","const vec4 cb_v4 = vec4(-0.100644, -0.338572, 0.439216, 0.501961);","const vec4 cr_v4 = vec4(0.439216, -0.398942, -0.040274, 0.501961);","uniform float opacity;","uniform float brightness;","varying vec2 chroma_key;","varying vec2 pixel_size;","varying float similarity_v;","varying float smoothness_v;","varying float spill_v;","varying float contrast_v;","varying float gamma_v;","vec4 CalcColor(vec4 rgba) {","\treturn vec4(pow(rgba.rgb, vec3(gamma_v, gamma_v, gamma_v)) * contrast_v + brightness, rgba.a);","}","float GetChromaDist(vec3 rgb) {","\tfloat cb = dot(rgb.rgb, cb_v4.xyz) + cb_v4.w;","\tfloat cr = dot(rgb.rgb, cr_v4.xyz) + cr_v4.w;","\treturn distance(chroma_key, vec2(cb, cr));","}","float GetNonlinearChannel(float u) {","\treturn u;","}","vec3 GetNonlinearColor(vec3 rgb)","{","\treturn vec3(GetNonlinearChannel(rgb.r), GetNonlinearChannel(rgb.g), GetNonlinearChannel(rgb.b));","}","vec3 SampleTexture(vec2 uv)","{","\tvec3 rgb = texture2D(source, uv).rgb;","\treturn GetNonlinearColor(rgb);","}","float GetBoxFilteredChromaDist(vec3 rgb, vec2 texCoord) {","\tvec2 h_pixel_size = pixel_size / 2.0;","\tvec2 point_0 = vec2(pixel_size.x, h_pixel_size.y);","\tvec2 point_1 = vec2(h_pixel_size.x, -pixel_size.y);","\tfloat distVal = GetChromaDist(SampleTexture(texCoord-point_0));","\tdistVal += GetChromaDist(SampleTexture(texCoord+point_0));","\tdistVal += GetChromaDist(SampleTexture(texCoord-point_1));","\tdistVal += GetChromaDist(SampleTexture(texCoord+point_1));","\tdistVal *= 2.0;","\tdistVal += GetChromaDist(GetNonlinearColor(rgb));","\treturn distVal / 9.0;","}","vec4 ProcessChromaKey(vec4 rgba, vec2 uv)","{","\tfloat chromaDist = GetBoxFilteredChromaDist(rgba.rgb, uv);","\tfloat baseMask = chromaDist - similarity_v;","\tfloat fullMask = pow(clamp(baseMask / smoothness_v, 0.0, 1.0), 1.5);","\tfloat spillVal = pow(clamp(baseMask / spill_v, 0.0, 1.0), 1.5);","\trgba.a *= opacity;","\trgba.a *= fullMask;","\tfloat desat = dot(rgba.rgb, vec3(0.2126, 0.7152, 0.0722));","\trgba.rgb = mix(vec3(desat, desat, desat), rgba.rgb, spillVal);","\treturn CalcColor(rgba);","}","void main(void) {","\tvec4 rgba = texture2D(source, vTexCoord);","\n \tif (screen.w == 0.0) {\n \t\tgl_FragColor = rgba;\n \t\treturn;\n \t}\n ","\trgba.rgb *= (rgba.a > 0.) ? (1. / rgba.a) : 0.;","\trgba = ProcessChromaKey(rgba, vTexCoord);","\trgba.rgb *= rgba.a;","#ifdef MASK","\tgl_FragColor = vec4(vec3(rgba.a), 1.0);","#else","\tgl_FragColor = rgba;","#endif","}"].join("\n"),t},inPlace:!0,inputs:{source:{type:"image",uniform:"source"},screen:{type:"color",uniform:"screen",defaultValue:[0,1,0,1]},similarity:{type:"number",uniform:"similarity",defaultValue:400,min:1,max:1e3},smoothness:{type:"number",uniform:"smoothness",defaultValue:80,min:1,max:1e3},opacity:{type:"number",uniform:"opacity",defaultValue:1,min:0,max:1},contrast:{type:"number",uniform:"contrast",defaultValue:0,min:-4,max:4},brightness:{type:"number",uniform:"brightness",defaultValue:0,min:-1,max:1},gamma:{type:"number",uniform:"gamma",defaultValue:0,min:-1,max:1},spill:{type:"number",uniform:"spill",defaultValue:100,min:1,max:1e3},mask:{type:"boolean",defaultValue:!1,uniform:"mask",shaderDirty:!0}},title:"Chroma Key OBS",description:""});