Doodle3D-Core/shaders/fragmentShaderSobel.glsl

27 lines
986 B
GLSL

uniform sampler2D tDiffuse;
uniform float threshold;
uniform vec2 aspect;
varying vec2 vUv;
void main() {
float w = (1.0 / aspect.x);
float h = (1.0 / aspect.y);
vec4 n[9];
n[0] = texture2D(tDiffuse, vUv + vec2( -w, -h));
n[1] = texture2D(tDiffuse, vUv + vec2(0.0, -h));
n[2] = texture2D(tDiffuse, vUv + vec2( w, -h));
n[3] = texture2D(tDiffuse, vUv + vec2( -w, 0.0));
n[4] = texture2D(tDiffuse, vUv);
n[5] = texture2D(tDiffuse, vUv + vec2( w, 0.0));
n[6] = texture2D(tDiffuse, vUv + vec2( -w, h));
n[7] = texture2D(tDiffuse, vUv + vec2(0.0, h));
n[8] = texture2D(tDiffuse, vUv + vec2( w, h));
vec4 sobel_horizEdge = n[2] + (2.0 * n[5]) + n[8] - (n[0] + (2.0 * n[3]) + n[6]);
vec4 sobel_vertEdge = n[0] + (2.0 * n[1]) + n[2] - (n[6] + (2.0 * n[7]) + n[8]);
vec3 sobel = sqrt((sobel_horizEdge.rgb * sobel_horizEdge.rgb) + (sobel_vertEdge.rgb * sobel_vertEdge.rgb));
gl_FragColor = (length(sobel) > threshold) ? vec4(vec3(1.0), 0.0) : vec4(0.0);
}