Merge pull request #358 from oc1024/master

Extra Keying Effects I: Luma Key and Color Selector
This commit is contained in:
itsmattkc
2019-02-02 00:09:22 +11:00
committed by GitHub
4 changed files with 149 additions and 0 deletions
+83
View File
@@ -0,0 +1,83 @@
/* Filter by color characteristic simple program
Based on Edward Cannon's Simple Chroma Key (adaptation by Olive Team)
RGB to HSV based on MattKC's toonify source code
Feel free to modify and use at will */
#version 110
uniform sampler2D tex;
varying vec2 vTexCoord;
uniform float loc;
uniform float hic;
uniform int compo;
uniform bool invert;
float rgb2luma(vec3 c) {
return (max(max(c.r,c.g), c.b) + min(min(c.r,c.g), c.b))/2.0;
}
vec3 rgb2hsv(vec3 c)
{
float r = c.r;
float b = c.b;
float g = c.g;
float minv, maxv, delta;
vec3 res;
minv = min(min(r, g), b);
maxv = max(max(r, g), b);
res.z = maxv; // v
delta = maxv - minv;
if( maxv != 0.0 )
res.y = delta / maxv; // s
else {
// r = g = b = 0 // s = 0, v is undefined
res.y = 0.0;
res.x = -1.0;
return res;
}
if( r == maxv )
res.x = ( g - b ) / delta; // between yellow & magenta
else if( g == maxv )
res.x = 2.0 + ( b - r ) / delta; // between cyan & yellow
else
res.x = 4.0 + ( r - g ) / delta; // between magenta & cyan
res.x = res.x * 60.0; // degrees
if( res.x < 0.0 )
res.x = res.x + 360.0;
return res;
}
bool isNotIncreasingSequence(float a, float b, float c) {
return (c < b || a > b);
}
void main(void) {
vec4 texture_color = texture2D(tex,vTexCoord);
vec3 color = texture_color.rgb;
float toCheck = 0.0;
if (compo == 0) {
toCheck = rgb2luma(color)*100.0;
} else if (compo == 4) {
toCheck = color.r*100.0;
} else if (compo == 5) {
toCheck = color.g*100.0;
} else if (compo == 6) {
toCheck = color.b*100.0;
} else if (compo == 1) {
toCheck = rgb2hsv(color).z*100.0;
} else if (compo == 2) {
toCheck = rgb2hsv(color).x/3.6;
} else if (compo == 3) {
toCheck = rgb2hsv(color).y*100.0;
}
texture_color.a = isNotIncreasingSequence(loc, toCheck, hic) ? (invert ? texture_color.a : 0.0) : (invert ? 0.0 : texture_color.a);
texture_color.rgb *= texture_color.a;
gl_FragColor = texture_color;
}
+24
View File
@@ -0,0 +1,24 @@
<?xml version="1.0" encoding="UTF-8"?>
<effect name="Color Finder" category="Keying">
<row name="Find by">
<field type="combo" default="0" id="compo">
<option>Luminance</option>
<option>Value</option>
<option>Hue</option>
<option>Saturation</option>
<option>Red</option>
<option>Green</option>
<option>Blue</option>
</field>
</row>
<row name="Lower Limit">
<field type="double" min="0" default="0" max="100" id="loc"/>
</row>
<row name="Upper Limit">
<field type="double" min="0" default="100" max="100" id="hic"/>
</row>
<row name="Invert">
<field type="bool" min="0" default="100" max="100" id="invert"/>
</row>
<shader vert="common.vert" frag="colorsel.frag"/>
</effect>
+29
View File
@@ -0,0 +1,29 @@
/* Luma key simple program
Based on Edward Cannon's Simple Chroma Key (adaptation by Olive Team)
Feel free to modify and use at will */
uniform sampler2D tex;
varying vec2 vTexCoord;
uniform float loc;
uniform float hic;
uniform bool invert;
void main(void) {
vec4 texture_color = texture2D(tex,vTexCoord);
float luma = max(max(texture_color.r,texture_color.g), texture_color.b) + min(min(texture_color.r,texture_color.g), texture_color.b);
luma /= 2.0;
if (luma > hic/100.0) {
texture_color.a = (invert ? 0.0 : 1.0);
} else if (luma < loc/100.0) {
texture_color.a = (invert ? 1.0 : 0.0);
} else {
texture_color.a = (invert ? 1.0-luma : luma);
}
texture_color.rgb *= texture_color.a;
gl_FragColor = texture_color;
}
+13
View File
@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<effect name="Luma Key" category="Keying">
<row name="Lower Limit">
<field type="double" min="0" default="0" max="100" id="loc"/>
</row>
<row name="Upper Limit">
<field type="double" min="0" default="100" max="100" id="hic"/>
</row>
<row name="Invert">
<field type="bool" min="0" default="100" max="100" id="invert"/>
</row>
<shader vert="common.vert" frag="lumakey.frag"/>
</effect>