mirror of
https://github.com/brunoherbelin/vimix.git
synced 2025-12-17 21:29:59 +01:00
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:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user