From 92cdd9221f08e57ae54a1c28053d8f1ae408cd24 Mon Sep 17 00:00:00 2001 From: codeanticode Date: Fri, 20 Jul 2012 17:40:33 +0000 Subject: [PATCH] Added BlurFilter and EdgeFilter examples --- .../Shaders/BlurFilter/BlurFilter.pde | 32 ++++++++++++++ .../Shaders/BlurFilter/data/blur.glsl | 43 +++++++++++++++++++ .../Shaders/EdgeFilter/EdgeFilter.pde | 11 +++++ .../Shaders/EdgeFilter/data/edges.glsl | 43 +++++++++++++++++++ 4 files changed, 129 insertions(+) create mode 100644 java/libraries/opengl/examples/Shaders/BlurFilter/BlurFilter.pde create mode 100644 java/libraries/opengl/examples/Shaders/BlurFilter/data/blur.glsl create mode 100644 java/libraries/opengl/examples/Shaders/EdgeFilter/EdgeFilter.pde create mode 100644 java/libraries/opengl/examples/Shaders/EdgeFilter/data/edges.glsl diff --git a/java/libraries/opengl/examples/Shaders/BlurFilter/BlurFilter.pde b/java/libraries/opengl/examples/Shaders/BlurFilter/BlurFilter.pde new file mode 100644 index 000000000..33aaa9f4d --- /dev/null +++ b/java/libraries/opengl/examples/Shaders/BlurFilter/BlurFilter.pde @@ -0,0 +1,32 @@ +PShader blur; +boolean applyFilter = true; + +void setup() { + size(400, 400, P3D); + blur = (PShader)loadShader("blur.glsl"); + noStroke(); +} + +void draw() { + background(0); + lights(); + + translate(width/2, height/2); + pushMatrix(); + rotateX(frameCount * 0.01); + rotateY(frameCount * 0.01); + box(100); + popMatrix(); + + if (applyFilter) filter(blur); + + // The sphere doesn't have blur applied on it + // because it is drawn after filter() is called. + rotateY(frameCount * 0.02); + translate(150, 0); + sphere(40); +} + +void mousePressed() { + applyFilter = !applyFilter; +} diff --git a/java/libraries/opengl/examples/Shaders/BlurFilter/data/blur.glsl b/java/libraries/opengl/examples/Shaders/BlurFilter/data/blur.glsl new file mode 100644 index 000000000..2de90d3e8 --- /dev/null +++ b/java/libraries/opengl/examples/Shaders/BlurFilter/data/blur.glsl @@ -0,0 +1,43 @@ +uniform sampler2D textureSampler; +uniform vec2 texcoordOffset; + +varying vec4 vertColor; +varying vec4 vertTexcoord; + +#define KERNEL_SIZE 9 + +// Gaussian kernel +// 1 2 1 +// 2 4 2 +// 1 2 1 +float kernel[KERNEL_SIZE]; + +vec2 offset[KERNEL_SIZE]; + +void main(void) { + int i = 0; + vec4 sum = vec4(0.0); + + offset[0] = vec2(-texcoordOffset.s, -texcoordOffset.t); + offset[1] = vec2(0.0, -texcoordOffset.t); + offset[2] = vec2(texcoordOffset.s, -texcoordOffset.t); + + offset[3] = vec2(-texcoordOffset.s, 0.0); + offset[4] = vec2(0.0, 0.0); + offset[5] = vec2(texcoordOffset.s, 0.0); + + offset[6] = vec2(-texcoordOffset.s, texcoordOffset.t); + offset[7] = vec2(0.0, texcoordOffset.t); + offset[8] = vec2(texcoordOffset.s, texcoordOffset.t); + + kernel[0] = 1.0/16.0; kernel[1] = 2.0/16.0; kernel[2] = 1.0/16.0; + kernel[3] = 2.0/16.0; kernel[4] = 4.0/16.0; kernel[5] = 2.0/16.0; + kernel[6] = 1.0/16.0; kernel[7] = 2.0/16.0; kernel[8] = 1.0/16.0; + + for(i = 0; i < KERNEL_SIZE; i++) { + vec4 tmp = texture2D(textureSampler, vertTexcoord.st + offset[i]); + sum += tmp * kernel[i]; + } + + gl_FragColor = vec4(sum.rgb, 1.0) * vertColor; +} diff --git a/java/libraries/opengl/examples/Shaders/EdgeFilter/EdgeFilter.pde b/java/libraries/opengl/examples/Shaders/EdgeFilter/EdgeFilter.pde new file mode 100644 index 000000000..30a2c5a25 --- /dev/null +++ b/java/libraries/opengl/examples/Shaders/EdgeFilter/EdgeFilter.pde @@ -0,0 +1,11 @@ +PShader edges; + +void setup() { + size(400, 400, P2D); + edges = (PShader)loadShader("edges.glsl"); +} + +void draw() { + rect(mouseX, mouseY, 50, 50); + filter(edges); +} diff --git a/java/libraries/opengl/examples/Shaders/EdgeFilter/data/edges.glsl b/java/libraries/opengl/examples/Shaders/EdgeFilter/data/edges.glsl new file mode 100644 index 000000000..75c127b6b --- /dev/null +++ b/java/libraries/opengl/examples/Shaders/EdgeFilter/data/edges.glsl @@ -0,0 +1,43 @@ +uniform sampler2D textureSampler; +uniform vec2 texcoordOffset; + +varying vec4 vertColor; +varying vec4 vertTexcoord; + +#define KERNEL_SIZE 9 + +// Edge detection kernel +// -1 -1 -1 +// -1 +8 -1 +// -1 -1 -1 +float kernel[KERNEL_SIZE]; + +vec2 offset[KERNEL_SIZE]; + +void main(void) { + int i = 0; + vec4 sum = vec4(0.0); + + offset[0] = vec2(-texcoordOffset.s, -texcoordOffset.t); + offset[1] = vec2(0.0, -texcoordOffset.t); + offset[2] = vec2(texcoordOffset.s, -texcoordOffset.t); + + offset[3] = vec2(-texcoordOffset.s, 0.0); + offset[4] = vec2(0.0, 0.0); + offset[5] = vec2(texcoordOffset.s, 0.0); + + offset[6] = vec2(-texcoordOffset.s, texcoordOffset.t); + offset[7] = vec2(0.0, texcoordOffset.t); + offset[8] = vec2(texcoordOffset.s, texcoordOffset.t); + + kernel[0] = -1.0; kernel[1] = -1.0; kernel[2] = -1.0; + kernel[3] = -1.0; kernel[4] = 8.0; kernel[5] = -1.0; + kernel[6] = -1.0; kernel[7] = -1.0; kernel[8] = -1.0; + + for(i = 0; i < KERNEL_SIZE; i++) { + vec4 tmp = texture2D(textureSampler, vertTexcoord.st + offset[i]); + sum += tmp * kernel[i]; + } + + gl_FragColor = vec4(sum.rgb, 1.0) * vertColor; +}