openseadragon/test/demo/old-plugins/via-webgl/fs.glsl

72 lines
1.7 KiB
Plaintext
Raw Normal View History

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);
}