mirror of
https://github.com/openseadragon/openseadragon.git
synced 2024-11-29 16:46:08 +03:00
72 lines
1.7 KiB
Plaintext
72 lines
1.7 KiB
Plaintext
|
precision mediump float;
|
||
|
uniform sampler2D u_tile;
|
||
|
uniform vec2 u_tile_size;
|
||
|
varying vec2 v_tile_pos;
|
||
|
|
||
|
// Sum a vector
|
||
|
float sum3(vec3 v) {
|
||
|
return dot(v,vec3(1));
|
||
|
}
|
||
|
|
||
|
// Weight of a matrix
|
||
|
float weigh3(mat3 m) {
|
||
|
return sum3(m[0])+sum3(m[1])+sum3(m[2]);
|
||
|
}
|
||
|
|
||
|
// Take the outer product
|
||
|
mat3 outer3(vec3 c, vec3 r) {
|
||
|
mat3 goal;
|
||
|
for (int i =0; i<3; i++) {
|
||
|
goal[i] = r*c[i];
|
||
|
}
|
||
|
return goal;
|
||
|
}
|
||
|
|
||
|
//*~*~*~*~*~*~*~*~*~*~*~*~*~
|
||
|
// Now for the Sobel Program
|
||
|
//*~
|
||
|
|
||
|
// Sample the color at offset
|
||
|
vec3 color(float dx, float dy) {
|
||
|
// calculate the color of sampler at an offset from position
|
||
|
return texture2D(u_tile, v_tile_pos+vec2(dx,dy)).rgb;
|
||
|
}
|
||
|
|
||
|
float sobel(mat3 kernel, vec3 near_in[9]) {
|
||
|
|
||
|
// nearest pixels
|
||
|
mat3 near_out[3];
|
||
|
|
||
|
// Get all near_in pixels
|
||
|
for (int i = 0; i < 3; i++) {
|
||
|
near_out[i][0] = kernel[0]*vec3(near_in[0][i],near_in[1][i],near_in[2][i]);
|
||
|
near_out[i][1] = kernel[1]*vec3(near_in[3][i],near_in[4][i],near_in[5][i]);
|
||
|
near_out[i][2] = kernel[2]*vec3(near_in[6][i],near_in[7][i],near_in[8][i]);
|
||
|
}
|
||
|
|
||
|
// convolve the kernel with the nearest pixels
|
||
|
return length(vec3(weigh3(near_out[0]),weigh3(near_out[1]),weigh3(near_out[2])));
|
||
|
}
|
||
|
|
||
|
void main() {
|
||
|
// Prep work
|
||
|
vec3 near_in[9];
|
||
|
vec3 mean = vec3(1,2,1);
|
||
|
vec3 slope = vec3(-1,0,1);
|
||
|
mat3 sobelX = outer3(mean,slope);
|
||
|
mat3 sobelY = outer3(slope,mean);
|
||
|
vec2 u = vec2(1./u_tile_size.x, 1./u_tile_size.y);
|
||
|
// Calculate coordinates of nearest points
|
||
|
for (int i = 0; i < 9; i++) {
|
||
|
near_in[i] = color(mod(float(i),3.)*u.x, float(i/3-1)*u.y);
|
||
|
}
|
||
|
|
||
|
// Show the mixed XY contrast
|
||
|
float edgeX = sobel(sobelX, near_in);
|
||
|
float edgeY = sobel(sobelY, near_in);
|
||
|
float mixed = length(vec2(edgeX,edgeY));
|
||
|
// mixed = (max(mixed,0.5)-0.5);
|
||
|
|
||
|
gl_FragColor = vec4(vec3(mixed),1);
|
||
|
}
|