@bddh/starling-cutout
Version:
cutout
2 lines (1 loc) • 2.46 kB
JavaScript
"use strict";var e=require("./seriously.js");window,console.info("seriously version: chroma_post"),e.seriouslyExports.plugin("chroma_post",{shader:function(e,o){return o.vertex=["precision mediump float;","attribute vec4 position;","attribute vec2 texCoord;","uniform vec2 resolution;","uniform mat4 transform;","varying vec2 vTexCoord;","varying vec2 pixel_size;","void main(void) {","\tpixel_size.x = 1.0 / resolution.x;","\tpixel_size.y = 1.0 / resolution.y;","\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"),o.fragment=[this.inputs.mask?"#define MASK":"","precision mediump float;","varying vec2 vTexCoord;","uniform bool mask;","uniform sampler2D source;","uniform float edgeShrink;","varying vec2 pixel_size;","const int filter_size = 3;","float edgeSmoothSuppKernelV2(vec4 rgba, vec2 coord) {"," float alpha = rgba.a;"," if (edgeShrink > 1.0) {"," float sum = 0.0;"," float weightSum = 0.0;"," // float sigma = 1.0f;"," for (int j = - filter_size / 2; j <= filter_size / 2; j++) {"," \t for (int i = - filter_size / 2; i <= filter_size / 2; i++) {"," \t\t // float weight = exp(-(i*i + j*j) / (2 * sigma * sigma)) / (2 * 3.1415926f * sigma * sigma);"," \t\t float weight = 1.0;"," vec4 neighborColor = texture2D(source, coord + vec2(i, j) * pixel_size);"," \t\t // speedup: move the powf to chroma_key"," \t\t float alpha_ker = pow(neighborColor.w, edgeShrink);"," \t\t sum += (alpha_ker * weight);"," \t\t weightSum += weight;"," \t }"," }"," alpha = sum * 1.0 / weightSum;"," }"," return alpha;","}","void main(void) {","\tvec4 rgba = texture2D(source, vTexCoord);","\trgba.a = edgeSmoothSuppKernelV2(rgba, vTexCoord);","\trgba.a = pow(rgba.a, edgeShrink);","#ifdef MASK","\tgl_FragColor = vec4(vec3(rgba.a), 1.0);","#else","\tgl_FragColor = rgba;","#endif","}"].join("\n"),o},inPlace:!0,inputs:{source:{type:"image",uniform:"source"},edgeShrink:{type:"number",uniform:"edgeShrink",defaultValue:3,min:1,max:10},mask:{type:"boolean",defaultValue:!1,uniform:"mask",shaderDirty:!0}},title:"Chroma Key Post",description:""});