Opengl边缘检测 基于Sobel算子与片元着色器
//Sobel edge detection
//ZJU CG lab
//ZJU Felix 2022.1
#version 330 core
in vec2 inTextureCoordinate;
out vec4 color;
uniform sampler2D inputImageTexture;
mat3 sx = mat3(
1.0, 2.0, 1.0,
0.0, 0.0, 0.0,
-1.0, -2.0, -1.0
);
mat3 sy = mat3(
1.0, 0.0, -1.0,
2.0, 0.0, -2.0,
1.0, 0.0, -1.0
);
void main()
{
vec2 x_1 = vec2(1.0/800.0, 0.0); //the length of one texel
vec2 y_1 = vec2(0.0, 1.0/600.0); //the length of one texel
mat3 I;
for (int i=0; i<3; i++) {
for (int j=0; j<3; j++)
I[i][j] = length(texture(inputImageTexture, inTextureCoordinate + vec2((i-1)/800.0,(j-1)/600.0)).rgb);
}
float gx = dot(sx[0], I[0]) + dot(sx[1], I[1]) + dot(sx[2], I[2]);
float gy = dot(sy[0], I[0]) + dot(sy[1], I[1]) + dot(sy[2], I[2]);
float mag = length(vec2(gx, gy));
color = vec4(vec3(mag), 1.0);
}
边缘检测效果如下: