Implementation of image transformation in shaders: iTransform is a

generic UV coordinates transformation matrix (for translation, scaling
and rotation) edited in AppearanceView. Removing previous UV editing
functions.
This commit is contained in:
brunoherbelin
2020-11-29 12:31:06 +01:00
parent d92736b38f
commit 5200de2e3e
9 changed files with 241 additions and 227 deletions

View File

@@ -25,11 +25,12 @@ out vec4 FragColor;
in vec4 vertexColor;
in vec2 vertexUV;
vec2 texcoord;
vec4 texcoord;
// image processing specific
uniform sampler2D iChannel0; // input channel (texture id).
uniform vec3 iResolution; // viewport resolution (in pixels)
uniform mat4 iTransform; // UV image transformation
// Image shader uniforms
uniform vec4 color;
@@ -77,47 +78,47 @@ vec3 erosion(int N, vec2 filter_step)
{
vec3 minValue = vec3(1.0);
minValue = min(texture(iChannel0, texcoord + vec2 (0.0,0.0) * filter_step ).rgb, minValue);
minValue = min(texture(iChannel0, texcoord + vec2 (0.0,-1.0) * filter_step ).rgb, minValue);
minValue = min(texture(iChannel0, texcoord + vec2 (-1.0, 0.0) * filter_step ).rgb, minValue);
minValue = min(texture(iChannel0, texcoord + vec2 (1.0, 0.0) * filter_step ).rgb, minValue);
minValue = min(texture(iChannel0, texcoord + vec2 (0.0, 1.0) * filter_step ).rgb, minValue);
minValue = min(texture(iChannel0, texcoord.xy + vec2 (0.0,0.0) * filter_step ).rgb, minValue);
minValue = min(texture(iChannel0, texcoord.xy + vec2 (0.0,-1.0) * filter_step ).rgb, minValue);
minValue = min(texture(iChannel0, texcoord.xy + vec2 (-1.0, 0.0) * filter_step ).rgb, minValue);
minValue = min(texture(iChannel0, texcoord.xy + vec2 (1.0, 0.0) * filter_step ).rgb, minValue);
minValue = min(texture(iChannel0, texcoord.xy + vec2 (0.0, 1.0) * filter_step ).rgb, minValue);
if (N < 1)
return minValue;
minValue = min(texture(iChannel0, texcoord + vec2 (-1.0, -2.0) * filter_step ).rgb, minValue);
minValue = min(texture(iChannel0, texcoord + vec2 (0.0,-2.0) * filter_step ).rgb, minValue);
minValue = min(texture(iChannel0, texcoord + vec2 (1.0,-2.0) * filter_step ).rgb, minValue);
minValue = min(texture(iChannel0, texcoord + vec2 (-1.0,2.0) * filter_step ).rgb, minValue);
minValue = min(texture(iChannel0, texcoord + vec2 (0.0, 2.0) * filter_step ).rgb, minValue);
minValue = min(texture(iChannel0, texcoord + vec2 (1.0, 2.0) * filter_step ).rgb, minValue);
minValue = min(texture(iChannel0, texcoord + vec2 (-2.0, 1.0) * filter_step ).rgb, minValue);
minValue = min(texture(iChannel0, texcoord + vec2 (-1.0, 1.0) * filter_step ).rgb, minValue);
minValue = min(texture(iChannel0, texcoord + vec2 ( 1.0, 1.0) * filter_step ).rgb, minValue);
minValue = min(texture(iChannel0, texcoord + vec2 ( 2.0, 1.0) * filter_step ).rgb, minValue);
minValue = min(texture(iChannel0, texcoord + vec2 (-2.0, -1.0) * filter_step ).rgb, minValue);
minValue = min(texture(iChannel0, texcoord + vec2 (-1.0, -1.0) * filter_step ).rgb, minValue);
minValue = min(texture(iChannel0, texcoord + vec2 ( 1.0, -1.0) * filter_step ).rgb, minValue);
minValue = min(texture(iChannel0, texcoord + vec2 ( 2.0, -1.0) * filter_step ).rgb, minValue);
minValue = min(texture(iChannel0, texcoord + vec2 (-2.0, 0.0) * filter_step ).rgb, minValue);
minValue = min(texture(iChannel0, texcoord + vec2 ( 2.0, 0.0) * filter_step ).rgb, minValue);
minValue = min(texture(iChannel0, texcoord.xy + vec2 (-1.0, -2.0) * filter_step ).rgb, minValue);
minValue = min(texture(iChannel0, texcoord.xy + vec2 (0.0,-2.0) * filter_step ).rgb, minValue);
minValue = min(texture(iChannel0, texcoord.xy + vec2 (1.0,-2.0) * filter_step ).rgb, minValue);
minValue = min(texture(iChannel0, texcoord.xy + vec2 (-1.0,2.0) * filter_step ).rgb, minValue);
minValue = min(texture(iChannel0, texcoord.xy + vec2 (0.0, 2.0) * filter_step ).rgb, minValue);
minValue = min(texture(iChannel0, texcoord.xy + vec2 (1.0, 2.0) * filter_step ).rgb, minValue);
minValue = min(texture(iChannel0, texcoord.xy + vec2 (-2.0, 1.0) * filter_step ).rgb, minValue);
minValue = min(texture(iChannel0, texcoord.xy + vec2 (-1.0, 1.0) * filter_step ).rgb, minValue);
minValue = min(texture(iChannel0, texcoord.xy + vec2 ( 1.0, 1.0) * filter_step ).rgb, minValue);
minValue = min(texture(iChannel0, texcoord.xy + vec2 ( 2.0, 1.0) * filter_step ).rgb, minValue);
minValue = min(texture(iChannel0, texcoord.xy + vec2 (-2.0, -1.0) * filter_step ).rgb, minValue);
minValue = min(texture(iChannel0, texcoord.xy + vec2 (-1.0, -1.0) * filter_step ).rgb, minValue);
minValue = min(texture(iChannel0, texcoord.xy + vec2 ( 1.0, -1.0) * filter_step ).rgb, minValue);
minValue = min(texture(iChannel0, texcoord.xy + vec2 ( 2.0, -1.0) * filter_step ).rgb, minValue);
minValue = min(texture(iChannel0, texcoord.xy + vec2 (-2.0, 0.0) * filter_step ).rgb, minValue);
minValue = min(texture(iChannel0, texcoord.xy + vec2 ( 2.0, 0.0) * filter_step ).rgb, minValue);
if (N < 2)
return minValue;
minValue = min(texture(iChannel0, texcoord + vec2 (-1.0, -3.0) * filter_step ).rgb, minValue);
minValue = min(texture(iChannel0, texcoord + vec2 (0.0,-3.0) * filter_step ).rgb, minValue);
minValue = min(texture(iChannel0, texcoord + vec2 (1.0,-3.0) * filter_step ).rgb, minValue);
minValue = min(texture(iChannel0, texcoord + vec2 (-1.0,3.0) * filter_step ).rgb, minValue);
minValue = min(texture(iChannel0, texcoord + vec2 (0.0, 3.0) * filter_step ).rgb, minValue);
minValue = min(texture(iChannel0, texcoord + vec2 (1.0, 3.0) * filter_step ).rgb, minValue);
minValue = min(texture(iChannel0, texcoord + vec2 (-2.0, 2.0) * filter_step ).rgb, minValue);
minValue = min(texture(iChannel0, texcoord + vec2 ( 2.0, 2.0) * filter_step ).rgb, minValue);
minValue = min(texture(iChannel0, texcoord + vec2 (-2.0, -2.0) * filter_step ).rgb, minValue);
minValue = min(texture(iChannel0, texcoord + vec2 ( 2.0, -2.0) * filter_step ).rgb, minValue);
minValue = min(texture(iChannel0, texcoord + vec2 (-3.0, -1.0) * filter_step ).rgb, minValue);
minValue = min(texture(iChannel0, texcoord + vec2 (3.0, -1.0) * filter_step ).rgb, minValue);
minValue = min(texture(iChannel0, texcoord + vec2 (-3.0, 1.0) * filter_step ).rgb, minValue);
minValue = min(texture(iChannel0, texcoord + vec2 ( 3.0, 1.0) * filter_step ).rgb, minValue);
minValue = min(texture(iChannel0, texcoord + vec2 (-3.0, 0.0) * filter_step ).rgb, minValue);
minValue = min(texture(iChannel0, texcoord + vec2 ( 3.0, 0.0) * filter_step ).rgb, minValue);
minValue = min(texture(iChannel0, texcoord.xy + vec2 (-1.0, -3.0) * filter_step ).rgb, minValue);
minValue = min(texture(iChannel0, texcoord.xy + vec2 (0.0,-3.0) * filter_step ).rgb, minValue);
minValue = min(texture(iChannel0, texcoord.xy + vec2 (1.0,-3.0) * filter_step ).rgb, minValue);
minValue = min(texture(iChannel0, texcoord.xy + vec2 (-1.0,3.0) * filter_step ).rgb, minValue);
minValue = min(texture(iChannel0, texcoord.xy + vec2 (0.0, 3.0) * filter_step ).rgb, minValue);
minValue = min(texture(iChannel0, texcoord.xy + vec2 (1.0, 3.0) * filter_step ).rgb, minValue);
minValue = min(texture(iChannel0, texcoord.xy + vec2 (-2.0, 2.0) * filter_step ).rgb, minValue);
minValue = min(texture(iChannel0, texcoord.xy + vec2 ( 2.0, 2.0) * filter_step ).rgb, minValue);
minValue = min(texture(iChannel0, texcoord.xy + vec2 (-2.0, -2.0) * filter_step ).rgb, minValue);
minValue = min(texture(iChannel0, texcoord.xy + vec2 ( 2.0, -2.0) * filter_step ).rgb, minValue);
minValue = min(texture(iChannel0, texcoord.xy + vec2 (-3.0, -1.0) * filter_step ).rgb, minValue);
minValue = min(texture(iChannel0, texcoord.xy + vec2 (3.0, -1.0) * filter_step ).rgb, minValue);
minValue = min(texture(iChannel0, texcoord.xy + vec2 (-3.0, 1.0) * filter_step ).rgb, minValue);
minValue = min(texture(iChannel0, texcoord.xy + vec2 ( 3.0, 1.0) * filter_step ).rgb, minValue);
minValue = min(texture(iChannel0, texcoord.xy + vec2 (-3.0, 0.0) * filter_step ).rgb, minValue);
minValue = min(texture(iChannel0, texcoord.xy + vec2 ( 3.0, 0.0) * filter_step ).rgb, minValue);
return minValue;
}
@@ -126,47 +127,47 @@ vec3 dilation(int N, vec2 filter_step)
{
vec3 maxValue = vec3(0.0);
maxValue = max(texture(iChannel0, texcoord + vec2 (0.0, 0.0) * filter_step ).rgb, maxValue);
maxValue = max(texture(iChannel0, texcoord + vec2 (0.0,-1.0) * filter_step ).rgb, maxValue);
maxValue = max(texture(iChannel0, texcoord + vec2 (-1.0, 0.0) * filter_step ).rgb, maxValue);
maxValue = max(texture(iChannel0, texcoord + vec2 (1.0, 0.0) * filter_step ).rgb, maxValue);
maxValue = max(texture(iChannel0, texcoord + vec2 (0.0, 1.0) * filter_step ).rgb, maxValue);
maxValue = max(texture(iChannel0, texcoord.xy + vec2 (0.0, 0.0) * filter_step ).rgb, maxValue);
maxValue = max(texture(iChannel0, texcoord.xy + vec2 (0.0,-1.0) * filter_step ).rgb, maxValue);
maxValue = max(texture(iChannel0, texcoord.xy + vec2 (-1.0, 0.0) * filter_step ).rgb, maxValue);
maxValue = max(texture(iChannel0, texcoord.xy + vec2 (1.0, 0.0) * filter_step ).rgb, maxValue);
maxValue = max(texture(iChannel0, texcoord.xy + vec2 (0.0, 1.0) * filter_step ).rgb, maxValue);
if (N < 1)
return maxValue;
maxValue = max(texture(iChannel0, texcoord + vec2 (-1.0, -2.0) * filter_step ).rgb, maxValue);
maxValue = max(texture(iChannel0, texcoord + vec2 (0.0,-2.0) * filter_step ).rgb, maxValue);
maxValue = max(texture(iChannel0, texcoord + vec2 (1.0,-2.0) * filter_step ).rgb, maxValue);
maxValue = max(texture(iChannel0, texcoord + vec2 (-1.0,2.0) * filter_step ).rgb, maxValue);
maxValue = max(texture(iChannel0, texcoord + vec2 (0.0, 2.0) * filter_step ).rgb, maxValue);
maxValue = max(texture(iChannel0, texcoord + vec2 (1.0, 2.0) * filter_step ).rgb, maxValue);
maxValue = max(texture(iChannel0, texcoord + vec2 (-2.0, 1.0) * filter_step ).rgb, maxValue);
maxValue = max(texture(iChannel0, texcoord + vec2 (-1.0, 1.0) * filter_step ).rgb, maxValue);
maxValue = max(texture(iChannel0, texcoord + vec2 ( 1.0, 1.0) * filter_step ).rgb, maxValue);
maxValue = max(texture(iChannel0, texcoord + vec2 ( 2.0, 1.0) * filter_step ).rgb, maxValue);
maxValue = max(texture(iChannel0, texcoord + vec2 (-2.0, -1.0) * filter_step ).rgb, maxValue);
maxValue = max(texture(iChannel0, texcoord + vec2 (-1.0, -1.0) * filter_step ).rgb, maxValue);
maxValue = max(texture(iChannel0, texcoord + vec2 ( 1.0, -1.0) * filter_step ).rgb, maxValue);
maxValue = max(texture(iChannel0, texcoord + vec2 ( 2.0, -1.0) * filter_step ).rgb, maxValue);
maxValue = max(texture(iChannel0, texcoord + vec2 (-2.0, 0.0) * filter_step ).rgb, maxValue);
maxValue = max(texture(iChannel0, texcoord + vec2 ( 2.0, 0.0) * filter_step ).rgb, maxValue);
maxValue = max(texture(iChannel0, texcoord.xy + vec2 (-1.0, -2.0) * filter_step ).rgb, maxValue);
maxValue = max(texture(iChannel0, texcoord.xy + vec2 (0.0,-2.0) * filter_step ).rgb, maxValue);
maxValue = max(texture(iChannel0, texcoord.xy + vec2 (1.0,-2.0) * filter_step ).rgb, maxValue);
maxValue = max(texture(iChannel0, texcoord.xy + vec2 (-1.0,2.0) * filter_step ).rgb, maxValue);
maxValue = max(texture(iChannel0, texcoord.xy + vec2 (0.0, 2.0) * filter_step ).rgb, maxValue);
maxValue = max(texture(iChannel0, texcoord.xy + vec2 (1.0, 2.0) * filter_step ).rgb, maxValue);
maxValue = max(texture(iChannel0, texcoord.xy + vec2 (-2.0, 1.0) * filter_step ).rgb, maxValue);
maxValue = max(texture(iChannel0, texcoord.xy + vec2 (-1.0, 1.0) * filter_step ).rgb, maxValue);
maxValue = max(texture(iChannel0, texcoord.xy + vec2 ( 1.0, 1.0) * filter_step ).rgb, maxValue);
maxValue = max(texture(iChannel0, texcoord.xy + vec2 ( 2.0, 1.0) * filter_step ).rgb, maxValue);
maxValue = max(texture(iChannel0, texcoord.xy + vec2 (-2.0, -1.0) * filter_step ).rgb, maxValue);
maxValue = max(texture(iChannel0, texcoord.xy + vec2 (-1.0, -1.0) * filter_step ).rgb, maxValue);
maxValue = max(texture(iChannel0, texcoord.xy + vec2 ( 1.0, -1.0) * filter_step ).rgb, maxValue);
maxValue = max(texture(iChannel0, texcoord.xy + vec2 ( 2.0, -1.0) * filter_step ).rgb, maxValue);
maxValue = max(texture(iChannel0, texcoord.xy + vec2 (-2.0, 0.0) * filter_step ).rgb, maxValue);
maxValue = max(texture(iChannel0, texcoord.xy + vec2 ( 2.0, 0.0) * filter_step ).rgb, maxValue);
if (N < 2)
return maxValue;
maxValue = max(texture(iChannel0, texcoord + vec2 (-1.0, -3.0) * filter_step ).rgb, maxValue);
maxValue = max(texture(iChannel0, texcoord + vec2 (0.0,-3.0) * filter_step ).rgb, maxValue);
maxValue = max(texture(iChannel0, texcoord + vec2 (1.0,-3.0) * filter_step ).rgb, maxValue);
maxValue = max(texture(iChannel0, texcoord + vec2 (-1.0,3.0) * filter_step ).rgb, maxValue);
maxValue = max(texture(iChannel0, texcoord + vec2 (0.0, 3.0) * filter_step ).rgb, maxValue);
maxValue = max(texture(iChannel0, texcoord + vec2 (1.0, 3.0) * filter_step ).rgb, maxValue);
maxValue = max(texture(iChannel0, texcoord + vec2 (-2.0, 2.0) * filter_step ).rgb, maxValue);
maxValue = max(texture(iChannel0, texcoord + vec2 ( 2.0, 2.0) * filter_step ).rgb, maxValue);
maxValue = max(texture(iChannel0, texcoord + vec2 (-2.0, -2.0) * filter_step ).rgb, maxValue);
maxValue = max(texture(iChannel0, texcoord + vec2 ( 2.0, -2.0) * filter_step ).rgb, maxValue);
maxValue = max(texture(iChannel0, texcoord + vec2 (-3.0, -1.0) * filter_step ).rgb, maxValue);
maxValue = max(texture(iChannel0, texcoord + vec2 (3.0, -1.0) * filter_step ).rgb, maxValue);
maxValue = max(texture(iChannel0, texcoord + vec2 (-3.0, 1.0) * filter_step ).rgb, maxValue);
maxValue = max(texture(iChannel0, texcoord + vec2 ( 3.0, 1.0) * filter_step ).rgb, maxValue);
maxValue = max(texture(iChannel0, texcoord + vec2 (-3.0, 0.0) * filter_step ).rgb, maxValue);
maxValue = max(texture(iChannel0, texcoord + vec2 ( 3.0, 0.0) * filter_step ).rgb, maxValue);
maxValue = max(texture(iChannel0, texcoord.xy + vec2 (-1.0, -3.0) * filter_step ).rgb, maxValue);
maxValue = max(texture(iChannel0, texcoord.xy + vec2 (0.0,-3.0) * filter_step ).rgb, maxValue);
maxValue = max(texture(iChannel0, texcoord.xy + vec2 (1.0,-3.0) * filter_step ).rgb, maxValue);
maxValue = max(texture(iChannel0, texcoord.xy + vec2 (-1.0,3.0) * filter_step ).rgb, maxValue);
maxValue = max(texture(iChannel0, texcoord.xy + vec2 (0.0, 3.0) * filter_step ).rgb, maxValue);
maxValue = max(texture(iChannel0, texcoord.xy + vec2 (1.0, 3.0) * filter_step ).rgb, maxValue);
maxValue = max(texture(iChannel0, texcoord.xy + vec2 (-2.0, 2.0) * filter_step ).rgb, maxValue);
maxValue = max(texture(iChannel0, texcoord.xy + vec2 ( 2.0, 2.0) * filter_step ).rgb, maxValue);
maxValue = max(texture(iChannel0, texcoord.xy + vec2 (-2.0, -2.0) * filter_step ).rgb, maxValue);
maxValue = max(texture(iChannel0, texcoord.xy + vec2 ( 2.0, -2.0) * filter_step ).rgb, maxValue);
maxValue = max(texture(iChannel0, texcoord.xy + vec2 (-3.0, -1.0) * filter_step ).rgb, maxValue);
maxValue = max(texture(iChannel0, texcoord.xy + vec2 (3.0, -1.0) * filter_step ).rgb, maxValue);
maxValue = max(texture(iChannel0, texcoord.xy + vec2 (-3.0, 1.0) * filter_step ).rgb, maxValue);
maxValue = max(texture(iChannel0, texcoord.xy + vec2 ( 3.0, 1.0) * filter_step ).rgb, maxValue);
maxValue = max(texture(iChannel0, texcoord.xy + vec2 (-3.0, 0.0) * filter_step ).rgb, maxValue);
maxValue = max(texture(iChannel0, texcoord.xy + vec2 ( 3.0, 0.0) * filter_step ).rgb, maxValue);
return maxValue;
}
@@ -176,29 +177,29 @@ vec3 opening(vec2 filter_step)
{
// 1) erosion
vec3 minValue1 = vec3(1.0);
minValue1 = min(texture(iChannel0, texcoord + vec2 (0.0, 0.0) * filter_step ).rgb, minValue1);
minValue1 = min(texture(iChannel0, texcoord + vec2 (0.0, 1.0) * filter_step ).rgb, minValue1);
minValue1 = min(texture(iChannel0, texcoord + vec2 (0.0, 2.0) * filter_step ).rgb, minValue1);
minValue1 = min(texture(iChannel0, texcoord + vec2 (1.0, 1.0) * filter_step ).rgb, minValue1);
minValue1 = min(texture(iChannel0, texcoord + vec2 (1.0, -1.0) * filter_step ).rgb, minValue1);
minValue1 = min(texture(iChannel0, texcoord.xy + vec2 (0.0, 0.0) * filter_step ).rgb, minValue1);
minValue1 = min(texture(iChannel0, texcoord.xy + vec2 (0.0, 1.0) * filter_step ).rgb, minValue1);
minValue1 = min(texture(iChannel0, texcoord.xy + vec2 (0.0, 2.0) * filter_step ).rgb, minValue1);
minValue1 = min(texture(iChannel0, texcoord.xy + vec2 (1.0, 1.0) * filter_step ).rgb, minValue1);
minValue1 = min(texture(iChannel0, texcoord.xy + vec2 (1.0, -1.0) * filter_step ).rgb, minValue1);
vec3 minValue2 = vec3(1.0);
minValue2 = min(texture(iChannel0, texcoord + vec2 (0.0, 0.0) * filter_step ).rgb, minValue2);
minValue2 = min(texture(iChannel0, texcoord + vec2 (-1.0, 0.0) * filter_step ).rgb, minValue2);
minValue2 = min(texture(iChannel0, texcoord + vec2 (-2.0, 0.0) * filter_step ).rgb, minValue2);
minValue2 = min(texture(iChannel0, texcoord + vec2 (1.0, -1.0) * filter_step ).rgb, minValue2);
minValue2 = min(texture(iChannel0, texcoord + vec2 (-1.0, -1.0) * filter_step ).rgb, minValue2);
minValue2 = min(texture(iChannel0, texcoord.xy + vec2 (0.0, 0.0) * filter_step ).rgb, minValue2);
minValue2 = min(texture(iChannel0, texcoord.xy + vec2 (-1.0, 0.0) * filter_step ).rgb, minValue2);
minValue2 = min(texture(iChannel0, texcoord.xy + vec2 (-2.0, 0.0) * filter_step ).rgb, minValue2);
minValue2 = min(texture(iChannel0, texcoord.xy + vec2 (1.0, -1.0) * filter_step ).rgb, minValue2);
minValue2 = min(texture(iChannel0, texcoord.xy + vec2 (-1.0, -1.0) * filter_step ).rgb, minValue2);
vec3 minValue3 = vec3(1.0);
minValue3 = min(texture(iChannel0, texcoord + vec2 (0.0, 0.0) * filter_step ).rgb, minValue3);
minValue3 = min(texture(iChannel0, texcoord + vec2 (0.0, -1.0) * filter_step ).rgb, minValue3);
minValue3 = min(texture(iChannel0, texcoord + vec2 (0.0, -2.0) * filter_step ).rgb, minValue3);
minValue3 = min(texture(iChannel0, texcoord + vec2 (-1.0, -1.0) * filter_step ).rgb, minValue3);
minValue3 = min(texture(iChannel0, texcoord + vec2 (-1.0, 1.0) * filter_step ).rgb, minValue3);
minValue3 = min(texture(iChannel0, texcoord.xy + vec2 (0.0, 0.0) * filter_step ).rgb, minValue3);
minValue3 = min(texture(iChannel0, texcoord.xy + vec2 (0.0, -1.0) * filter_step ).rgb, minValue3);
minValue3 = min(texture(iChannel0, texcoord.xy + vec2 (0.0, -2.0) * filter_step ).rgb, minValue3);
minValue3 = min(texture(iChannel0, texcoord.xy + vec2 (-1.0, -1.0) * filter_step ).rgb, minValue3);
minValue3 = min(texture(iChannel0, texcoord.xy + vec2 (-1.0, 1.0) * filter_step ).rgb, minValue3);
vec3 minValue4 = vec3(1.0);
minValue4 = min(texture(iChannel0, texcoord + vec2 (0.0, 0.0) * filter_step ).rgb, minValue4);
minValue4 = min(texture(iChannel0, texcoord + vec2 (1.0, 0.0) * filter_step ).rgb, minValue4);
minValue4 = min(texture(iChannel0, texcoord + vec2 (2.0, 0.0) * filter_step ).rgb, minValue4);
minValue4 = min(texture(iChannel0, texcoord + vec2 (1.0, 1.0) * filter_step ).rgb, minValue4);
minValue4 = min(texture(iChannel0, texcoord + vec2 (-1.0, 1.0) * filter_step ).rgb, minValue4);
minValue4 = min(texture(iChannel0, texcoord.xy + vec2 (0.0, 0.0) * filter_step ).rgb, minValue4);
minValue4 = min(texture(iChannel0, texcoord.xy + vec2 (1.0, 0.0) * filter_step ).rgb, minValue4);
minValue4 = min(texture(iChannel0, texcoord.xy + vec2 (2.0, 0.0) * filter_step ).rgb, minValue4);
minValue4 = min(texture(iChannel0, texcoord.xy + vec2 (1.0, 1.0) * filter_step ).rgb, minValue4);
minValue4 = min(texture(iChannel0, texcoord.xy + vec2 (-1.0, 1.0) * filter_step ).rgb, minValue4);
// 2) dilation
vec3 maxValue = vec3(0.0);
@@ -217,7 +218,7 @@ vec3 convolution(mat3 kernel, vec2 filter_step)
for (i = 0; i<3; ++i)
for (j = 0; j<3; ++j)
sum += texture(iChannel0, texcoord + filter_step * vec2 (i-1, j-1) ).rgb * kernel[i][j];
sum += texture(iChannel0, texcoord.xy + filter_step * vec2 (i-1, j-1) ).rgb * kernel[i][j];
return sum;
}
@@ -227,7 +228,7 @@ vec3 apply_filter() {
vec2 filter_step = 1.f / textureSize(iChannel0, 0);
if (filterid < 1 || filterid > 11)
return texture(iChannel0, texcoord).rgb;
return texture(iChannel0, texcoord.xy).rgb;
else if (filterid < 5)
return convolution( KERNEL[filterid], filter_step);
else if (filterid < 6)
@@ -317,11 +318,11 @@ float alphachromakey(vec3 color, vec3 colorKey, float delta)
void main(void)
{
// adjust UV
texcoord = vec2(uv.x, uv.y) + vertexUV * vec2(uv.z - uv.x, uv.w - uv.y);
texcoord = iTransform * vec4(vertexUV.x, vertexUV.y, 0.0, 1.0);
// deal with alpha separately
float ma = texture(iChannel0, texcoord).a;
// float ma = texture(maskTexture, texcoord).a * texture(iChannel0, texcoord).a;
float ma = texture(iChannel0, texcoord.xy).a;
// float ma = texture(maskTexture, texcoord.xy).a * texture(iChannel0, texcoord.xy).a;
float alpha = clamp(ma * color.a, 0.0, 1.0);
// read color & apply basic filterid